555 Stimmen

Wie erstelle ich Test- und Trainingsdatensätze aus einem DataFrame mit pandas?

Ich habe einen ziemlich großen Datensatz in Form eines Datenrahmens und frage mich, wie ich den Datenrahmen in zwei zufällige Stichproben (80% und 20%) für Training und Test aufteilen kann.

Vielen Dank!

28voto

yannick_leo Punkte 459

Es gibt viele Möglichkeiten, um Trainings-/Test- und sogar Validierungsstichproben zu erstellen.

Fall 1: klassische Methode train_test_split ohne jegliche Optionen:

from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.3)

Fall 2: Fall eines sehr kleinen Datensatzes (<500 Zeilen): um Ergebnisse für alle Zeilen mit dieser Kreuzvalidierung zu erhalten. Am Ende haben Sie eine Vorhersage für jede Zeile Ihres verfügbaren Trainingsdatensatzes.

from sklearn.model_selection import KFold
kf = KFold(n_splits=10, random_state=0)
y_hat_all = []
for train_index, test_index in kf.split(X, y):
    reg = RandomForestRegressor(n_estimators=50, random_state=0)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    clf = reg.fit(X_train, y_train)
    y_hat = clf.predict(X_test)
    y_hat_all.append(y_hat)

Fall 3a: Unaugewogene Datensätze für Klassifikationszwecke. Nach Fall 1 hier die äquivalente Lösung:

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.3)

Fall 3b: Unaugewogene Datensätze für Klassifikationszwecke. Nach Fall 2 hier die äquivalente Lösung:

from sklearn.model_selection import StratifiedKFold
kf = StratifiedKFold(n_splits=10, random_state=0)
y_hat_all = []
for train_index, test_index in kf.split(X, y):
    reg = RandomForestRegressor(n_estimators=50, random_state=0)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    clf = reg.fit(X_train, y_train)
    y_hat = clf.predict(X_test)
    y_hat_all.append(y_hat)

Fall 4: Sie müssen Trainings-/Test-/Validierungssets auf großen Daten erstellen, um Hyperparameter abzustimmen (60% Trainingsdaten, 20% Testdaten und 20% Valdierungsdaten).

from sklearn.model_selection import train_test_split
X_train, X_test_val, y_train, y_test_val = train_test_split(X, y, test_size=0.6)
X_test, X_val, y_test, y_val = train_test_split(X_test_val, y_test_val, stratify=y, test_size=0.5)

16voto

user1775015 Punkte 189

Sie können den folgenden Code verwenden, um Test- und Trainingsstichproben zu erstellen:

from sklearn.model_selection import train_test_split
trainingSet, testSet = train_test_split(df, test_size=0.2)

Die Testgröße kann je nach prozentualem Anteil der Daten variieren, den Sie in Ihrem Test- und Trainingsdatensatz platzieren möchten.

8voto

Abhi Punkte 1153

Es gibt viele gültige Antworten. Fügen Sie eine weitere hinzu.

# erhält zufällige 80% des gesamten Sets
X_train = X.sample(frac=0.8, random_state=1)
# erhält den übrig gebliebenen Teil des Datensatzes
X_test = X.loc[~df_model.index.isin(X_train.index)]

7voto

Apogentus Punkte 5981

Sie können auch eine stratifizierte Aufteilung in Trainings- und Testdatensatz in Betracht ziehen. Die stratifizierte Aufteilung generiert auch zufällig Trainings- und Testdatensätze, jedoch so, dass die ursprünglichen Klassenproportionen erhalten bleiben. Dadurch spiegeln Trainings- und Testdatensätze die Eigenschaften des ursprünglichen Datensatzes besser wider.

import numpy as np  

def get_train_test_inds(y,train_proportion=0.7):
    '''Generiert Indizes, um eine zufällige stratifizierte Aufteilung in Trainings- und Testsets mit den Anteilen train_proportion und (1-train_proportion) der ursprünglichen Stichprobe zu erstellen.
    y ist ein beliebiges Iterable, das die Klassen jeder Beobachtung in der Stichprobe angibt.
    Die ursprünglichen Klassenanteile in den Trainings- und Testsets werden beibehalten (stratifizierte Stichprobenahme).
    '''

    y=np.array(y)
    train_inds = np.zeros(len(y),dtype=bool)
    test_inds = np.zeros(len(y),dtype=bool)
    values = np.unique(y)
    for value in values:
        value_inds = np.nonzero(y==value)[0]
        np.random.shuffle(value_inds)
        n = int(train_proportion*len(value_inds))

        train_inds[value_inds[:n]]=True
        test_inds[value_inds[n:]]=True

    return train_inds,test_inds

df[train_inds] und df[test_inds] geben Ihnen die Trainings- und Testsets Ihres ursprünglichen DataFrame df.

6voto

Sie können ~ (Tildenoperator) verwenden, um die mit df.sample() ausgewählten Zeilen auszuschließen und pandas die Stichprobenahme und Filterung der Indizes alleine zu überlassen, um zwei Sätze zu erhalten.

train_df = df.sample(frac=0.8, random_state=100)
test_df = df[~df.index.isin(train_df.index)]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X