我试图通过留一交叉验证来评估多变量数据集,然后删除那些不能预测原始数据集的样本(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.
[编辑,澄清]:
我不是在问为什么这不起作用,而是采用不同的方法。在拟合/训练我的模型后,如何测试单个样本与训练模型的匹配程度?
答案 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])