Python 如何在sklearn中同时获得预测值和误差度量
我有两个单独的python函数,其中一个使用Python 如何在sklearn中同时获得预测值和误差度量,python,machine-learning,scikit-learn,regression,Python,Machine Learning,Scikit Learn,Regression,我有两个单独的python函数,其中一个使用cross\u val\u predict返回数据集的预测值,另一个使用cross\u validate返回多个错误度量值。下面显示的是用于获取度量值的方法(我已经实现了一个类似的方法来获取预测) 我不想同时使用这两个函数,因为它的计算代价很高。有没有一种方法或替代方法可以同时获得预测和指标?在sklearn中没有预定义的函数可以同时计算预测和性能指标。 但是,您可以使用检索所有性能指标。可以装配记分器,以便它返回预测,尽管这有点麻烦。以下是如何做到这
cross\u val\u predict
返回数据集的预测值,另一个使用cross\u validate
返回多个错误度量值。下面显示的是用于获取度量值的方法(我已经实现了一个类似的方法来获取预测)
我不想同时使用这两个函数,因为它的计算代价很高。有没有一种方法或替代方法可以同时获得预测和指标?在sklearn中没有预定义的函数可以同时计算预测和性能指标。
但是,您可以使用检索所有性能指标。可以装配记分器,以便它返回预测,尽管这有点麻烦。以下是如何做到这一点:
cross\u validate()
函数可以采用自定义评分函数。评分函数必须返回一个数字,但您可以在函数内执行任何操作。因为您有clf
和所有测试数据,所以只需保存clf.predict()
的输出,然后返回一个伪值以使记分员满意。有关更多信息,请参阅sklearn docs on
像这样:
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split, cross_validate, cross_val_predict
# example data
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = svm.SVC(probability=True, random_state=0)
定义自定义的get_preds()
函数,将其作为记分器潜入:
def get_preds(clf, X, y): # y is required for a scorer but we won't use it
with open("pred.csv", "ab+") as f: # append each fold to file
np.savetxt(f, clf.predict(X))
return 0
scoring = {'preds': get_preds,
'accuracy': 'accuracy',
'recall': 'recall_macro'} # add desired scorers here
k = 5
cross_validate(clf, X, y,
scoring=scoring,
return_train_score=True,
cv = k)
加载get_preds()
preds = np.loadtxt("pred.csv").reshape(k, len(X))
my_preds = np.mean(my_preds, axis=0).round()
与cross\u val\u predict()
预测进行比较:
cv_preds = cross_val_predict(clf, X, y, cv=k)
np.equal(my_preds, cv_preds).sum() # 487 out of 500
我们在这里看到了临时的get\u preds()
方法和cross\u val\u predict()
之间几乎完美的一致性。这种微小的差异可能是由于我的平均方法不同于cross\u val\u predict
(我只是四舍五入到最接近的整数类,不是很复杂),也可能与下面这个略显神秘的注释有关:
请注意,此计算的结果可能与使用cross_val_分数获得的结果略有不同,因为元素以不同的方式分组
显示您如何定义折叠
和评分
,我们可以制作一个简单的函数来实现这一点。我已编辑以包含更多详细信息。感谢什么是折叠
?折叠
指的是k折叠交叉验证所需的折叠次数
。例如,对于10次交叉验证
,它可以是10次
。您能详细说明一下吗cross\u validate()
是k-fold验证,它只是有一个默认值cv=3
(其中cv
是k
的kwarg)。但是您可以为cv
参数传入任何值k
,它工作正常。(我刚刚检查了这个示例数据的cv=5
)我得到了那个部分。那么clf.predict(X)
是否提供了与cross\u val\u predict
相同的结果呢?我也想得到预测值,但当我应用10倍交叉验证并尝试打印出值时,它给出了大量不同于cross\u val\u predict
的值。请参阅更新-我有一两个错误,但我的解决方案现在看起来基本上与cross\u val\u predict
一致。这也适用于您吗?它返回的值比数据集本身多,因此出现以下错误ValueError:无法将大小为3510的数组重塑为形状(10117)
。您能否确认我的解决方案对我提供的示例数据有效?如果您不能提供详细的数据,那么就有点难知道您的数据发生了什么。首先用这个解决方案确认您的问题在一般情况下得到了回答,然后让我们看看我们是否能够找出您的数据和/或代码在哪里存在某种边缘情况,这会把事情搞砸。
cv_preds = cross_val_predict(clf, X, y, cv=k)
np.equal(my_preds, cv_preds).sum() # 487 out of 500