Почему оценка GridSearchCV отличается от оценки его лучшего оценщика после подбора?

Я пытаюсь реализовать корреляцию Пирсона как функцию потерь для проблемы регрессии, используя "make_scorer" из sklearn, и до сих пор я определял свою метрику как:

from sklearn.metrics import make_scorer
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.svm import LinearSVR

def pearson_metric(y_pred,y_true):
  y_true_m=y_true.mean()
  y_pred_m=y_pred.mean()
  B=((y_true-y_true_m)*(y_pred-y_pred_m)).sum()
  C=((y_true-y_true_m)**2).sum()
  D=((y_pred-y_pred_m)**2).sum()
  metric=B/np.sqrt(C*D)
  return metric

Затем я определяю своего бомбардира как:

pearson_scorer = make_scorer(pearson_metric, greater_is_better=False)

Насколько я понимаю, параметр "better_is_better" используется для обучения модели максимизации или минимизации настраиваемой метрики, в моем случае я предпочитаю минимизировать корреляцию Пирсона, которая при минимуме может получить значение -1, чтобы получить классификатор, который предсказывал бы вектор, линейно противоположный вектору y_true меток. В данный момент меня не интересует, насколько предсказанные значения близки к истинным значениям, а только по их линейному сходству. После этого я тренирую его так:

grid = GridSearchCV(LinearSVR(), param_grid={'C': [1, 10]},scoring=pearson_scorer, verbose=0,cv=5)
grid.fit(X_train.to_frame(),y_train)

X_train и y_train - это просто значения прямой линии:

df=pd.DataFrame([i for i in range(100)],columns=['x'])
df['y']=[2*i for i in range(100)]
x,y=df['x'],df['y']
X_train, X_test, y_train, y_test = train_test_split(x,y, test_size=0.3)

Теперь, после того, как я сделал примерку, я вызову метод оценки в сетке, например:

grid.score(X_test.to_frame(),y_test)

Я получаю результат -1.0, что имеет смысл как better_is_better =False, однако, если я вызываю тот же метод для лучшего классификатора, например:

clf=grid.best_estimator_
clf.score(X_test.to_frame(),y_test)

я получаю результат 1.0 вместо -1.0, как я ожидал. Не могли бы вы помочь мне понять, почему я получаю такой результат и чем отличается метод оценки? Спасибо!

0 ответов

Другие вопросы по тегам