пост-процессное перекрестное подтверждение прогноза перед подсчетом баллов - PullRequest
0 голосов
/ 06 октября 2018

У меня проблема регрессии, когда я перекрестно проверяю результаты и оцениваю производительность.Я заранее знаю, что основная правда не может быть меньше нуля.Поэтому я хотел бы перехватить прогнозы, прежде чем они будут поданы в метрику оценки, чтобы обрезать прогнозы до нуля.Я думал, что использование функции 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 голосов
/ 06 октября 2018

Одна вещь, которую вы можете сделать, это обернуть те счетчики, которые вы хотите использовать (r2_score, mean_squared_error), в пользовательскую функцию счетчика, используя make_scorer(), как вы предложили.

Посмотрите на эта часть документации sklearn и эта публикация переполнения стека для некоторых примеров.В частности, ваша функция может делать что-то вроде этого:

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_score или mean_squared_error),Затем, чтобы использовать его, просто используйте make_scorer, как вы делали выше, устанавливая greater_is_better в зависимости от того, является ли оценщик функцией оценки (например, r2, больше, лучше) или функцией потерь (mean_squared_error лучше, когда он равен 0, т.е. меньше):

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)
...