使用下面代码中所示的k -fold 方法cross_val_predict(参见doc,v0.18)是否计算每次折叠的准确度并最终平均它们?
cv = KFold(len(labels), n_folds=20)
clf = SVC()
ypred = cross_val_predict(clf, td, labels, cv=cv)
accuracy = accuracy_score(labels, ypred)
print accuracy
Run Code Online (Sandbox Code Playgroud) 当我通过交叉验证训练 SVC 时,
y_pred = cross_val_predict(svc, X, y, cv=5, method='predict')
Run Code Online (Sandbox Code Playgroud)
cross_val_predict返回 X 中每个元素的一个类预测,因此y_pred.shape = (1000,)当m=1000. 这是有道理的,因为cv=5SVC 在 X 的不同部分上进行了 5 次训练和验证。在这五次验证中,每一次都对五分之一的实例进行了预测 ( m/5 = 200)。随后,将 5 个向量(每个向量包含 200 个预测)合并为y_pred.
y_pred考虑到所有这些,我使用和 y计算 SVC 的整体精度是合理的。
score = accuracy_score(y, y_pred)
Run Code Online (Sandbox Code Playgroud)
但是(!)cross_val_predict声明的文档:
cross_val_predict 的结果可能与使用 cross_val_score 获得的结果不同,因为元素以不同的方式分组。函数 cross_val_score 取交叉验证折叠的平均值,而 cross_val_predict 只是简单地返回来自几个不同模型的标签(或概率)。因此,cross_val_predict 不是泛化误差的适当度量。
有人可以换句话解释一下,为什么cross_val_predict不适合测量泛化误差,例如 via accuracy_score(y, y_pred)?
编辑:
我首先假设在cv=55 个验证中的每一个都会对 X 的所有实例进行预测。但这是错误的,每次验证仅对 X 的 1/5 实例进行预测。