Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在交叉验证中去掉一个_Python_Machine Learning_Scikit Learn - Fatal编程技术网

Python 在交叉验证中去掉一个

Python 在交叉验证中去掉一个,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我试图通过省略交叉验证来评估多变量数据集,然后删除那些不能预测原始数据集的样本(Benjamini校正,FDR>10%) 使用,我找到了遗漏迭代器。然而,当试图获得第n次得分时,会出现一个异常,表示需要多个样本。为什么.predict()有效,而.score()无效?如何获得单个样本的分数?我需要使用另一种方法吗 不成功代码: from sklearn import ensemble, cross_validation, datasets dataset = datasets.load_lin

我试图通过省略交叉验证来评估多变量数据集,然后删除那些不能预测原始数据集的样本(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))
结果异常:

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_分数只能在多个样本的情况下计算。

[编辑,澄清]:

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

我不是问为什么这不起作用,而是问一种不同的方法。拟合/训练我的模型后,如何测试单个样本与训练模型的拟合程度?

交叉验证。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])

虽然这是事实,但它并没有回答我的问题。“我试图通过忽略交叉验证来评估多变量数据集,然后删除那些无法预测原始数据集的样本。如何获得单个样本的分数?”请仔细阅读问题。好的,您的问题刚刚更改。答案解释了为什么需要两个数据点来获得分数,分数基于近似直线(或曲线),然后找到实际数据点与该直线/曲线的距离。生成一条直线需要两个点。另一方面,预测是沿着一个维度进行的,要么你是正确的,要么你是错误的。这就是为什么它只需要一个数据点。这可能有助于解释r2值-我知道它为什么不工作。我要求的是另一种可行的方法(实现我想要的目标)。在拟合/训练我的数据集后,如何测试一个样本/点相对于训练模型的优劣?您可以得到预测值,然后得到实际值和预测值之间的距离<代码>numpy.linalg.norm(clf.predict(x[test\u i])[0]-y[test\u i])