我正在尝试通过留一交叉验证来评估多变量数据集,然后删除那些不能预测原始数据集的样本(Benjamini 校正,FDR > 10%
)。
使用docs on cross-validation ,我找到了留一迭代器。然而,当尝试获取第 n 次折叠的分数时,会出现一个异常(exception),即需要多个样本。为什么 .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.
[编辑,澄清]:
我不是问为什么这不起作用,而是问另一种可行的方法。拟合/训练模型后,如何测试单个样本与训练模型的拟合程度?
最佳答案
cross_validation.LeaveOneOut(x.shape[0])
正在创建与行数一样多的折叠。这会导致每次验证运行仅获得一个实例。
现在,要绘制一条“线”,您需要两个点,而对于您的一个实例,您只有一个点。这就是您的错误消息所说的,它需要多个实例(或样本)来绘制将用于计算 r^2 值的“线”。
通常,在机器学习领域,人们会报告 10 倍或 5 倍交叉验证结果。所以我建议设置n
相应地为 10 或 5。
编辑:在与@banana进行快速讨论后,我们意识到这个问题最初没有被正确理解。由于不可能获得单个数据点的 R2 分数,因此另一种方法是计算实际点与预测点之间的距离。这可以使用以下方法完成
numpy.linalg.norm(clf.predict(x[test_i])[0] - y[test_i])
关于python - 留一交叉验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890684/