Разница между использованием теста поезда split и cross val score в sklearn.перекрестная проверка

у меня есть матрица с 20 столбцов. Последний столбец содержит метки 0/1.

ссылка на данные здесь.

Я пытаюсь запустить случайный лес в наборе данных, используя перекрестную проверку. Я использую два метода для этого:

  1. используя sklearn.cross_validation.cross_val_score
  2. используя sklearn.cross_validation.train_test_split

Я получаю разные результаты, когда я делаю то, что считаю почти то же самое. Чтобы проиллюстрировать это, я использую двойной крест. проверка с использованием двух методов выше, как и в приведенном ниже коде.

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

мой вопрос:

Почему я получаю разные результаты, т. е. почему AUC (метрика, которую я использую) выше, когда я использую train_test_split?

Примечание.: Когда я использую больше складок (скажем, 10 складок), в моих результатах появляется какой-то шаблон, при этом первый расчет всегда дает мне самый высокий AUC.

в случае двукратной перекрестной проверки в приведенном выше примере, первый AUC всегда выше, чем второй; это всегда что-то вроде 0.70 и 0.58.

Спасибо за вашу помощь!

1 ответов


при использовании cross_val_score вы часто захотите использовать итератор KFolds или StratifiedKFolds:

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

по умолчанию cross_val_score не будет рандомизировать ваши данные, что может привести к нечетным результатам, как это, если начнем с того, что ваши данные не случайны.

итератор KFolds имеет случайный параметр состояния:

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

также train_test_split, который по умолчанию рандомизируется:

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

шаблоны как вы описали обычно результат недостатка randomnesss в поезде / наборе испытания.