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:
- użyciu
sklearn.cross_validation.cross_val_score
- 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!
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
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
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