sampling

oversample

##set_sampling

Description

Échantillonne une proportion de données spécifiée par l'utilisateur à partir du niveau d'événement et ajuste le ratio entre les événements rares et non rares à un ratio spécifié par l'utilisateur. En gros, si vos données sont comme un champ de trèfles à quatre feuilles (événements rares) et de trèfles normaux, cette action vous aide à trouver plus facilement ces trèfles spéciaux en augmentant leur nombre dans votre échantillon. Malin, n'est-ce pas ?

Syntaxe Officielle
sampling.oversample
<result=results> <status=rc> /
applyRowOrder=TRUE | FALSE,
attributes={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, {...}},
diagnostics={eyecatcher="string"},
display={caseSensitive=TRUE | FALSE, exclude=TRUE | FALSE, excludeAll=TRUE | FALSE, keyIsPath=TRUE | FALSE, names={"string-1" <, "string-2", ...>}, pathType="LABEL" | "NAME", traceNames=TRUE | FALSE},
event="string",
eventProp=double,
freq="variable-name",
output={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", ...>}}, copyVars="ALL" | "ALL_NUMERIC" | {"variable-name-1" <, "variable-name-2", ...>}, freqName="string", partIndName="string", sampleFreqName="string"},
outputTables={groupByVarsRaw=TRUE | FALSE, includeAll=TRUE | FALSE, names={"string-1" <, "string-2", ...>} | {key-1={casouttable-1} <, key-2={casouttable-2}, ...>}, repeated=TRUE | FALSE, replace=TRUE | FALSE},
partInd=TRUE | FALSE,
sampPctEvt=double,
seed=64-bit-integer,
table={caslib="string", computedOnDemand=TRUE | FALSE, computedVars={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, {...}}, computedVarsProgram="string", dataSourceOptions={key-1=any-list-or-data-type-1 <, key-2=any-list-or-data-type-2, ...>}, groupBy={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, {...}}, groupByMode="NOSORT" | "REDISTRIBUTE", importOptions={fileType="ANY" | "AUDIO" | "AUTO" | "BASESAS" | "CSV" | "DELIMITED" | "DOCUMENT" | "DTA" | "ESP" | "EXCEL" | "FMT" | "HDAT" | "IMAGE" | "JMP" | "LASR" | "PARQUET" | "SOUND" | "SPSS" | "VIDEO" | "XLS", fileType-specific-parameters}, name="table-name", orderBy={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, {...}}, singlePass=TRUE | FALSE, where="where-expression", whereTable={casLib="string", dataSourceOptions={adls_noreq-parameters | bigquery-parameters | cas_noreq-parameters | clouddex-parameters | db2-parameters | dnfs-parameters | esp-parameters | fedsvr-parameters | gcs_noreq-parameters | hadoop-parameters | hana-parameters | impala-parameters | informix-parameters | jdbc-parameters | mongodb-parameters | mysql-parameters | odbc-parameters | oracle-parameters | path-parameters | postgres-parameters | redshift-parameters | s3-parameters | sapiq-parameters | sforce-parameters | singlestore_standard-parameters | snowflake-parameters | spark-parameters | spde-parameters | sqlserver-parameters | ss_noreq-parameters | teradata-parameters | vertica-parameters | yellowbrick-parameters}, importOptions={fileType="ANY" | "AUDIO" | "AUTO" | "BASESAS" | "CSV" | "DELIMITED" | "DOCUMENT" | "DTA" | "ESP" | "EXCEL" | "FMT" | "HDAT" | "IMAGE" | "JMP" | "LASR" | "PARQUET" | "SOUND" | "SPSS" | "VIDEO" | "XLS", fileType-specific-parameters}, name="table-name", vars={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}, {...}}, where="where-expression"}};

Paramètres Clés

