评分前的后处理交叉验证预测

时间:2018-10-06 13:58:09

标签: python scikit-learn cross-validation

我有一个回归问题,我正在交叉验证结果并评估性能。我事先知道,基本事实不能小于零。因此,在将预测提供给评分指标之前,我想对其进行拦截,以将预测限制为零。我认为使用make_scorer函数将对此有用。是否可以在交叉验证之后但在对其应用评估指标之前以某种方式对预测进行后处理?

from sklearn.metrics import mean_squared_error, r2_score, make_scorer
from sklearn.model_selection import cross_validate

# X = Stacked feature vectors
# y = ground truth vector
# regr = some regression estimator

#### How to indicate that the predictions need post-processing 
#### before applying the score function???
scoring = {'r2': make_scorer(r2_score),
           'neg_mse': make_scorer(mean_squared_error)}

scores = cross_validate(regr, X, y, scoring=scoring, cv=10)

PS:我知道估计量有限,但是我想看看像这样的启发式方法将如何执行。

1 个答案:

答案 0 :(得分:2)

您可以做的一件事就是按照您的建议,使用r2_score将想要使用的得分器(mean_squared_errormake_scorer())包装在自定义得分器功能中。

请看this part of the sklearn documentationthis Stack Overflow post的一些示例。特别是,您的函数可以执行以下操作:

def clipped_r2(y_true, y_pred):
    y_pred_clipped = np.clip(y_pred, 0, None)
    return r2_score(y_true, y_pred_clipped)

def clipped_mse(y_true, y_pred):
    y_pred_clipped = (y_pred, 0, None)
    return mean_squared_error(y_true, y_pred_clipped)

这使您可以在调用计分功能(在这种情况下为r2_scoremean_squared_error之前,在计分器中进行后处理。然后要像上面一样使用make_scorer来使用它,根据记分器是计分函数(如r2,越大越好)或损失函数(当它为0时,mean_squared_error更好,即更少)来设置greater_is_better ):

scoring = {'r2': make_scorer(clipped_r2, greater_is_better=True),
           'neg_mse': make_scorer(clipped_mse, greater_is_better=False)}
scores = cross_validate(regr, X, y, scoring=scoring, cv=10)