dataPreprocess

catTrans

Description

L'action `catTrans` du set `dataPreprocess` est un outil fondamental en préparation de données (feature engineering). Elle permet de transformer des variables catégorielles en représentations numériques, ce qui est indispensable pour la plupart des algorithmes de machine learning. Cette action offre plusieurs stratégies, allant du simple regroupement de modalités rares (non supervisé) à des techniques d'encodage supervisées sophistiquées comme le 'Weight of Evidence' (WOE) ou le regroupement par arbre de décision, qui utilisent une variable cible pour créer des groupes optimaux.

dataPreprocess.catTrans result=results status=rc / arguments={{ contingencyTblOpts={{ inputsMethod="BUCKET" | "DISTINCTLEVELS" | "QUANTILE" | "RAW", inputsNLevels=integer, inputsRawLevelStartingValue=integer }}, maxNBins=integer, minNBins=integer, nBinsArray={integer-1, integer-2, ...} | integer, overrides={{ binMissing=TRUE | FALSE, emptyBins=TRUE | FALSE, enforceBinaryLevels=TRUE | FALSE, ivFactor=double, minNObsInBin=64-bit-integer, minPerNObsInBin=double, missingBinStats=TRUE | FALSE, missingEvalNonEvent=TRUE | FALSE, woeAdjust=double, woeDefinition="EVENT" | "NONEVENT" }}, preprocessRare=TRUE | FALSE, rareThreshold=integer, rareThresholdPercent=double, treeCrit="ENTROPY" | "GAINRATIO" | "GINI" | "RSS" }}, casOut={{ caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", "variable-name-2", ...}, label="string", lifetime=64-bit-integer, maxMemSize=64-bit-integer, memoryFormat="DVR" | "INHERIT" | "STANDARD", name="table-name", promote=TRUE | FALSE, replace=TRUE | FALSE, replication=integer, tableRedistUpPolicy="DEFER" | "NOREDIST" | "REBALANCE", threadBlockSize=64-bit-integer, timeStamp="string", where={"string-1", "string-2", ...} }}, casOutBinDetails={{ caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", "variable-name-2", ...}, label="string", lifetime=64-bit-integer, maxMemSize=64-bit-integer, memoryFormat="DVR" | "INHERIT" | "STANDARD", name="table-name", promote=TRUE | FALSE, replace=TRUE | FALSE, replication=integer, tableRedistUpPolicy="DEFER" | "NOREDIST" | "REBALANCE", threadBlockSize=64-bit-integer, timeStamp="string", where={"string-1", "string-2", ...} }}, casOutLevelBinMap={{ caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", "variable-name-2", ...}, label="string", lifetime=64-bit-integer, maxMemSize=64-bit-integer, memoryFormat="DVR" | "INHERIT" | "STANDARD", name="table-name", promote=TRUE | FALSE, replace=TRUE | FALSE, replication=integer, tableRedistUpPolicy="DEFER" | "NOREDIST" | "REBALANCE", threadBlockSize=64-bit-integer, timeStamp="string", where={"string-1", "string-2", ...} }}, code={{ casOut={{ caslib="string", compress=TRUE | FALSE, indexVars={"variable-name-1", "variable-name-2", ...}, label="string", lifetime=64-bit-integer, maxMemSize=64-bit-integer, memoryFormat="DVR" | "INHERIT" | "STANDARD", name="table-name", promote=TRUE | FALSE, replace=TRUE | FALSE, replication=integer, tableRedistUpPolicy="DEFER" | "NOREDIST" | "REBALANCE", threadBlockSize=64-bit-integer, timeStamp="string", where={"string-1", "string-2", ...} }}, comment=TRUE | FALSE, fmtWdth=integer, indentSize=integer, labelId=integer, lineSize=integer, noTrim=TRUE | FALSE, tabForm=TRUE | FALSE }}, copyAllVars=TRUE | FALSE, copyVars={"variable-name-1", "variable-name-2", ...}, distinctCountLimit=integer, evaluationStats=TRUE | FALSE, events={"string-1", "string-2", ...}, freq="variable-name", fuzzyCompare=double, includeInputVars=TRUE | FALSE, includeMissingGroup=TRUE | FALSE, inputs={{...}, {...}}, inputsInheritFormats=TRUE | FALSE, method="DTREE" | "GROUPRARE" | "ONEHOT" | "RTREE" | "WOE", outputTableOptions={{ forceTableReturn=TRUE | FALSE, tableNames={"string-1", "string-2", ...} }}, outVarsNamePrefix="string", outVarsNameSuffix="string", sasVarNameLength=TRUE | FALSE, table={...}, targets={{...}, {...}}, targetsInheritFormats=TRUE | FALSE, weight="variable-name" ;
Paramètres
ParamètreDescription
tableSpécifie la table CAS d'entrée à analyser. C'est le seul paramètre obligatoire.
inputsListe des variables catégorielles à transformer. Si non spécifié, toutes les variables de type caractère sont utilisées.
methodSpécifie la technique de transformation à utiliser. Les valeurs possibles sont 'GROUPRARE' (par défaut, regroupe les modalités rares), 'ONEHOT' (encodage 1-chaud), 'WOE' (Weight of Evidence, supervisé), 'DTREE' (arbre de décision, supervisé), 'RTREE' (arbre de régression, supervisé).
targetsListe des variables cibles à utiliser pour les méthodes d'encodage supervisées (WOE, DTREE, RTREE).
eventsSpécifie la valeur de la modalité 'événement' pour chaque variable cible binaire. Doit correspondre à la liste `targets`.
argumentsConteneur pour les options de configuration avancées de l'algorithme de regroupement.
arguments.preprocessRareSi TRUE, les modalités rares sont regroupées en une seule catégorie avant d'appliquer la méthode de regroupement principale. Utile pour nettoyer les données.
arguments.rareThresholdPercentDéfinit le seuil en pourcentage pour considérer une modalité comme 'rare'. Par défaut à 5% si `preprocessRare` est activé.
arguments.treeCritPour la méthode DTREE, spécifie le critère de division de l'arbre ('GINI', 'ENTROPY', 'GAINRATIO').
arguments.maxNBinsNombre maximum de groupes (bins) à créer pour les méthodes supervisées.
arguments.overridesConteneur pour les options globales qui peuvent surcharger les comportements par défaut, comme la gestion des valeurs manquantes (`binMissing`) ou l'ajustement du WOE (`woeAdjust`).
casOutSpécifie la table de sortie qui contiendra les données d'entrée avec les nouvelles variables transformées.
casOutBinDetailsSpécifie une table de sortie pour stocker les statistiques détaillées de chaque bin créé (ex: WOE, IV, nombre d'événements).
casOutLevelBinMapSpécifie une table de sortie pour stocker le mappage entre les modalités originales et les nouveaux bins.
codePermet de générer le code de scoring SAS DATA step dans une table CAS, pour une réutilisation facile.
copyVarsListe des variables de la table d'entrée à copier dans la table de sortie `casOut`.
outVarsNamePrefixSpécifie un préfixe à ajouter aux noms des nouvelles variables créées.
Préparation des Données Voir la fiche de ce code dataprep
Jeu de données de ventes pour les tests

Cette table `sales_data` contient des informations sur les ventes. `CustomerID` est un identifiant unique. `Product` est une variable catégorielle avec de nombreuses modalités, dont certaines sont rares. `Region` est une variable catégorielle simple. `Purchased` est une variable cible binaire (1 pour un achat, 0 sinon), utilisée pour les méthodes supervisées. `SaleCount` et `SaleValue` peuvent être utilisées comme variables de fréquence et de poids.

Copié !
1DATA casuser.sales_data;
2 INFILE DATALINES dlm=',';
3 INPUT CustomerID $ Product $ Region $ Purchased SaleCount SaleValue;
4 DATALINES;
5101,Laptop,East,1,1,1200
6102,Mouse,West,0,2,50
7103,Keyboard,West,1,1,75
8104,Laptop,East,0,1,1150
9105,Monitor,North,1,1,300
10106,Mouse,South,0,3,75
11107,Laptop,West,1,1,1300
12108,Webcam,East,0,5,250
13109,Monitor,South,1,2,600
14110,Keyboard,North,0,1,80
15111,Laptop,East,1,1,1250
16112,Mouse,West,1,1,25
17113,Headphones,South,0,4,300
18114,Laptop,North,1,1,1400
19115,Monitor,West,0,1,280
20116,Webcam,East,1,2,100
21117,Mouse,North,0,1,20
22118,Keyboard,South,1,1,90
23119,Laptop,West,0,1,1100
24120,Docking Station,East,1,1,150
25;
26RUN;

Exemples

Le 'One-Hot Encoding' est une technique non supervisée qui crée une nouvelle variable binaire (0 ou 1) pour chaque modalité unique de la variable d'entrée. C'est utile pour les algorithmes qui ne gèrent pas les variables catégorielles nativement. Ici, on transforme la variable `Region`.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.catTrans
3 TABLE={name='sales_data'},
4 method='ONEHOT',
5 inputs={{name='Region'}},
6 casOut={name='sales_onehot', replace=true},
7 copyVars={'CustomerID'};
8RUN;
9QUIT;
Résultat :
Une nouvelle table `sales_onehot` est créée dans la caslib de l'utilisateur. Elle contient `CustomerID` et de nouvelles colonnes binaires pour chaque région (par exemple, `cat_Region_East`, `cat_Region_West`, etc.), avec une valeur de 1 si l'observation appartient à cette région, 0 sinon.

Cette méthode non supervisée identifie les modalités d'une variable qui apparaissent rarement et les regroupe dans une seule catégorie '_RARE_'. C'est efficace pour réduire la cardinalité d'une variable avant modélisation. On utilise `rareThresholdPercent=15` pour définir comme 'rare' toute modalité représentant moins de 15% du total des observations. On utilise aussi `outVarsNamePrefix` pour préfixer la nouvelle variable.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.catTrans
3 TABLE='sales_data',
4 method='GROUPRARE',
5 inputs={{name='Product'}},
6 arguments={preprocessRare=true, rareThresholdPercent=15},
7 outVarsNamePrefix='grp',
8 copyVars={'CustomerID', 'Product'},
9 casOut={name='sales_grouped', replace=true};
10RUN;
11QUIT;
Résultat :
La table `sales_grouped` est créée. Elle contient `CustomerID`, `Product` et une nouvelle variable `grp_Product`. Les produits comme 'Webcam', 'Headphones', 'Docking Station' qui sont rares seront regroupés sous la modalité '_RARE_' dans la nouvelle colonne.

Le WOE est une technique d'encodage supervisée puissante pour les cibles binaires. Elle remplace chaque modalité par une valeur numérique qui représente le 'poids de la preuve' qu'elle apporte en faveur de l'événement. On utilise `Product` comme entrée et `Purchased` comme cible, en spécifiant `event='1'`. On active le calcul des statistiques d'évaluation (`evaluationStats=true`) et on gère les valeurs manquantes (s'il y en avait) avec `binMissing=true`. Les détails des bins sont sauvegardés dans `sales_woe_details`.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.catTrans
3 TABLE='sales_data',
4 method='WOE',
5 inputs={{name='Product'}},
6 targets={{name='Purchased'}},
7 events={'1'},
8 evaluationStats=true,
9 arguments={overrides={binMissing=true, woeAdjust=0.5}},
10 casOut={name='sales_woe', replace=true},
11 casOutBinDetails={name='sales_woe_details', replace=true},
12 copyVars={'CustomerID', 'Product', 'Purchased'};
13RUN;
14QUIT;
Résultat :
La table `sales_woe` contient une nouvelle colonne `cat_Product` avec les valeurs WOE. Une table `sales_woe_details` est également créée, contenant les statistiques détaillées pour chaque bin (groupe de produits), y compris le WOE et l'Information Value (IV), ce qui permet d'évaluer la puissance prédictive de la variable.

Cette méthode supervisée utilise un arbre de décision à un niveau pour regrouper les modalités de manière optimale par rapport à la cible. On utilise le critère `GINI` pour la séparation et on vise un maximum de 4 groupes (`maxNBins=4`). Cet exemple montre également comment générer le code de scoring SAS DATA step correspondant et le stocker dans une table CAS (`scoring_code_dtree`).

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 dataPreprocess.catTrans
3 TABLE='sales_data',
4 method='DTREE',
5 inputs={{name='Product'}},
6 targets={{name='Purchased'}},
7 events={'1'},
8 arguments={treeCrit='GINI', maxNBins=4},
9 code={casOut={name='scoring_code_dtree', replace=true}},
10 casOut={name='sales_dtree', replace=true};
11RUN;
12QUIT;
Résultat :
Une table `sales_dtree` avec la variable `Product` transformée en une nouvelle variable numérique représentant les groupes trouvés par l'arbre. Une autre table `scoring_code_dtree` est créée, contenant le code DATA step qui peut être utilisé pour appliquer cette même transformation dans d'autres environnements.

FAQ

Quelle est la fonction principale de l'action `catTrans` ?
Quelles sont les différentes méthodes de regroupement disponibles ?
Comment peut-on gérer les niveaux rares d'une variable ?
Quels paramètres sont nécessaires pour un regroupement supervisé comme `DTREE` ou `WOE` ?
Quels types de sorties peuvent être générés par cette action ?
À quoi sert l'action catTrans ?
Quelles sont les méthodes de regroupement disponibles avec catTrans ?
Qu'est-ce que la méthode 'DTREE' ?
Comment fonctionne la méthode 'GROUPRARE' ?
En quoi consiste la méthode 'ONEHOT' ?
Qu'est-ce que la méthode 'RTREE' ?
Comment la méthode 'WOE' fonctionne-t-elle ?
Comment gérer les valeurs manquantes avec l'action catTrans ?
Comment l'action catTrans gère-t-elle les niveaux rares ?
Peut-on générer du code de scoring SAS DATA step ?
Quel est l'objectif de l'action catTrans ?
Quelles sont les méthodes de regroupement disponibles avec le paramètre 'method' ?
Comment l'action catTrans gère-t-elle les niveaux rares d'une variable ?
Qu'est-ce que l'encodage one-hot (ONEHOT) dans cette action ?
Quelles sont les techniques de regroupement supervisé proposées par catTrans ?
Comment puis-je générer du code de scoring SAS DATA step avec l'action catTrans ?

Scénarios associés

Cas d'usage
Optimisation de Score de Crédit par Weight of Evidence (WOE)

Une banque souhaite développer un nouveau modèle de risque pour les demandes de crédit à la consommation. L'objectif est de transformer des variables catégorielles (Profession, ...

Cas d'usage
Gestion de Volumétrie et Modalités Rares en Retail

Une enseigne de grande distribution analyse les ventes par sous-catégorie de produits. Il existe des milliers de sous-catégories, dont beaucoup sont très rares (ventes anecdotiq...

Cas d'usage
Maintenance Industrielle : Gestion des Données Manquantes et One-Hot

Dans une usine connectée, des capteurs remontent des codes d'état. Souvent, en cas de panne réseau, le code d'état est manquant (NULL). Pour un algorithme de réseau de neurones,...