Nom du paramètre Description
applyRowOrder Spécifie que l'action utilise un ordre de lignes prédéfini. Cela nécessite d'utiliser les paramètres 'orderby' et 'groupby' lors d'un appel préliminaire à l'action 'table.partition'.
Alias: reproducibleRowOrder
Valeur par défaut: FALSE
attributes Modifie les attributs des variables utilisées dans cette action. Actuellement, les attributs spécifiés pour les paramètres 'inputs' et 'nominals' sont ignorés. Pour plus d'informations, consultez le paramètre commun casinvardesc (Annexe A: Paramètres communs ).
Alias: attribute
diagnostics Ce paramètre fourmille de petits détails techniques pour les curieux. C'est un peu la boîte noire de l'action, là où tout est enregistré pour une meilleure compréhension !
diagnostics.eyecatcher Spécifie une chaîne entre guillemets qui sera préfixée à tout message associé à cet appel d'action.
display Spécifie une liste de tables de résultats à envoyer au client pour affichage. Pour plus d'informations, consultez le paramètre commun displayTables (Annexe A: Paramètres communs ).
event (Obligatoire) Spécifie le niveau d'événement rare. C'est le trèfle à quatre feuilles que vous cherchez !
eventProp (Obligatoire) Spécifie la proportion d'événements rares dans l'échantillon. C'est votre objectif pour la chasse aux trèfles rares. Gardez à l'esprit que cette valeur doit être comprise entre 0 (exclusif) et 1 (inclusif).
Plage: (0–1]
freq Spécifie la variable de fréquence facultative à utiliser dans l'échantillonnage ou le partitionnement.
output Crée une table sur le serveur qui contient l'échantillon ou la sortie de partition. L'OVERSAMPLEOutputStatement peut être une ou plusieurs des valeurs suivantes.
output.casOut (Obligatoire) Spécifie les paramètres d'une table de sortie. Pour plus d'informations, consultez le paramètre commun casouttable (Forme 1) (Annexe A: Paramètres communs ).
output.copyVars (Obligatoire) Spécifie une liste d'une ou plusieurs variables à copier de la table d'entrée vers la table de sortie. Vous pouvez également spécifier la valeur ALL, ALL_MODEL ou ALL_NUMERIC, qui copie respectivement toutes les variables, toutes les variables utilisées dans la modélisation ou toutes les variables numériques de la table d'entrée vers la table de sortie.
output.freqName Renomme la variable de fréquence réservée, qui par défaut est nommée _Freq_ dans la table de sortie. Cette variable est générée par la méthode de suréchantillonnage et est calculée comme le ratio de la proportion du niveau rare dans la population par rapport à sa proportion dans l'échantillon.
output.partIndName Renomme la variable d'indicateur de partition réservée, qui par défaut est nommée _PartInd_ dans la table de sortie. Cette variable indique si une observation est sélectionnée pour l'échantillon (1) ou non (0).
Alias: partName
output.sampleFreqName Renomme la variable de fréquence d'échantillon réservée, qui par défaut est nommée _SampleFreq_ dans la table de sortie. Cette variable indique la fréquence de chaque observation dans l'échantillon ou la partition.
outputTables Liste les noms des tables de résultats à enregistrer en tant que tables CAS sur le serveur. Pour plus d'informations, consultez le paramètre commun outputTables (Annexe A: Paramètres communs ).
Alias: displayOut
partInd Lorsque la valeur est True, génère une colonne d'indicateur de partition dans la table de données de sortie.
Alias: partition
Valeur par défaut: FALSE
sampPctEvt (Obligatoire) Spécifie le pourcentage d'échantillonnage à partir du niveau d'événement. Il doit être entre 0 (exclusif) et 100 (inclusif). N'oubliez pas que c'est un pourcentage !
Plage: (0–100]
seed Spécifie un entier à utiliser pour démarrer le générateur de nombres pseudo-aléatoires. Une graine pour faire pousser de bons échantillons reproductibles !
Valeur par défaut: 0
Valeur maximale: 2147483647
table (Obligatoire) Spécifie la table de données d'entrée. C'est de là que vous allez cueillir vos trèfles.
Forme longue: table={name="table-name"}
Forme abrégée: table="table-name"
table.caslib Spécifie la caslib pour la table d'entrée que vous souhaitez utiliser avec l'action. Par défaut, la caslib active est utilisée. Spécifiez une valeur uniquement si vous devez accéder à une table depuis une caslib différente.
table.computedOnDemand Lorsque la valeur est True, crée les variables calculées lorsque la table est chargée plutôt qu'au début de l'action.
Alias: compOnDemand
Valeur par défaut: FALSE
table.computedVars Spécifie les noms des variables calculées à créer. Spécifiez une expression pour chaque variable dans le paramètre computedVarsProgram. Si vous ne spécifiez pas ce paramètre, toutes les variables de computedVarsProgram sont automatiquement incluses.
Alias: compVars
table.computedVars.format Spécifie le format à appliquer à la variable.
table.computedVars.formattedLength Spécifie la longueur du champ de format plus la longueur de la précision du format.
table.computedVars.label Spécifie l'étiquette descriptive de la variable.
table.computedVars.name (Obligatoire) Spécifie le nom de la variable.
table.computedVars.nfd Spécifie la longueur de la précision du format.
table.computedVars.nfl Spécifie la longueur du champ de format.
table.computedVarsProgram Spécifie une expression pour chaque variable calculée que vous incluez dans le paramètre computedVars.
Alias: compPgm
table.dataSourceOptions Spécifie les options de la source de données.
Aliases: options, dataSource
table.groupBy Spécifie les noms des variables à utiliser pour regrouper les résultats. C'est un peu comme trier vos trèfles par taille ou par couleur avant de les compter.
table.groupBy.format Spécifie le format à appliquer à la variable.
table.groupBy.formattedLength Spécifie la longueur du champ de format plus la longueur de la précision du format.
table.groupBy.label Spécifie l'étiquette descriptive de la variable.
table.groupBy.name (Obligatoire) Spécifie le nom de la variable.
table.groupBy.nfd Spécifie la longueur de la précision du format.
table.groupBy.nfl Spécifie la longueur du champ de format.
table.groupByMode Spécifie comment créer des groupes. C'est la méthode de tri de vos trèfles.
Valeur par défaut: NOSORT
table.groupByMode.NOSORT Regroupe les données sans trier sur chaque machine, puis regroupe les données à nouveau sur le contrôleur.
table.groupByMode.REDISTRIBUTE Transfère les lignes entre les nœuds pour garantir l'ordre au sein des groupes. Cette méthode est plus lente, mais oh combien précise !
table.importOptions Spécifie les paramètres pour la lecture d'une table à partir d'une source de données. Pour plus d'informations, consultez le paramètre commun importOptions (Annexe A: Paramètres communs ).
Alias: import
table.name (Obligatoire) Spécifie le nom de la table d'entrée.
table.orderBy Spécifie les variables à utiliser pour ordonner les observations au sein des partitions. Ce paramètre s'applique aux tables partitionnées, ou il peut être combiné avec des variables spécifiées dans le paramètre groupBy lorsque la valeur du paramètre groupByMode est définie sur REDISTRIBUTE. C'est comme organiser vos trèfles en rangées parfaites.
table.orderBy.format Spécifie le format à appliquer à la variable.
table.orderBy.formattedLength Spécifie la longueur du champ de format plus la longueur de la précision du format.
table.orderBy.label Spécifie l'étiquette descriptive de la variable.
table.orderBy.name (Obligatoire) Spécifie le nom de la variable.
table.orderBy.nfd Spécifie la longueur de la précision du format.
table.orderBy.nfl Spécifie la longueur du champ de format.
table.singlePass Lorsque la valeur est True, ne crée pas de table transitoire sur le serveur. Définir ce paramètre sur True peut être efficace, mais les données pourraient ne pas avoir un ordre stable lors d'exécutions répétées. Un peu comme si vos trèfles étaient trop pressés pour se mettre en ligne !
Valeur par défaut: FALSE
table.where Spécifie une expression pour sous-ensemble les données d'entrée.
table.whereTable Spécifie une table d'entrée qui contient des lignes à utiliser comme filtre WHERE. Si le paramètre vars n'est pas spécifié, tous les noms de variables communs à la table d'entrée et à la table de filtrage sont utilisés pour trouver les lignes correspondantes. Si le paramètre where pour la table d'entrée et ce paramètre sont spécifiés, cette table de filtrage est appliquée en premier.
table.whereTable.casLib Spécifie la caslib pour la table de filtre. Par défaut, la caslib active est utilisée.
table.whereTable.dataSourceOptions Spécifie les options de la source de données. Pour plus d'informations, consultez le paramètre commun dataSourceOptions (Annexe A: Paramètres communs ).
Aliases: options, dataSource
table.whereTable.importOptions Spécifie les paramètres de lecture d'une table à partir d'une source de données. Pour plus d'informations, consultez le paramètre commun importOptions (Annexe A: Paramètres communs ).
Alias: import
table.whereTable.name (Obligatoire) Spécifie le nom de la table de filtre.
table.whereTable.vars Spécifie les noms des variables à utiliser à partir de la table de filtre.
table.whereTable.vars.format Spécifie le format à appliquer à la variable.
table.whereTable.vars.formattedLength Spécifie la longueur du champ de format plus la longueur de la précision du format.
table.whereTable.vars.label Spécifie l'étiquette descriptive de la variable.
table.whereTable.vars.name (Obligatoire) Spécifie le nom de la variable.
table.whereTable.vars.nfd Spécifie la longueur de la précision du format.
table.whereTable.vars.nfl Spécifie la longueur du champ de format.
table.whereTable.where Spécifie une expression pour sous-ensemble les données de la table de filtre.

