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

时间:2018-08-13 05:39:25

标签: python machine-learning scikit-learn regression

我有两个独立的python函数,其中一个函数使用cross_val_predict返回数据集的预测值,另一个函数使用cross_validate返回多个错误度量值。下面显示的是用于获取指标值的方法(我已经实现了类似的方法来获取预测值)。

def metric_val(folds):
.
.
.
scoring = {'r_score': 'r2',
           'abs_error': 'neg_mean_absolute_error',
           'squared_error': 'neg_mean_squared_error'}

scores = cross_validate(best_svr, X, y, scoring=scoring, cv=folds, return_train_score=True)

print("****\nR2 :", "", scores['test_r_score'].mean(),
      "| MAE :", scores['test_abs_error'].mean(),
      )
return prediction

由于计算量大,我不想同时使用这两个函数。是否有一种方法或另一种方法可以同时获得预测和指标?

2 个答案:

答案 0 :(得分:4)

有可能操纵一个计分器,使其返回预测,尽管这有点麻烦。操作方法如下:

cross_validate()函数可以采用自定义评分函数。计分函数必须返回一个数字,但是您可以在函数内执行任何操作。由于您拥有clf和所有测试数据,因此只需保存clf.predict()的输出,然后返回一个虚拟值即可使记分员满意。有关更多信息,请参见Implementing your own scoring object上的sklearn文档。

赞:

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()函数,将其作为scorer潜入:

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_val_predict()个预测进行比较:

cv_preds = cross_val_predict(clf, X, y, cv=k)

np.equal(my_preds, cv_preds).sum() # 487 out of 500

我们在这里临时get_preds()cross_val_predict()之间达成了几乎完美的协议。较小的差异可能是由于我的平均方法与cross_val_predict的平均方法不同(我只是四舍五入到最接近的整数类,不是很复杂),或者它可能与{ {3}}:

  

请注意,由于元素以不同的方式分组,因此此计算的结果可能与使用cross_val_score获得的结果略有不同。

答案 1 :(得分:2)

没有预定义的函数可以计算sklearn中的预测指标和性能指标。 但是您可以使用sklearn.metrics检索所有性能指标。