我正在尝试通过留一法交叉验证来评估一个多变量数据集,然后移除那些对原始数据集没有预测能力的样本(经过本杰明校正,FDR > 10%
)。
通过查阅交叉验证文档,我找到了留一法迭代器。然而,当我试图获取第n折的得分时,抛出了一个异常,指出需要多个样本。为什么.predict()
可以工作而.score()
不行?我如何获取单个样本的得分?我是否需要使用另一种方法?
未成功的代码:
from sklearn import ensemble, cross_validation, datasetsdataset = datasets.load_linnerud()x, y = dataset.data, dataset.targetclf = 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])
来实现