Préparation des données

Création de données pour l'exemple

Imaginez que vous avez un jeu de données où un événement est très rare, comme trouver un diamant dans une mine de charbon. Pour mieux étudier ces diamants, vous voulez les rendre un peu moins rares dans votre échantillon. Nous allons créer un jeu de données simple où la variable 'target' contient des événements rares ('Rare') et des événements fréquents ('Frequent').

1DATA mycas.input_data;
2 call streaminit(123);
3 DO i = 1 to 1000;
4 IF rand('UNIFORM') < 0.05 THEN target = 'Rare';
5 ELSE target = 'Frequent';
6 OUTPUT;
7 END;
8RUN;
9PROC CASUTIL incaslib='casuser' outcaslib='casuser';
10 load DATA=mycas.input_data replace;
11RUN;
12PROC PRINT DATA=mycas.input_data(obs=10);
13RUN;

Exemples d'utilisation

Suréchantillonnage d'un événement rare

Cet exemple simple montre comment utiliser l'action 'oversample' pour augmenter la proportion d'un événement rare ('Rare') dans une table. Nous voulons que les 'Rare' événements représentent 30% de notre nouvel échantillon, même s'ils étaient bien moins nombreux au départ. C'est comme donner un coup de pouce à nos trèfles à quatre feuilles !

