fairAITools

mitigateBiasNeuralNet

##set_fairaitools

Description

L'action `mitigateBiasNeuralNet` permet d'atténuer les biais dans les modèles de réseaux de neurones (Neural Networks). C'est un peu comme donner des lunettes d'impartialité à votre IA pour éviter qu'elle ne prenne des mauvaises habitudes ! Elle fait partie de l'action setGemini said

Groupe logique de fonctionnalités CAS (Cloud Analytic Services) contenant des actions spécifiques (statistiques, data mining, etc.) pour traiter les données en mémoire de manière optimisée.
`fairAIToolsAction set de SAS Viya dédiée à l'équité en IA. Elle permet de détecter et d'atténuer les biais algorithmiques dans les modèles afin de garantir des décisions justes et éthiques.` et travaille en ajustant de manière itérative les poids ou 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 respecter des métriques d'équité spécifiques (parité démographique, égalité des chances, etc.).

Syntaxe Officielle
proc cas;
fairAITools.mitigateBiasNeuralNet /
mitigateOptions={biasMetric="PREDICTIVEPARITY", bound=100, event="valeur", learningRate=0.01, logLevel=1, maxIters=10, predictedVariables={{name="var_pred"}}, responseLevels={"niveau1", "niveau2"}, seed=0, sensitiveVariable={name="var_sensible"}, tolerance=0.005, tuneBound=FALSE}
scoreOptions={...}
trainOptions={...};
quit;

Paramètres Clés

Nom du paramètre Description
mitigateOptions Requis. Spécifie une liste de paramètres pour ajuster le comportement de l'algorithme d'atténuation. C'est ici que la magie opère pour rendre le modèle plus juste.
biasMetric Type de mesure de biais à utiliser. Valeurs possibles : 'DEMOGRAPHICPARITY', 'EQUALIZEDODDS', 'EQUALOPPORTUNITY', 'PREDICTIVEPARITY'. Par défaut : 'PREDICTIVEPARITY'.
bound Valeur limite (bound) pour l'algorithme de réduction de gradient exponentié. Valeur minimale : 1. Par défaut : 100.
event La chaîne de caractères (valeur formatée) de la variable cible qui représente l'événement d'intérêt (la cible positive à prédire).
learningRate Taille du pas (step size) pour la mise à jour de l'algorithme de réduction de gradient exponentié. Compris entre 0 et 1. Par défaut : 0.01.
logLevel Niveau de détail du journal de bord (0 à 7). Plus c'est haut, plus l'action est bavarde ! Par défaut : 1.
maxIters Nombre maximum d'itérations (1 à 50) pour l'algorithme. Par défaut : 10.
predictedVariables Liste des variables contenant les prédictions du modèle. L'ordre doit scrupuleusement correspondre à celui spécifié dans `responseLevels`.
responseLevels Liste des valeurs possibles (niveaux) de la variable cible. Si le paramètre `event` est omis, la toute première valeur de cette liste sera considérée comme l'événement cible.
seed Graine pour le générateur de nombres aléatoires. Mettez une valeur > 0 pour des résultats reproductibles d'un run à l'autre, sinon c'est la loterie de l'horloge système ! Par défaut : 0.
sensitiveVariable Requis (dans mitigateOptions). Indique la variable sensible (ex: Genre, Origine) à utiliser pour les calculs de biais. Indispensable pour cibler l'équité.
tolerance Tolérance de violation de la contrainte de parité (compris entre 0 et 1). Si fixé à 0, le modèle s'entraîne obligatoirement jusqu'au nombre maximal d'itérations (`maxIters`). Par défaut : 0.005.
tuneBound Si défini sur TRUE, spécifie que la valeur limite (bound) doit être ajustée/optimisée automatiquement. Par défaut : FALSE.
scoreOptions Paramètres qui seront passés en interne à l'action `score` de l'action set `astore`.
trainOptions Requis. Paramètres qui seront transmis à l'action `annTrain` de l'action set `neuralNet` pour l'entraînement du réseau de neurones.

