Le nœud d'échantillonnage est utilisé pour l'échantillonnage avec SPSS Modeler. Je vais expliquer ce nœud d'échantillonnage et le réécrire avec des pandas Python.
Il existe deux types d'échantillonnage: (1) l'échantillonnage simple et (2) l'échantillonnage complexe qui reflète les tendances des données. Dernière fois a expliqué ① échantillonnage simple. Cette fois, j'expliquerai (2) l'échantillonnage compliqué.
Effectuer pour les données POS suivantes avec ID. Nous utilisons des données PDV attachées à une pièce d'identité qui enregistrent qui (CUSTID) a acheté quand (SDATE) et quoi (PRODUCTID, classification principale du produit L_CLASS, classification intermédiaire du produit M_CLASS) et combien (SOUS-TOTAL).
Il y a 28 599 cas dans 6 domaines.
L'échantillonnage aléatoire est une méthode d'échantillonnage qui peut refléter les tendances de toutes les données s'il y a suffisamment d'enregistrements. Cependant, certaines données peuvent avoir un biais important dans la distribution et n'existent que dans une petite proportion. Ces données peuvent ne pas être en mesure de refléter la tendance si le nombre d'échantillons est petit.
Par exemple, regardons la distribution de M_CLASS (classification en produits) de ces données. Le nombre de ventes de SHOES01 est de 631 fois, soit 2,21% du total, donc ce n'est pas grand.
En regardant la distribution de M_CLASS (classification dans le produit) à la suite d'un échantillonnage à 0,2%, SHOES01 a disparu. En outre, d'autres éléments sont différents de la distribution d'origine.
À l'origine, dans un tel cas, le nombre d'échantillons devrait être augmenté, mais s'il n'y a pas d'autre choix que de faire un petit échantillonnage pour les données de vérification, etc., un échantillonnage stratifié peut être utilisé.
Il s'agit d'une méthode d'échantillonnage des données séparément pour chaque couche. Dans cet exemple, il s'agira d'une image échantillonnée pour chaque classification intermédiaire de M_CLASS (classification en produits).
L'échantillonnage en couches est également effectué au niveau du nœud d'échantillonnage. La méthode d'échantillonnage est "complexe". Spécifiez ensuite la taille de l'échantillon. Ici, 0,002 (0,2%) est spécifié. Vous pouvez ensuite spécifier des variables en couches en cliquant sur le bouton Cluster and Hierarchy. Ici, M_CLASS (classification dans le produit) est spécifiée comme variable stratifiée.
De plus, le réglage de la graine aléatoire est vérifié afin que l'échantillonnage puisse être reproduit.
Le résultat a une colonne appelée SampleWeight, qui écrit les poids utilisés en interne lors de l'échantillonnage. Vous pouvez voir que les valeurs sont les mêmes pour chaque M_CLASS. Il n'est généralement pas nécessaire, vous pouvez donc le supprimer avec le nœud de filtre.
En regardant la distribution de M_CLASS (classification en produits) à la suite de l'échantillonnage, il y a SHOES01, qui est proche de la distribution d'origine pour tous les cas.
Notez que le refoulement SQL ne fonctionne pas pour l'échantillonnage stratifié. Il devient violet et semble rechercher des caractères vides dans les colonnes en couches, mais l'échantillonnage lui-même n'a pas été converti en SQL.
Utilisez les fonctions groupby et sample pour obtenir un échantillonnage en couches avec des pandas. Tout d'abord, groupez par «M_CLASS». group_keys = False n'est pas multi-indexé.
Ensuite, un échantillonnage aléatoire à 0,2% est exécuté avec un échantillon en utilisant la formule lamda pour chaque bloc de données de chaque M_CLASS.
Stratified_df=df.groupby('M_CLASS', group_keys=False)\
.apply(lambda x: x.sample(frac=0.002, random_state = 1))
Regroupées par M_CLASS, les données sont de 0,2%.
Une autre option consiste à utiliser Stratified Shuffle Split. Il s'agit d'un objet qui effectue un échantillonnage en couches lors de la séparation des données d'entraînement et des données de test.
La taille d'échantillonnage des données d'apprentissage et des données de test est déterminée par les arguments train_size et test_size de StratifiedShuffleSplit. random_state est une graine aléatoire. Puisqu'il s'agit à l'origine d'un objet pour séparer les données d'entraînement et les données de test, il est nécessaire de déterminer train_size et test_size.
Si vous spécifiez le Dataframe (df) et la colonne (df ['M_CLASS']) que vous souhaitez stratifier avec la fonction de fractionnement pour l'échantillon instancié, l'index (train_, test_) du Dataframe des données d'apprentissage et des données de test sera renvoyé. À partir de là, je crée un nouveau Dataframe (StratifiedShuffleSplit_df).
from sklearn.model_selection import StratifiedShuffleSplit
sample = StratifiedShuffleSplit(n_splits = 1,train_size = 0.002,test_size = 0.01, random_state = 1)
for train_,test_ in sample.split(df, df['M_CLASS']):
StratifiedShuffleSplit_ = df.loc[train_]
# chunk_test = df1.loc[test_]
En comparant la distribution de M_CLASS de toutes les données, ces données d'échantillonnage stratifiées et les données d'échantillonnage aléatoire simple, SHOES01 est manquant dans les données d'échantillonnage aléatoire simple, et la distribution de toutes les données ne peut pas être reflétée. Je comprends.
Les données cette fois sont une transaction d'achat. Un échantillonnage aléatoire de l'ensemble des données réduira les articles achetés par chaque client. Le nombre d'achats et le montant d'achat par personne seront faibles, et il sera difficile de comprendre la tendance d'achat des gens qui «achètent souvent des CHAUSSURES». Vous pouvez analyser les produits les plus vendus dans l'ensemble de la transaction, mais les données ne seront pas adaptées à une analyse orientée client.
Dans ce cas, effectuez un échantillonnage en grappes (échantillonnage d'ID agrégé) qui échantillonne au niveau de l'ID client. Lors de l'échantillonnage en grappes, la transaction de l'ID client extrait est conservée par échantillonnage par l'ID client, il est donc possible d'analyser par l'axe client.
L'échantillonnage en grappes est également effectué au nœud d'échantillonnage. La méthode d'échantillonnage est "Complexe" et la taille de l'échantillon est spécifiée. Ici, 0,1 (10%) est spécifié. Cliquez ensuite sur le bouton Cluster and Hierarchy pour spécifier les variables que vous souhaitez regrouper. Ici, CUSTID est spécifié comme cluster.
De plus, le réglage de la graine aléatoire est vérifié afin que l'échantillonnage puisse être reproduit.
10% de tous les CUSTID ont été échantillonnés au hasard, les transactions CUSTID extraites ont été enregistrées et 2652 ont été extraites. Une colonne SampleWeight a également été ajoutée, mais je ne pense pas qu'elle soit utilisée pour un échantillonnage complexe.
Cependant, le refoulement SQL ne fonctionne pas si l'échantillonnage en grappes est effectué à l'aide de la fonction de nœud d'échantillonnage. Par conséquent, il est recommandé d'échantillonner CUSTID par agrégation d'enregistrements et échantillonnage aléatoire, puis re-JOIN avec les données d'origine.
Créez un ensemble de données unique avec CUSTID dans l'agrégation d'enregistrements.
La méthode d'échantillonnage est simple et un% aléatoire de 10% est spécifié.
Combinez ensuite les transactions à partir des données d'origine.
Cette méthode effectuera un refoulement SQL. RAND (2743707) <1.0000000000000001e-01) est un échantillonnage aléatoire et WHERE (T0.CUSTID = T1.CUSTID) joint les transactions.
[2020-08-12 12:58:45] Aperçu SQL: SÉLECTIONNEZ T1.SDATE COMME SDATE, T1.PRODUCTID COMME PRODUCTID, T1. "L_CLASS" AS "L_CLASS", T1. "M_CLASS" AS "M_CLASS", T1.SUBTOTAL COMME SOUS-TOTAL, T0.CUSTID COMME CUSTID DE (SÉLECTIONNEZ T0.CUSTID COMME CUSTID DE (SÉLECTIONNEZ T0.CUSTID COMME CUSTID À PARTIR D'ÉCHANTILLONTRANDEPT4EN2019S T0 GROUPE PAR T0.CUSTID) T0 WHERE RAND (2743707) <1.0000000000000001e-01) (SÉLECTIONNEZ T0.CUSTID COMME CUSTID, T0.SDATE COMME SDATE, T0.PRODUCTID COMME PRODUCTID, T0. "L_CLASS" COMME "L_CLASS", T0. "M_CLASS" COMME "M_CLASS", T0.SUBTOTAL COMME SOUS-TOTAL DE SAMPLETRANDEPT4EN2019S T0) O (T0.CUSTID = T1.CUSTID)
Utilisez les fonctions unique, sample et isin pour l'échantillonnage en grappes avec les pandas. Le processus est le même que l'utilisation du nœud d'agrégation, du nœud d'échantillonnage et du nœud de jointure d'enregistrement dans Modeler.
Créez un jeu d'enregistrements unique et doté d'un CUSTID unique. Un échantillonnage aléatoire est effectué avec l'échantillon. Seuls les CUSTID échantillonnés à partir de la transaction d'origine avec isin sont extraits.
df_custid =pd.Series(df['CUSTID'].unique()).sample(frac=0.1,random_state=1)
df[df['CUSTID'].isin(df_custid)]
L'échantillonnage en grappes peut être effectué comme suit.
L'échantillon est placé ci-dessous.
courant https://github.com/hkwd/200611Modeler2Python/raw/master/sample/sample.str notebook https://github.com/hkwd/200611Modeler2Python/blob/master/sample/sampling.ipynb Les données https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/sampletranDEPT4en2019S.csv
■ Environnement de test Modeler 18.2.1 Windows 10 64bit Python 3.6.9 pandas 0.24.1
Échantillonnage aléatoire-Wikipedia
https://ja.wikipedia.org/wiki/%E7%84%A1%E4%BD%9C%E7%82%BA%E6%8A%BD%E5%87%BA #% E7% B5% B1% E8% A8% 88% E8% AA% BF% E6% 9F% BB% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3% 82% 8B% E7% 84% A1% E4% BD% 9C% E7% 82% BA% E6% 8A% BD% E5% 87% BA% E3% 81% AE% E6% 89% 8B% E6% B3% 95
L'explication de la méthode d'extraction stratifiée et de la méthode d'extraction par grappes est facile à comprendre.
Noeud d'échantillonnage https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.1/modeler_mainhelp_client_ddita/clementine/mainwindow_navigationstreamsoutputtab.html
Recommended Posts