Nous allons suréchantillonner la table 'input_data' et créer une nouvelle table 'oversampled_data' avec la proportion ajustée. On ne copie que la variable 'target' pour garder ça simple, et on inclut un indicateur de partition pour voir qui a été sélectionné pour l'échantillon, et aussi la fréquence d'échantillonnage.

1PROC CAS;
2 LOADACTIONSET 'sampling';
3 sampling.oversample RESULT=r /
4 TABLE={name='input_data'},
5 event='Rare',
6 eventProp=0.30,
7 partInd=TRUE,
8 OUTPUT={casOut={name='oversampled_data', replace=TRUE},
9 copyVars={'target'},
10 sampleFreqName='SampleWeight'};
11 PRINT r;
12RUN;
13PROC FREQ DATA=mycas.oversampled_data;
14 weight SampleWeight;
15 TABLE target;
16RUN;
Suréchantillonnage avec un seuil de pourcentage et une graine aléatoire

Dans cet exemple, nous allons suréchantillonner nos événements rares ('Rare') pour qu'ils représentent 20% de notre échantillon final. Nous utilisons 'sampPctEvt' qui est une autre façon de spécifier la proportion d'événements rares, mais en pourcentage (c'est plus parlant pour certains !). Pour s'assurer que si vous exécutez le code plusieurs fois, vous obtenez toujours le même résultat (pour des raisons de reproductibilité, c'est très important en science des données), nous allons utiliser une 'seed' (graine aléatoire) de 42. C'est le numéro magique de l'univers, alors pourquoi pas pour nos échantillons ?

Nous allons également copier toutes les variables numériques, et renommer les colonnes de fréquence d'échantillon et d'indicateur de partition pour les rendre plus explicites.

1PROC CAS;
2 LOADACTIONSET 'sampling';
3 sampling.oversample RESULT=r /
4 TABLE={name='input_data'},
5 event='Rare',
6 sampPctEvt=20, /* 20% d'événements rares dans l'échantillon */
7 seed=42, /* Pour la reproductibilité des résultats */
8 partInd=TRUE,
9 OUTPUT={casOut={name='oversampled_data_detailed', replace=TRUE},
10 copyVars='ALL_NUMERIC',
11 freqName='AdjustedFreq',
12 partIndName='IsSampled',
13 sampleFreqName='FinalSampleWeight'};
14 PRINT r;
15RUN;
16PROC FREQ DATA=mycas.oversampled_data_detailed;
17 weight FinalSampleWeight;
18 TABLE target;
19RUN;
20PROC PRINT DATA=mycas.oversampled_data_detailed(obs=20);
21RUN;