Préparation des données

Création des données d'entraînement

Générons un jeu de données fictif pour simuler l'octroi d'un crédit bancaire, en incluant une variable sensible (le Genre) pour tester notre algorithme d'équité.

1DATA mycas.credit_data;
2 call streaminit(12345);
3 DO i = 1 to 1000;
4 IF rand("Uniform") < 0.5 THEN Genre = "Femme"; ELSE Genre = "Homme";
5 Revenu = rand("Normal", 50000, 15000);
6 Age = floor(rand("Uniform") * 40) + 20;
7 /* Introduction volontaire d'un léger biais favorisant les Hommes pour l'exemple */
8 IF Genre = "Homme" THEN score = (Revenu/1000) + Age + rand("Normal", 0, 10) + 10;
9 ELSE score = (Revenu/1000) + Age + rand("Normal", 0, 10);
10 IF score > 80 THEN Octroi_Credit = 1;
11 ELSE Octroi_Credit = 0;
12 OUTPUT;
13 END;
14RUN;

Exemples d'utilisation

Atténuation de biais basique sur un réseau de neurones

Entraînement d'un modèle de réseau de neurones tout en atténuant le biais lié à la variable `Genre` selon la métrique de parité démographique (`DEMOGRAPHICPARITY`).

1PROC CAS;
2 fairAITools.mitigateBiasNeuralNet /
3 mitigateOptions={
4 biasMetric="DEMOGRAPHICPARITY",
5 event="1",
6 responseLevels={"1", "0"},
7 sensitiveVariable={name="Genre"},
8 maxIters=5
9 }
10 trainOptions={
11 TABLE={name="credit_data"},
12 target="Octroi_Credit",
13 inputs={"Revenu", "Age"},
14 nomics={"Genre", "Octroi_Credit"},
15 hidden={5, 5},
16 seed=12345
17 };
18QUIT;
Résultat Attendu :
Le modèle de réseau de neurones est entraîné en appelant en arrière-plan `annTrain`. L'algorithme d'atténuation ajuste les itérations pour s'assurer que la proportion d'octrois de crédit prédits est statistiquement équilibrée entre les Hommes et les Femmes.
Atténuation poussée avec ajustement de la limite (tuneBound) et sauvegarde du scoring

Un exemple complet où l'on demande à l'algorithme d'optimiser la limite (`tuneBound=TRUE`), en ciblant l'égalité des opportunités (`EQUALOPPORTUNITY`). On utilise également `scoreOptions` pour exporter la table finale scorée.

1PROC CAS;
2 fairAITools.mitigateBiasNeuralNet RESULT=res /
3 mitigateOptions={
4 biasMetric="EQUALOPPORTUNITY",
5 bound=50,
6 tuneBound=TRUE,
7 event="1",
8 learningRate=0.05,
9 logLevel=3,
10 maxIters=15,
11 responseLevels={"1", "0"},
12 seed=9876,
13 sensitiveVariable={name="Genre"},
14 tolerance=0.001
15 }
16 trainOptions={
17 TABLE={name="credit_data"},
18 target="Octroi_Credit",
19 inputs={"Revenu", "Age"},
20 nomics={"Genre", "Octroi_Credit"},
21 hidden={10},
22 acts={"RELU"},
23 seed=12345,
24 casOut={name="nn_model_weights", replace=True}
25 }
26 scoreOptions={
27 out={name="scored_credit_data", replace=True},
28 copyVars={"Genre", "Octroi_Credit"}
29 };
30 PRINT res;
31QUIT;
Résultat Attendu :
L'action génère un réseau de neurones optimisé pour l'équité. Les journaux de logs afficheront beaucoup plus de détails sur la convergence (`logLevel=3`). Les poids du modèle corrigé sont sauvegardés dans `nn_model_weights`, et une table `scored_credit_data` contenant les prédictions finales (et les variables d'origine pour comparaison) est mise à disposition.