留一交叉验证

3
我正在尝试通过留一法交叉验证来评估一个多变量数据集,然后删除那些对原始数据集没有预测能力的样本(经过Benjamini校正,FDR > 10%)。
使用交叉验证文档,我找到了留一法迭代器。但是,在尝试获取第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个回答

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])


尽管这是正确的,但它并没有回答我的问题。"我正在尝试通过留一法交叉验证来评估多变量数据集,然后删除那些不能预测原始数据集的样本。我如何获得单个样本的得分?" 请仔细阅读问题。 - dwitvliet
好的,你的问题刚刚改变了。答案解释了为什么需要两个数据点才能获得分数,这是基于近似一条直线(或曲线),然后找到实际数据点与该直线/曲线之间的距离。你需要两个点来生成一条线。而预测则沿着单个维度进行,要么正确,要么错误。这就是为什么它只需要一个数据点。 - Shashank Agarwal
这可能有助于解释r2值 - http://www.graphpad.com/guides/prism/6/curve-fitting/index.htm?reg_diagnostics_tab_7_2.htm - Shashank Agarwal
我知道为什么它不起作用。我正在寻求一种不同的方法(以实现我想要的结果),这种方法可以奏效。在拟合/训练数据集之后,如何测试一个样本/点与训练模型的匹配程度? - dwitvliet
你可以预测数值,然后计算实际值和预测值之间的距离。numpy.linalg.norm(clf.predict(x[test_i])[0] - y[test_i]) - Shashank Agarwal
谢谢,这是个好主意。我可以在聊天室里再问你一些问题吗? - dwitvliet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接