在评分之前对交叉验证预测进行后处理。

3

我有一个回归问题,正在进行交叉验证并评估性能。我事先知道,真实值不能小于零。因此,我想在预测传递到分数度量之前截断预测以将其限制为零。我认为使用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个回答

3

你可以做的一件事是使用 make_scorer() 函数来包装你想要使用的得分函数(如r2_scoremean_squared_error)以创建一个自定义得分器函数,就像你建议的那样。

可以参考sklearn文档中的这个部分Stack Overflow 上的这篇文章获取一些示例。 特别是,你的函数可以像这样:

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)

谢谢!我确实查看了那些资源。我只是对那些(截取)评估指标如何知道y_pred感到困惑?这应该从每个折叠的内部传递。是否可以在cross_validate中定义y_pred呢?无论如何我都会尝试的。 - Armannas
1
这是在cross_validate函数内部发生的。如果您感兴趣,可以查看源代码,但是由于您必须在许多函数之间跳转以跟踪数据实际用于拟合和评分模型的位置,因此有点难以阅读。但是,是的,y_pred和y_test是每个交叉验证折叠的结果。 - Mihai Chelaru
我之前研究过源代码,但由于我的技能有限,无法理解这个复杂的代码:P。感谢您的确认,这个方法完美而且简洁!我差点使用Kfold来完成它。 - Armannas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接