Sklearn 交叉验证产生与手动执行不同的结果
Sklearn cross validation produces different results than manual execution
使用 Sklearn,我在 Python 中使用 Logistic 回归进行监督学习。我还使用交叉验证来测试我的预测准确性。
我想测试自己做交叉验证时是否有类似的结果。这是结果:
# 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
train_test_split
使用随机训练和测试集拆分,而 cross_val_score(cv=10)
使用分层 k 折交叉验证。
尝试使用 cv=ShuffleSplit(test_size=0.1)。那应该会给你更多相似的结果。它不会使用与您相同的随机播种,因此它们可能仍会有所不同。不过,如果它们彼此不在标准范围内,那就很奇怪了。
使用 Sklearn,我在 Python 中使用 Logistic 回归进行监督学习。我还使用交叉验证来测试我的预测准确性。
我想测试自己做交叉验证时是否有类似的结果。这是结果:
# 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
train_test_split
使用随机训练和测试集拆分,而 cross_val_score(cv=10)
使用分层 k 折交叉验证。
尝试使用 cv=ShuffleSplit(test_size=0.1)。那应该会给你更多相似的结果。它不会使用与您相同的随机播种,因此它们可能仍会有所不同。不过,如果它们彼此不在标准范围内,那就很奇怪了。