Scikit-lernen ausgeglichenes Subsampling
Ich versuche zu schaffen, N symmetrisch Zufallsprinzip ausgewählt meine große unausgeglichenen Datensatz. Gibt es eine Möglichkeit, dies zu tun, einfach mit scikit-learn /pandas oder muss ich es umsetzen, mich? Alle Zeiger auf code, der dies tut?
Diese teilproben werden sollten, zufällig und können sich überlappende, als ich Futter jeweils separate classifier in einem sehr großen ensemble von Klassifikatoren.
In Weka gibt es tool namens spreadsubsample, ist es äquivalent in sklearn?
http://wiki.pentaho.com/display/DATAMINING/SpreadSubsample
(Ich weiß über die Gewichtung, aber das ist nicht das, was ich Suche.)
InformationsquelleAutor der Frage mikkom | 2014-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist meine erste version, die scheint zu funktionieren gut, fühlen Sie sich frei zu kopieren oder machen Vorschläge, wie könnte es effizienter sein, (ich habe eine ziemlich lange Erfahrung mit der Programmierung im Allgemeinen aber nicht so lange mit python, numpy)
Diese Funktion erstellt eine einzige zufällige symmetrische teilstichprobe.
edit: Die teilstichprobe Größe jetzt Proben nach unten Minderheit Klassen, dies sollte wohl geändert werden.
Für jeden, der versucht, die oben machen die Arbeit mit ein Pandas DataFrame, müssen Sie ein paar änderungen:
Ersetzen Sie die
np.random.shuffle
Linie mitthis_xs = this_xs.reindex(np.random.permutation(this_xs.index))
Ersetzen Sie die
np.concatenate
Linien mitxs = pd.concat(xs)
ys = pd.Series(data=np.concatenate(ys),name='target')
InformationsquelleAutor der Antwort mikkom
Inzwischen gibt es eine ausgewachsene python-Paket zu Adresse unbalancierte Daten. Es ist als eine sklearn-contrib-Paket an https://github.com/scikit-learn-contrib/imbalanced-learn
InformationsquelleAutor der Antwort eickenberg
Einer version für pandas-Serie:
InformationsquelleAutor der Antwort gc5
Diese Art der Daten, die Spaltung ist nicht unter der built-in-Daten-splitting-Techniken ausgesetzt in
sklearn.cross_validation
.Dem, was scheint, wie Ihr braucht, ist
sklearn.cross_validation.StratifiedShuffleSplit
generiert teilproben jeder Größe bei gleichzeitiger Beibehaltung der Struktur des ganzen Datensatz, d.h. akribisch die Durchsetzung der gleichen Unwucht, die in Ihrem Haupt-dataset. Dies ist zwar nicht das, was Sie suchen, können Sie in der Lage sein den code zu verwenden darin, und ändern Sie die auferlegten Verhältnis zu 50/50 immer.(Das wäre wahrscheinlich ein sehr guter Beitrag, scikit-learn, wenn Sie das Gefühl bis zu es.)
InformationsquelleAutor der Antwort eickenberg
Unten ist meiner python-Implementierung für die Erstellung von balanced-Daten zu kopieren.
Annahmen:
1. Zielvariable (y) ist Binär-Klasse (0 vs. 1)
2. 1 ist die Minderheit.
InformationsquelleAutor der Antwort beingzy
Hier ist eine version des obigen code, der arbeitet für multiclass-Gruppen (in meinem Fall getestet-Gruppe 0, 1, 2, 3, 4)
Dieser gibt auch die Indizes, so dass Sie kann verwendet werden, für die anderen datasets und zu verfolgen, wie oft jeder Datensatz verwendet wurde (hilfreich für die Ausbildung)
InformationsquelleAutor der Antwort Kevin Mader
Einer leichten Modifikation, um die top-Antwort von mikkom.
Wenn Sie möchten, erhalten Bestellung der größeren Klasse, die Daten, dh. Sie wollen nicht zu mischen.
Statt
tun
InformationsquelleAutor der Antwort Bert Kellerman
Meine subsampler version, hoffe, das hilft
InformationsquelleAutor der Antwort hernan
Obwohl es schon beantwortet, ich stolperte über Ihre Frage für etwas ähnliches suchen. Nach etwas mehr Forschung, ich glaube
sklearn.model_selection.StratifiedKFold
können für diesen Zweck verwendet werden:Ist es wichtig, dass Sie das
_
weil daskf.split()
verwendet wird, zu erstellen geschichteten Falten für K-fold cross-validation, gibt es zwei Listen von Indizes:train
(n - 1 /n
Elemente) und test (1 /n
Elemente).Bitte beachten Sie, dass dies ist, wie der sklearn 0.18. In sklearn 0.17 die gleiche Funktion finden Sie im Modul
cross_validation
statt.InformationsquelleAutor der Antwort kadu
Einen kurzen, pythonic Lösung das Gleichgewicht ein pandas DataFrame entweder durch subsampling (
uspl=True
) oder oversampling (uspl=False
), ausgeglichen durch eine bestimmte Spalte in diesem dataframe, die zwei oder mehr Werte.Für
uspl=True
dieser code wird eine Stichprobe ohne Ersatz der Größe gleich dem kleinsten stratum-aus allen Schichten. Füruspl=False
dieser code wird eine Stichprobe mit Ersatz der Größe gleich der größte Schicht aus allen Schichten.Dies funktioniert nur mit ein Pandas DataFrame, aber das scheint ein allgemeiner Anwendung, und die Beschränkung auf Pandas DataFrames deutlich verkürzt den code so weit wie ich das beurteilen kann.
InformationsquelleAutor der Antwort Roko Mijic