在sklearn.cross_validation中使用train_test_split和cross_val_score



我有一个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
我的问题是:

为什么我得到不同的结果,即,为什么当我使用train_test_split时AUC(我使用的度量)更高?

注意:当我使用更多的折叠(比如10次折叠)时,我的结果中似乎有某种模式,第一次计算总是给我最高的AUC。

在上例中的双重交叉验证情况下,第一个AUC总是高于第二个AUC;它总是在0.70和0.58之间。

谢谢你的帮助!

当使用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_testrongplit也是如此,它在默认情况下进行随机化:

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

你所描述的模式通常是训练/测试集中缺乏随机性的结果。

答案就是@KCzar指出的。只是想注意我发现的随机化数据(Xy具有相同的索引变换)的最简单方法如下:

p = np.random.permutation(len(X))
X, y = X[p], y[p]

source:同时洗牌两个numpy数组的更好方法

相关内容

  • 没有找到相关文章

最新更新