cross_val_score与另一种计算准确性的方法之间的区别

时间:2018-09-09 07:59:04

标签: machine-learning scikit-learn cross-validation knn

我试图计算准确性,但感到困惑的是,cross_val_score给出的结果要低得多,而不是将预测结果与正确结果进行比较。

第一种计数方法,即给出

[0.8033333333333333, 0.7908333333333334, 0.8033333333333333, 0.7925,0.8066666666666666]

kf = KFold(shuffle=True, n_splits=5)
scores = []

for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    model = KNeighborsClassifier(n_jobs=-1, n_neighbors=5)
    model.fit(X_train, y_train)

    y_pred = model.predict(X_test)

    scores.append(np.sum(y_pred == y_test) / len(y_test))

第二种方式给出array([0.46166667, 0.53583333, 0.40916667, 0.44666667, 0.3775 ])

model = KNeighborsClassifier(n_jobs=-1, n_neighbors=5)
cross_val_score(model, X, y, cv = 5, scoring='accuracy')

我怎么了?

2 个答案:

答案 0 :(得分:-1)

cross_val_score中的低分可能是因为您向其提供了完整的数据,而不是将其分为测试和训练集。这通常会导致信息泄漏,从而导致您的模型给出错误的预测。有关更多说明,请参见this post

参考

答案 1 :(得分:-1)

除非另外指定,否则

cross_val_score将使用StratifiedKFold cv迭代器。 StratifiedKFold将在训练和测试拆分中以相同的方式保持类的比率平衡。有关更多说明,请参见此处的其他答案:-

另一方面,在您的第一种方法中,您正在使用KFold,它将无法保持类的平衡。另外,您正在其中进行数据改组。

因此,在每种情况下,两种方法都有数据差异,因此结果也不同。