Mit Daten arbeiten - mit Datenverarbeitungsalgorithmen arbeiten.
Und ich musste täglich mit den verschiedensten arbeiten, also beschloss ich, eine Liste der beliebtesten in einer Reihe von Veröffentlichungen zu erstellen.
Dieser Artikel konzentriert sich auf die gängigsten Stichprobenverfahren für die Arbeit mit Daten.
Einfache Zufallsauswahl
Angenommen, Sie möchten eine Auswahl treffen, bei der jedes Element die gleiche Wahrscheinlichkeit hat, ausgewählt zu werden.
Nachfolgend wählen wir 100 solcher Elemente aus dem Datensatz aus.
sample_df = df.sample(100)
Geschichtete Probenahme
Angenommen, wir müssen die durchschnittliche Anzahl der Stimmen für jeden Kandidaten bei der Wahl schätzen. Die Abstimmung findet in drei Städten statt:
1 Million Arbeiter leben in Stadt A.
In Stadt B leben 2 Millionen Künstler
In der Stadt C leben 3 Millionen Senioren
Wenn wir versuchen, gleich wahrscheinliche Stichproben von 60 Personen aus der gesamten Bevölkerung zu entnehmen, sind diese wahrscheinlich im Verhältnis zu verschiedenen Städten unausgewogen und daher voreingenommen, was zu einem schwerwiegenden Fehler in den Vorhersagen führt.
Wenn wir speziell eine Stichprobe von 10, 20 und 30 Personen aus den Städten A , B und C erstellen, ist der Fehler minimal.
In Python kann dies folgendermaßen geschehen:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.25)
Probenahme im Reservoir
Ich mag diese Formulierung des Problems:
Angenommen, Sie haben einen Stream von Elementen einer großen unbekannten Größe, die Sie nur einmal durchlaufen können.
Erstellen Sie einen Algorithmus, der ein Element zufällig aus dem Stream auswählt, als ob ein Element mit gleicher Wahrscheinlichkeit ausgewählt werden könnte.
Wie kann man das machen?
Angenommen, wir müssen 5 Objekte aus einem unendlichen Stream auswählen, damit jedes Element im Stream gleich wahrscheinlich ausgewählt werden kann.
import random def generator(max): number = 1 while number < max: number += 1 yield number
Es ist mathematisch möglich zu beweisen, dass jedes Element gleich wahrscheinlich ausgewählt werden kann.
Wie?
Wenn es um Mathematik geht, versuchen Sie am besten, die Lösung mit einem kleinen Sonderfall zu beginnen.
Schauen wir uns also einen Stream an, der aus 3 Elementen besteht, wobei wir nur 2 auswählen müssen.
Wir sehen das erste Element, speichern Sie es in der Liste, da noch Platz im Tank ist. Wir sehen das zweite Element, speichern Sie es in der Liste, da noch Platz im Tank ist.
Wir sehen das dritte Element. Hier wird es interessanter. Wir werden das dritte Element mit einer Wahrscheinlichkeit von 2/3 speichern.
Lassen Sie uns nun die endgültige Wahrscheinlichkeit sehen, mit der das erste Element gespeichert wird:
Die Wahrscheinlichkeit der Verschiebung des ersten Elements aus dem Reservoir ist gleich der Wahrscheinlichkeit, dass das dritte Element ausgewählt wird, multipliziert mit der Wahrscheinlichkeit, dass es das erste Element der beiden Elemente ist, das für die Verschiebung ausgewählt wird. Also:
2/3 * 1/2 = 1/3
Das heißt, die endgültige Wahrscheinlichkeit, dass das erste Element gespeichert wird:
1 - 1/3 = 2/3
Auf das zweite Element kann absolut dieselbe Logik angewendet werden, die es in Zukunft mit zunehmendem Reservoir auf eine größere Anzahl von Elementen erweitert.
Das heißt, jedes Element wird mit einer Wahrscheinlichkeit von 2/3 oder im allgemeinen Fall k / n gespeichert.
Zufälliges Unter- und Überabtasten
QuelleZu oft im Leben gibt es unausgeglichene Datensätze.
Die in diesem Fall weit verbreitete Methode wird Resampling genannt (manchmal heißt es in der russischen Übersetzung „Resampling“ - ca. Transl.) . Sein Kern liegt darin, entweder Elemente aus einer zu großen Menge zu entfernen (Unterabtastung) und / oder einer unzureichend großen Menge weitere Elemente hinzuzufügen (Überabtastung).
Beginnen wir mit der Erstellung einiger unausgeglichener Mengen.
from sklearn.datasets import make_classification X, y = make_classification( n_classes=2, class_sep=1.5, weights=[0.9, 0.1], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=100, random_state=10 ) X = pd.DataFrame(X) X['target'] = y
Jetzt können wir zufälliges Unter- und Überabtasten wie folgt durchführen:
num_0 = len(X[X['target']==0]) num_1 = len(X[X['target']==1]) print(num_0,num_1)
Andersampling und Oversampling mit unausgeglichenem Lernen
imbalanced-learn (imblearn) ist eine Python-Bibliothek zur Behandlung der Probleme unausgeglichener Datensätze.
Es enthält verschiedene Methoden zum Resampling.
a. Andersampling mit Tomek Links:
Eine der bereitgestellten Methoden heißt Tomek Links. "Links" sind in diesem Fall Paare von Elementen aus verschiedenen Klassen, die sich in der Nähe befinden.
Mit dem Algorithmus entfernen wir schließlich das Paarelement aus der größeren Menge, wodurch der Klassifikator besser arbeiten kann.
Quelle
from imblearn.under_sampling import TomekLinks tl = TomekLinks(return_indices=True, ratio='majority') X_tl, y_tl, id_tl = tl.fit_sample(X, y)
b. Überabtastung mit SMOTE:
In SMOTE (Synthesis Minority Oversampling Method) erstellen wir Elemente in unmittelbarer Nähe zu vorhandenen Elementen in einer kleineren Menge.
Quelle from imblearn.over_sampling import SMOTE smote = SMOTE(ratio='minority') X_sm, y_sm = smote.fit_sample(X, y)
In imblearn gibt es jedoch auch andere Methoden der Unterabtastung (Cluster Centroids, NearMiss usw.) und Überabtastung (ADASYN und bSMOTE), die ebenfalls nützlich sein können.
Fazit
Algorithmen sind das Blut der Datenwissenschaft.
Die Probenahme ist einer der wichtigsten Bereiche bei der Arbeit mit Daten, und oben wird nur eine oberflächliche Übersicht gegeben.
Eine gut gewählte Stichprobenstrategie kann das gesamte Projekt vorantreiben. Schlechte Auswahl führt zu fehlerhaften Ergebnissen. Daher muss die Wahl mit Bedacht getroffen werden.