Python 如何在sklearn中同时获得预测值和误差度量

Python 如何在sklearn中同时获得预测值和误差度量,python,machine-learning,scikit-learn,regression,Python,Machine Learning,Scikit Learn,Regression,我有两个单独的python函数,其中一个使用cross\u val\u predict返回数据集的预测值,另一个使用cross\u validate返回多个错误度量值。下面显示的是用于获取度量值的方法(我已经实现了一个类似的方法来获取预测) 我不想同时使用这两个函数,因为它的计算代价很高。有没有一种方法或替代方法可以同时获得预测和指标?在sklearn中没有预定义的函数可以同时计算预测和性能指标。 但是,您可以使用检索所有性能指标。可以装配记分器,以便它返回预测,尽管这有点麻烦。以下是如何做到这

我有两个单独的python函数,其中一个使用
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