python - 留一交叉验证

标签 python machine-learning scikit-learn

我正在尝试通过留一交叉验证来评估多变量数据集,然后删除那些不能预测原始数据集的样本(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/

相关文章:

python - 重新引发异常时如何避免在 pytest 中显示原始异常?

python - 使用内置 Numpy.fft 在 Python 中进行 FFT 多项式乘法

python - 奇怪的饼图被截断

python - 机器学习中回归的局限性?

样本数量不一致的 Python Sklearn 变量

python - 具有多对多关系模型的 Flask-Admin View

python - 具有 98% 测试准确率的 ConvNet,总是预测错误

amazon-web-services - 如何在此 cloudformation 模板的 aws cli 命令中插入参数?

python - "KeyError: 0"与 xgboost、scikit-learn 和 pandas

python - 如何在Python中对3D数组进行聚类?