Одна вещь, которую вы можете сделать, это обернуть те счетчики, которые вы хотите использовать (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)