Отличная RMSE от cross_validate и итерации Kfolds

Я хочу написать свою собственную функцию для перекрестной проверки, поскольку в этой ситуации я не могу использовать cross_validate.

Исправьте меня, если я ошибаюсь, но мой код перекрестной проверки:

cv = cross_validate(elastic.est,X,y,cv=5,scoring='neg_mean_squared_error')

выход:

{'fit_time': array([3.90563273, 5.272861  , 2.19111824, 6.42427135, 5.62084389]),
 'score_time': array([0.05504966, 0.06105542, 0.0530467 , 0.06006551, 0.05603933]),
 'test_score': array([-0.00942235, -0.01220626, -0.01157624, -0.00998556, -0.01144867])}

Итак, я сделал это, чтобы вычислить RMSE.

math.sqrt(abs(cv["test_score"]).mean())

Результат всегда около 0,104.

Затем я написал приведенную ниже функцию для цикла kFolds, и я всегда получаю гораздо более низкий показатель RMSE (и он работает примерно в 10 раз быстрее)

def get_rmse(y_true,y_pred):    
    score = math.sqrt(((y_pred-y_true) ** 2).mean())
    return score

listval=[]

kf = KFold(n_splits=5,shuffle=True)

for train_index, test_index in kf.split(X,y):

    Xx = np.array(X)
    yy = np.array(y)

    X_train, X_test = Xx[train_index], Xx[test_index]
    y_train, y_test = yy[train_index], yy[test_index]

    elastic.est.fit(X_train,y_train)
    preds = elastic.est.predict(X_test)
    listval.append(get_rmse(y_test,preds))

np.mean(listval)

Результат равен 0,0729 и всегда находится около этого значения.

Что мне не хватает? Те же данные, тот же эситматор, такое же количество складок?

1 ответ

Решение

Разница, которую вы наблюдаете, заключается в том, что вы вычисляете окончательное число по-разному:

  • для cross_validate выведите сначала среднее значение MSE по складкам, а затем извлеките квадратный корень.
  • для пользовательской реализации вы сначала берете корень, а только потом усредняете значения по складкам.

Конечно, в общем случае корень из среднего не равен среднему из корней.

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