mitigateBiasForest
Description
L'action `mitigateBiasForest` permet d'atténuer les biais dans les modèles de type forêt aléatoireAlgorithme d'apprentissage supervisé combinant plusieurs arbres de décision indépendants pour améliorer la précision et réduire le surapprentissage par agrégation de leurs prédictions. (Random ForestAlgorithme d'apprentissage supervisé combinant plusieurs arbres de décision indépendants pour améliorer la précision et réduire le surapprentissage via le bagging et la sélection aléatoire.). Elle ajuste les prédictions du modèleReprésentation mathématique entraînée sur des données pour capturer des tendances, prédire des résultats ou classifier des observations via des algorithmes (Régression, Forêt aléatoire, Gradient Boosting). pour le rendre plus équitable vis-à-vis d'une variable sensible (comme le genre ou l'âge), tout en s'efforçant de préserver au maximum sa précision globale. C'est un peu comme donner des lunettes d'impartialité à votre algorithme, pour qu'il arrête de faire des favoris ! Vous pouvez choisir la métrique d'équité à optimiser, référencée dans la documentation officielle .
Paramètres Clés
| Nom du paramètre | Description |
|---|---|
| mitigateOptions | Liste des paramètres (requis) permettant d'ajuster le comportement de l'algorithme d'atténuation. C'est ici que la magie opère ! |
| mitigateOptions.biasMetric | Type de mesure de biais à évaluer et corriger. Par défaut : PREDICTIVEPARITY. |
| mitigateOptions.bound | Valeur limite pour l'algorithme de réduction du gradient exponentiel. Par défaut : 100. |
| mitigateOptions.event | Valeur formatée de la variable cible qui représente l'événement d'intérêt (la classe positive). |
| mitigateOptions.learningRate | Taille du pas (learning rate) pour la mise à jour de l'algorithme. Par défaut : 0.01. |
| mitigateOptions.logLevel | Niveau de détail des informations imprimées dans le journal (0 à 7). Plus la valeur est élevée, plus le log est bavard. Par défaut : 1. |
| mitigateOptions.maxIters | Nombre maximum d'itérations pour l'algorithme d'atténuation. Par défaut : 10. |
| mitigateOptions.predictedVariables | Variables contenant les probabilités prédites par le modèle. L'ordre doit impérativement correspondre à celui de responseLevels. |
| mitigateOptions.responseLevels | Liste des valeurs formatées de la variable cible. Si l'argument 'event' est omis, la première valeur est considérée comme l'événement. |
| mitigateOptions.seed | Graine pour le générateur de nombres aléatoires. Fixez-la pour des résultats reproductibles. |
| mitigateOptions.sensitiveVariable | Nom de la variable sensible (ex: âge, origine, sexe) sur laquelle le biais est mesuré et corrigé. REQUIS. |
| mitigateOptions.tolerance | Tolérance pour la violation de la contrainte de parité. S'il est à 0, le modèle fera son maximum d'itérations. Par défaut : 0.005. |
| mitigateOptions.tuneBound | Spécifie s'il faut ajuster automatiquement la valeur limite (bound). Vrai (True) ou Faux (False). Par défaut : False. |
| scoreOptions | Options spécifiques passées à l'action de scoring (issue de l'action set 'astore'). |
| trainOptions | Options spécifiques (requises) passées à l'action 'forestTrain' (issue de l'action set 'decisionTree') pour l'entraînement du modèle initial. |
Préparation des données
Création des données simulées
Nous générons une table CAS contenant des données d'approbation de prêt biaisées, avec une variable cible `Approved`, une variable sensible `Gender` et quelques prédicteurs.
| 1 | PROC CAS; |
| 2 | SESSION casauto; |
| 3 | dataStep.runCode / |
| 4 | code="data casuser.loan_data; |
| 5 | call streaminit(12345); |
| 6 | do i = 1 to 1000; |
| 7 | if rand('uniform') < 0.5 then Gender = 'Male'; else Gender = 'Female'; |
| 8 | Income = round(rand('normal', 50000, 15000)); |
| 9 | CreditScore = round(rand('normal', 650, 100)); |
| 10 | /* Introduction d'un biais artificiel en faveur des 'Male' */ |
| 11 | prob = 1 / (1 + exp(-(-10 + Income*0.0001 + CreditScore*0.01 + (Gender='Male')*1.5))); |
| 12 | IF rand('uniform') < prob THEN Approved = 'Yes'; ELSE Approved = 'No'; |
| 13 | OUTPUT; |
| 14 | END; |
| 15 | RUN;"; |
| 16 | RUN; |
| 17 | QUIT; |
Exemples d'utilisation
Atténuation de biais simple (Parité Démographique)
Entraînement d'un modèle de forêt aléatoire et atténuation du biais de genre en ciblant la métrique de parité démographique.
| 1 | PROC CAS; |
| 2 | fairAITools.mitigateBiasForest / |
| 3 | mitigateOptions={ |
| 4 | biasMetric="DEMOGRAPHICPARITY", |
| 5 | event="Yes", |
| 6 | predictedVariables={{name="P_ApprovedYes"}, {name="P_ApprovedNo"}}, |
| 7 | responseLevels={"Yes", "No"}, |
| 8 | sensitiveVariable={name="Gender"} |
| 9 | }, |
| 10 | trainOptions={ |
| 11 | TABLE={name="loan_data", caslib="casuser"}, |
| 12 | target="Approved", |
| 13 | inputs={"Income", "CreditScore", "Gender"}, |
| 14 | nominals={"Approved", "Gender"}, |
| 15 | casOut={name="forest_model", replace=true} |
| 16 | }, |
| 17 | scoreOptions={ |
| 18 | TABLE={name="loan_data", caslib="casuser"}, |
| 19 | casOut={name="scored_data", replace=true} |
| 20 | }; |
| 21 | RUN; |
| 22 | QUIT; |
Résultat Attendu :
Contrôle avancé de l'atténuation (Equalized Odds)
Utilisation poussée avec ajustement de la limite (`tuneBound`), taux d'apprentissage personnalisé et exigence forte en matière de tolérance (0.001) pour équilibrer les chances (Vrais positifs et Faux positifs).
| 1 | PROC CAS; |
| 2 | fairAITools.mitigateBiasForest / |
| 3 | mitigateOptions={ |
| 4 | biasMetric="EQUALIZEDODDS", |
| 5 | bound=50, |
| 6 | tuneBound=TRUE, |
| 7 | event="Yes", |
| 8 | learningRate=0.05, |
| 9 | logLevel=3, |
| 10 | maxIters=20, |
| 11 | predictedVariables={{name="P_ApprovedYes"}, {name="P_ApprovedNo"}}, |
| 12 | responseLevels={"Yes", "No"}, |
| 13 | seed=98765, |
| 14 | sensitiveVariable={name="Gender"}, |
| 15 | tolerance=0.001 |
| 16 | }, |
| 17 | trainOptions={ |
| 18 | TABLE={name="loan_data", caslib="casuser"}, |
| 19 | target="Approved", |
| 20 | inputs={"Income", "CreditScore", "Gender"}, |
| 21 | nominals={"Approved", "Gender"}, |
| 22 | ntree=50, |
| 23 | casOut={name="forest_model_advanced", replace=true} |
| 24 | }, |
| 25 | scoreOptions={ |
| 26 | TABLE={name="loan_data", caslib="casuser"}, |
| 27 | copyVars={"Gender", "Approved"}, |
| 28 | casOut={name="scored_data_advanced", replace=true} |
| 29 | }; |
| 30 | RUN; |
| 31 | QUIT; |