Sklearn 交叉验证产生与手动执行不同的结果

Posted

技术标签:

【中文标题】Sklearn 交叉验证产生与手动执行不同的结果【英文标题】:Sklearn cross validation produces different results than manual execution 【发布时间】:2015-05-27 04:54:28 【问题描述】:

使用 Sklearn,我在 Python 中使用逻辑回归进行监督学习。我还使用交叉验证来测试我的预测准确性。

我想测试我自己做交叉验证时是否有类似的结果。结果如下:

# X is my features. (m x p)
# y is labels. (m x 1)

# Using cross_validation.cross_val_score() function:
classifier = LogisticRegression()
scores1 = cross_validation.cross_val_score(classifier, X, y, cv=10)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores1.mean(), scores1.std() * 2))

# Doing it "manual":
scores2 = np.array( [] )
classifier = LogisticRegression()
for i in range(10):
   X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y,
                                                    test_size=0.1, random_state=i)
   classifier.fit(X_train,y_train)
   score = classifier.score(X_test, y_test)
   scores2 = np.append(scores2, score)

print("Accuracy: %0.2f (+/- %0.2f)" % (scores2.mean(), scores2.std() * 2))

# This prints:
# Accuracy: 0.72 (+/- 0.47)
# Accuracy: 0.58 (+/- 0.52) 

我有相当大的 X 和 y。所以我没想到结果会有很大的不同。这种差异完全是由于过程的随机性,还是我错过了代码中的任何内容?

这里是 cross_validation.cross_val_score() 的文档页面:

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

这里是 cross_validation.train_test_split() 的文档页面:

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

【问题讨论】:

【参考方案1】:

train_test_split 使用随机训练和测试集拆分,而cross_val_score(cv=10) 使用分层 k 折交叉验证。

尝试使用 cv=ShuffleSplit(test_size=0.1)。这应该会给你更多类似的结果。它不会使用您所做的相同随机播种,因此它们可能仍会有所不同。不过,如果他们在彼此的标准之外,那就太奇怪了。

【讨论】:

以上是关于Sklearn 交叉验证产生与手动执行不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 交叉验证 R^2 分数与使用训练模型对训练和验证数据进行的手动检查不匹配

使用手动 KFold-Cross 验证与 KerasClassifier-KFold 交叉验证时的不同结果

基于sklearn和keras的数据切分与交叉验证

sklearn cross_val_score 的准确性低于手动交叉验证

python-sklearn数据拆分与决策树的实现

如何在 python 的 sklearn 中使用交叉验证执行 SMOTE