2015-05-21 10 views
9

Mam macierz z 20 kolumnami. Ostatnia kolumna to etykiety 0/1.Różnica między używaniem train_test_split i cross_val_score w sklearn.cross_validation

Łącze do danych to here.

Próbuję uruchomić losowy las na zbiorze danych, używając sprawdzania poprawności krzyżowej. I korzystać z dwóch metod w ten sposób:

  1. użyciu sklearn.cross_validation.cross_val_score
  2. użyciu sklearn.cross_validation.train_test_split

Dostaję różne wyniki, kiedy robię to, co myślę, że jest niemal tak samo dokładna rzeczą. Aby to zilustrować, uruchamiam podwójną walidację krzyżową za pomocą dwóch powyższych metod, jak w poniższym kodzie.

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 

Moje pytanie brzmi:

dlaczego otrzymuję różne rezultaty, czyli dlaczego AUC (metryka używam) wyższe, gdy używam train_test_split?

Uwaga: Uwaga: Kiedy używam więcej fałd (powiedzmy 10 fałd), wydaje się, że w moich wynikach jest jakiś wzór, przy czym pierwsze obliczenie zawsze daje mi najwyższe AUC.

W przypadku podwójnej walidacji krzyżowej w powyższym przykładzie pierwsze AUC jest zawsze wyższe niż drugie; to zawsze coś w rodzaju 0.70 i 0.58.

Dzięki za pomoc!

+0

to twoje dane początkowo losowane? Jeśli dobrze pamiętam, jedna lub obie z dwóch metod domyślnie dzielą dane bez randomizacji. To może wyjaśniać "wzorzec", do którego się odnosisz, chociaż prawdopodobnie nie wyjaśniłoby gorszych wyników ogólnych za pomocą pierwszej metody (może się zdarzyć). – KCzar

+0

Nie, dane początkowo nie są losowe. Wydaje się to być dobrym wytłumaczeniem, dlaczego wyniki wykazują ten sam wzorzec w cross_val_score. Sądzę, że jedyną przypadkową częścią cross_val_score w moim przypadku jest fakt, że randomForestClassifier ma pewną losowość w swoim algorytmie wyboru cech w swoich drzewach.Poza tym, jeśli to jest po prostu cięcie danych na n fałdy w oparciu o początkowe zamówienie, to może to jest problem. Sprawdzę to za kilka godzin, kiedy będę musiała się obudzić, tu jest środek nocy! – evianpring

+0

tak tak, okazało się to: p = np.random.permutation (len (y)) Wynik = 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) – evianpring

Odpowiedz

12

Podczas korzystania cross_val_score, będziesz częściej chcą używać KFolds lub StratifiedKFolds iterator:

http://scikit-learn.org/0.10/modules/cross_validation.html#computing-cross-validated-metrics

http://scikit-learn.org/0.10/modules/generated/sklearn.cross_validation.KFold.html#sklearn.cross_validation.KFold

Domyślnie cross_val_score nie będą losowe dane, które mogą powodować dziwne rezultaty tak, jeśli dane nie są losowe na początek.

KFolds iterator ma losowy parametr Stan:

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html

więc nie train_test_split, który ma losowo domyślnie:

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html

Wzory takie jak to, co opisane są zazwyczaj wynikiem braku przypadkowości w zespole pociągu/testu.

+0

Mam pytanie na ** train_test_split **. W powyższym kodzie 'xtrain, xtest, ytrain, ytest = train_test_split (X, y, test_size = 0,50)', w jaki sposób algorytm wie, jaką wartość musi przejść do 'xtrain',' xtest' etc? Skąd wiadomo, że 'xtrain' musi zawierać wynik _związania zmiennych niezależnych_ zbioru danych, i podobnie na' xtest'. Nie sądzę, że to fakt, że zmienna zawiera "pociąg" lub "test" w nim. Czy to jest? Dzięki za pomoc. –

Powiązane problemy