我有一个包含20列的矩阵,其中最后一列是0/1标签。
这是数据的链接:这里。
我尝试在数据集上使用交叉验证运行随机森林。我用两种方法来实现:
- 使用
sklearn.cross_validation.cross_val_score
- 使用
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之类的数值。
感谢您的帮助!