[PYTHON] [Kaggle] Ich habe versucht, mit unausgeglichenem Lernen zu unterabtasten

0. Einleitung

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.

1. Installieren Sie unbalanced-learn

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.

2. Bereiten Sie Pseudodaten vor

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()

image.png

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.

3. Teilen Sie die Daten mit train_test_split

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

4. Unterabtastung mit RandomUnderSampler

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.

6. Bonus

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)

image.png

Die Heatmap war auch schwer zu sehen, da die Testdaten unausgeglichen waren ...

7. Zusammenfassung

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

[Kaggle] Ich habe versucht, mit unausgeglichenem Lernen zu unterabtasten
[Kaggle] Ich habe versucht, Ensemble mit LightGBM zu lernen
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, Rotrics Dex Arm zu verwenden
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Ich habe versucht, mit dem Server-Client über tmux zu kommunizieren
Ich habe versucht, mit PyBrain verstärkt zu lernen
Ich habe irgendwie versucht, ein Jupyter-Notebook zu verwenden
Ich habe versucht, mit OpenPose eine Schildkrötenwelle zu schießen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, asynchrone Verarbeitung mit Asyncio
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Azure Speech to Text zu verwenden.
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, mit einer Schildkröte eine Linie zu ziehen
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 2: Ich habe versucht, PyEZ zu verwenden
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, die selektive Suche als R-CNN zu verwenden
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, Headless Chrome von Selenium zu verwenden
Ich habe versucht, pipenv zu verwenden, machen Sie sich also eine Notiz
[Visualisierung] Ich habe versucht, Bokeh / plotly zu verwenden! 【Memorandum】
Ich habe versucht, die BigQuery-Speicher-API zu verwenden