sampling

kfold

##set_sampling

Description

L'action `kfold` (issue de l'ensemble d'actions Sampling and Partitioning) permet de diviser une table de données en `k` sous-ensembles (folds ou plis) de taille approximativement égale. C'est l'outil indispensable pour l'apprentissage automatique (Machine LearningBranche de l'IA utilisant des algorithmes pour apprendre des modèles à partir de données. Il permet d'automatiser des prédictions ou des décisions sans programmation explicite de chaque règle.) lors d'une validation croisée ! Un petit coup de dés avec le paramètre `seed` et le hasard fait bien les choses, tout en restant parfaitement reproductible.

Syntaxe Officielle
proc cas;
sampling.kfold /
table={name="table_name", caslib="caslib_name", groupBy={"var1"}}
k=5
seed=12345
output={casOut={name="out_table", replace=true}, copyVars="ALL", foldName="_Fold_"};
run;
quit;

Paramètres Clés

Nom du paramètre Description
table Spécifie la table de données en entrée. C'est ici que vous pouvez indiquer des filtres (`where`) ou réaliser une stratification via le paramètre `groupBy` .
k Définit le nombre de partitions (les fameux 'folds'). La valeur par défaut est 5, et la valeur minimale requise est 2.
seed Graine pour le générateur de nombres pseudo-aléatoires (entier 64 bits). Indispensable pour obtenir exactement les mêmes plis à chaque exécution de votre code.
output Définit la table de sortie contenant les données partitionnées. Il est obligatoire d'y spécifier `casOut` et `copyVars`.
applyRowOrder Si défini sur True, force l'action à utiliser un ordre de lignes prédéfini (nécessite l'utilisation préalable de `orderby` et `groupby` dans une action `table.partition`).
display Permet de spécifier une liste de tables de résultats à renvoyer au client pour affichage (comme les statistiques de partitionnement).
outputTables Liste les noms des tables de résultats (statistiques, logs) à sauvegarder directement en tant que tables CAS sur le serveur.

Préparation des données

Création d'une table de test

Générons une petite table de clients en mémoire CAS pour s'amuser avec le partitionnement k-fold.

1PROC CAS; TABLE.addtable / caslib="casuser" name="clients" replace=true records={{id=1, age=25, segment="A"}, {id=2, age=34, segment="B"}, {id=3, age=45, segment="A"}, {id=4, age=22, segment="C"}, {id=5, age=59, segment="B"}, {id=6, age=31, segment="A"}, {id=7, age=40, segment="C"}, {id=8, age=29, segment="B"}, {id=9, age=48, segment="A"}, {id=10, age=37, segment="B"}}; RUN; QUIT;

Exemples d'utilisation

Partitionnement K-Fold basique

L'objectif est de diviser la table en 3 folds aléatoires (`k=3`) en conservant toutes les variables et en nommant la colonne contenant l'identifiant du fold '_Fold_'.

1PROC CAS; sampling.kfold / TABLE={name="clients", caslib="casuser"} k=3 seed=12345 OUTPUT={casOut={name="clients_kfold", caslib="casuser", replace=true}, copyVars="ALL", foldName="_Fold_"}; RUN; QUIT;
Résultat Attendu :
Génère une table 'clients_kfold' où chaque observation s'est vu attribuer aléatoirement une valeur de 1, 2 ou 3 dans une nouvelle colonne nommée `_Fold_`.
K-Fold stratifié par segment

Cette fois-ci, on va un peu plus loin : on groupe par `segment` pour s'assurer que la répartition k-fold est bien équilibrée à l'intérieur de chaque segment (stratification). De plus, on demande explicitement de ne copier que les variables numériques dans la table de sortie.

1PROC CAS; sampling.kfold / TABLE={name="clients", caslib="casuser", groupBy={"segment"}} k=5 seed=802 OUTPUT={casOut={name="clients_kfold_strat", caslib="casuser", replace=true}, copyVars="ALL_NUMERIC", foldName="Fold_ID"}; RUN; QUIT;
Résultat Attendu :
Crée une table partitionnée en 5 plis de manière stratifiée. La table de sortie 'clients_kfold_strat' ne contiendra que les variables numériques de départ (id, age) ainsi que la nouvelle colonne de partitionnement nommée 'Fold_ID'.