留一交叉验证

时间:2014-07-22 14:51:57

标签: python machine-learning scikit-learn

我试图通过留一交叉验证来评估多变量数据集,然后删除那些不能预测原始数据集的样本(Benjamini-corrected,FDR > 10%)。

使用docs on cross-validation,我找到了留一个迭代器。然而,当试图获得第n折的分数时,提出了一个例外,即需要多个样本。为什么.predict().score()不起作用时有效?如何获得单个样本的分数?我需要使用其他方法吗?

代码不成功:

from sklearn import ensemble, cross_validation, datasets

dataset = datasets.load_linnerud()
x, y = dataset.data, dataset.target
clf = ensemble.RandomForestRegressor(n_estimators=500)

loo = cross_validation.LeaveOneOut(x.shape[0])
for train_i, test_i in loo:
    score = clf.fit(x[train_i], y[train_i]).score(x[test_i], y[test_i])
    print('Sample %d score: %f' % (test_i[0], score))

产生的异常:

ValueError: r2_score can only be computed given more than one sample.


[编辑,澄清]:

我不是在问为什么这不起作用,而是采用不同的方法。在拟合/训练我的模型后,如何测试单个样本与训练模型的匹配程度?

1 个答案:

答案 0 :(得分:1)

cross_validation.LeaveOneOut(x.shape[0])创建的行数与行数一样多。这导致每个验证运行只获得一个实例。

现在,要画一条“线”,你需要两个点,而对于你的一个实例,你只有一个点。这就是您的错误消息所说的,它需要多个实例(或样本)来绘制将用于计算r ^ 2值的“线”。

通常,在ML世界中,人们会报告10倍或5倍的交叉验证结果。所以我建议相应地将n设置为10或5。

编辑:经过与@banana的快速讨论后,我们意识到最初没有正确理解这个问题。由于无法获得单个数据点的R2分数,因此可以选择计算实际点和预测点之间的距离。这可以使用 numpy.linalg.norm(clf.predict(x[test_i])[0] - y[test_i])