Daten sind beim Lernen mit einem Lehrer oft unausgewogen ... Ich denke eher, dass es wenige Fälle gibt, in denen eine große Menge auf ausgewogene Weise gesichert werden kann.
Dieses Mal werde ich eine Bibliothek namens ** unausgeglichenes Lernen ** vorstellen, die nützlich sein kann, um unausgeglichene Daten erneut abzutasten.
Ich habe mich hauptsächlich auf die folgenden Artikel bezogen.
Die offizielle Dokumentation ist hier.
Folgen Sie Installieren und Beitrag, um die Installation durchzuführen.
pip install -U imbalanced-learn
Installieren mit.
Übrigens scheint es ab März 2020 die folgenden Bedingungen für die folgenden Bibliotheken zu geben.
Bereiten Sie die diesmal zu verwendenden Pseudodaten vor. Wenn Sie bereits Daten haben, überspringen Sie diese. Ich benutze eine Funktion namens 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)
Es gibt zwei Rückgabewerte in diesem df als Taple. df [0] enthält sogenanntes X, df [1] enthält das sogenannte y. Speichern Sie es daher mit der folgenden Operation im Datenrahmen.
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()
Teilen Sie dies in X und 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
Wie Sie sehen können, haben wir eine extrem große Datenmenge für Etikett 2. Damit ist die Aufbereitung der Pseudodaten abgeschlossen.
Teilen Sie den zuvor mit train_test_split vorbereiteten Datenrahmen auf.
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
Dies ist die Anzahl der Daten für jedes Etikett von Zugdaten nach Aufteilung in Zug und Test. Hier wird die ** Schicht-Extraktion ** durchgeführt, indem y im Argument stratify von [train_test_split] angegeben wird (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html). tun können.
Statistics Web: Beispielextraktionsmethode
Es ist endlich das Hauptthema. Unterabtastung mit RandomUnderSampler. Die API ist hier.
Beschreibt das Argument ** sample_strategy **. Mit diesem Argument können Sie das Verhältnis jeder Klasse bei der Stichprobe bestimmen. Es scheint, dass das Argument in der vorherigen Version das Verhältnis war, aber es wurde von Version 0.6 in sample_strategy geändert.
Es ist möglich, dieses Argument hauptsächlich als Float- und Dictionary-Typ anzugeben.
Geben Sie für float die Minderheitsklasse ÷ die Mehrheitsklasse an. Dies gilt jedoch nur für 2-Label-Probleme.
Übergeben Sie für den Wörterbuchtyp die Stichprobengröße jeder Klasse wie folgt.
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
Sie haben jetzt unterabgetastet.
Da es eine große Sache ist, möchte ich es nach einem Modell klassifizieren.
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
Lassen Sie uns die Verwirrungsmatrix als Heatmap ausgeben.
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)
Die Heatmap war auch schwer zu sehen, da die Testdaten unausgeglichen waren ...
Diesmal habe ich es mit Unterabtastung versucht.
Als ich beim Schreiben dieses Artikels verschiedene Dinge recherchierte, stellte ich fest, dass es verschiedene Methoden für Unter- und Überabtastung gibt.
** SMOTE ** scheint interessant zu sein, also werde ich es studieren.
Wir sind immer auf der Suche nach Artikeln, Kommentaren usw.
Recommended Posts