Les données sont souvent déséquilibrées lors de l'apprentissage avec un enseignant ... Je pense plutôt qu'il y a peu de cas où un montant important peut être garanti de manière équilibrée.
Cette fois, je vais vous présenter une bibliothèque appelée ** déséquilibré-learn ** qui peut être utile pour rééchantillonner des données déséquilibrées.
J'ai principalement évoqué les articles suivants.
La Documentation officielle est ici.
Suivez Install and contribution pour installer.
pip install -U imbalanced-learn
Installez avec.
À propos, à partir de mars 2020, les conditions suivantes semblent exister pour les bibliothèques suivantes.
Préparez les pseudo-données à utiliser cette fois. Si vous avez déjà des données, ignorez-les. J'utilise une fonction appelée make_classification.
In[1]
import pandas as pd
from sklearn.datasets import make_classification
df = make_classification(n_samples=5000, n_features=10, n_informative=2,
n_redundant=0, n_repeated=0, n_classes=3,
n_clusters_per_class=1, weights=[0.01, 0.05, 0.94],
class_sep=0.8, random_state=0)
Il y a deux valeurs de retour dans ce df sous forme de taple. df [0] contient ce que l'on appelle X, df [1] contient le soi-disant y. Par conséquent, stockez-le dans la trame de données par l'opération suivante.
In[2]
df_raw = pd.DataFrame(df[0], columns = ['var1', 'var2', 'var3', 'var4', 'var5', 'var6', 'var7', 'var8', 'var9', 'var10'])
df_raw['Class'] = df[1]
df_raw.head()
Divisez cela en X et y.
In[3]
X = df_raw.iloc[:, 0:10]
y = df_raw['Class']
y.value_counts()
Out[3]
2 4674
1 261
0 65
Name: Class, dtype: int64
Comme vous pouvez le voir, nous avons une très grande quantité de données pour l'étiquette 2. Ceci termine la préparation des pseudo-données.
Divisez la trame de données préparée précédemment à l'aide de train_test_split.
In[4]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 71, stratify=y)
y_train.value_counts()
Out[4]
2 3272
1 183
0 45
Name: Class, dtype: int64
Il s'agit du nombre de données pour chaque étiquette de données de train après division en train et test. Ici, ** l'extraction de stratification ** est effectuée en spécifiant y dans l'argument stratify de train_test_split. peut faire.
Statistics Web: Exemple de méthode d'extraction
C'est finalement le sujet principal. Sous-échantillonner avec RandomUnderSampler. L'API est ici.
Décrit l'argument ** sampling_strategy **. Avec cet argument, vous pouvez déterminer le rapport de chaque classe lors de l'échantillonnage. Il semble que l'argument était ratio dans la version précédente, mais il a été changé de la version 0.6 à sampling_strategy.
Il est possible de donner à cet argument principalement le type float et dictionary.
Pour float, spécifiez une classe minoritaire ÷ classe majoritaire. Cependant, il n'est applicable que pour les problèmes à 2 étiquettes.
Pour le type de dictionnaire, transmettez la taille de l'échantillon de chaque classe comme suit.
In[5]
from imblearn.under_sampling import RandomUnderSampler
positive_count_train = y_train.value_counts()[0]
strategy = {0:positive_count_train, 1:positive_count_train*2, 2:positive_count_train*5}
rus = RandomUnderSampler(random_state=0, sampling_strategy = strategy)
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)
y_resampled.value_counts()
Out[5]
Using TensorFlow backend.
2 225
1 90
0 45
Name: Class, dtype: int64
Vous avez maintenant sous-échantillonné.
Comme c'est un gros problème, j'aimerais le classer par modèle.
In[6]
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
model = LogisticRegression()
model.fit(X_resampled, y_resampled)
y_pred = model.predict(X_test)
print('Accuracy(test) : %.5f' %accuracy_score(y_test, y_pred))
Out[6]
Accuracy(test) : 0.97533
Sortons la matrice de confusion sous forme de carte thermique.
In[7]
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm)
La carte thermique était également difficile à voir car les données de test étaient déséquilibrées ...
Cette fois, j'ai essayé le sous-échantillonnage.
En faisant des recherches sur diverses choses en écrivant cet article, j'ai constaté qu'il existe différentes méthodes de sous-échantillonnage et de suréchantillonnage.
** SMOTE ** semble intéressant, je vais donc l'étudier.
Nous sommes toujours à la recherche d'articles, de commentaires, etc.
Recommended Posts