Unterschied zwischen der Verwendung train_test_split und cross_val_score in sklearn.cross_validation

Ich habe eine matrix mit 20 Spalten. Die Letzte Spalte 0/1 labels.

Den link zu den Daten ist hier.

Ich versuche zu laufen random forest auf das dataset, mit cross validation. Ich verwende zwei Methoden, dies zu tun:

  1. mit sklearn.cross_validation.cross_val_score
  2. mit sklearn.cross_validation.train_test_split

Bin ich immer unterschiedliche Ergebnisse, wenn ich Tue, was ich denke, ist so ziemlich das gleiche genaue Sache. Um zu veranschaulichen, führe ich ein zwei-Fach-Kreuzvalidierung unter Verwendung der beiden oben genannten Methoden, wie im code unten.

import csv
import numpy as np
import pandas as pd
from sklearn import ensemble
from sklearn.metrics import roc_auc_score
from sklearn.cross_validation import train_test_split
from sklearn.cross_validation import cross_val_score

#read in the data
data = pd.read_csv('data_so.csv', header=None)
X = data.iloc[:,0:18]
y = data.iloc[:,19]

depth = 5
maxFeat = 3 

result = cross_val_score(ensemble.RandomForestClassifier(n_estimators=1000, max_depth=depth, max_features=maxFeat, oob_score=False), X, y, scoring='roc_auc', cv=2)

result
# result is now something like array([ 0.66773295,  0.58824739])

xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=0.50)

RFModel = ensemble.RandomForestClassifier(n_estimators=1000, max_depth=depth, max_features=maxFeat, oob_score=False)
RFModel.fit(xtrain,ytrain)
prediction = RFModel.predict_proba(xtest)
auc = roc_auc_score(ytest, prediction[:,1:2])
print auc    #something like 0.83

RFModel.fit(xtest,ytest)
prediction = RFModel.predict_proba(xtrain)
auc = roc_auc_score(ytrain, prediction[:,1:2])
print auc    #also something like 0.83

Meine Frage ist:

warum bekomme ich unterschiedliche Ergebnisse, sprich, warum ist die AUC (die Metrik bin ich mit dem) höher, wenn ich train_test_split?

Hinweis:
Wenn ich mit mehr Falten (sagen wir 10 Falten), es scheint eine Art Muster in meine Ergebnisse, mit der ersten Berechnung immer, dass Sie mir den höchsten AUC.

Im Falle des zwei-Fach-Kreuzvalidierung im obigen Beispiel, die erste AUC ist immer höher als der zweite; es ist immer sowas 0,70 und 0.58.

Vielen Dank für Ihre Hilfe!

  • Ihre Daten randomisierte zunächst? Wenn ich mich Recht erinnere, eine oder beide der zwei Standard-Methoden, um die Aufteilung der Daten ohne Randomisierung. Das könnte erklären, das "Muster" auf den Sie sich beziehen, obwohl es wahrscheinlich würde nicht erklären, die insgesamt ärmer Ergebnisse mit der ersten Methode (könnte es aber)
  • Nein, die Daten nicht zufällig zunächst. Es scheint eine gute Erklärung dafür, warum die Ergebnisse zeigen das gleiche Muster in cross_val_score. Ich denke, die nur zufällig Teil cross_val_score in meinem Fall ist die Tatsache, dass die randomForestClassifier hat einige Zufälligkeit in seinem Algorithmus für die Auswahl von Funktionen in seinen Bäumen. Andere als, dass , wenn es nur das schneiden der Daten in n folds auf der Grundlage der ersten Bestellung, dann vielleicht, dass ist das problem. Ich ' ll überprüfen Sie es heraus in ein paar Stunden, wenn ich actuallly wach auf, es ist mitten in der Nacht hier!
  • so, ja, das hat funktioniert: p = np.random.permutation(len(y)) Ergebnis = cross_val_score(ensemble.RandomForestClassifier(n_estimators=1000, max_depth=5, max_features=3, oob_score=False) X[p], y[p], scoring='roc_auc', cv=2)
InformationsquelleAutor evianpring | 2015-05-21
Schreibe einen Kommentar