mitigateBiasNeuralNet
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.).
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é.
| 1 | DATA 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; |
| 14 | RUN; |
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`).
| 1 | PROC 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 | }; |
| 18 | QUIT; |
Résultat Attendu :
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.
| 1 | PROC 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; |
| 31 | QUIT; |