Среднеквадратичная ошибка в scikit выучить RidgeCV

Мой вопрос: в sklearn, как cv_values_ дано RidgeCV рассчитывается? почему это отличается с выходом из metrics.mean_squared_error?

Например,

X = [1,2,3,4,5,6,7,8,9,10]
X = np.array(X).reshape(-1,1)
y = np.array([1,3.5,4,4.9,6.1,7.2,8.1,8.9,10,11.1])
ax.plot(X, y, 'o')
ax.plot(X, X+1, '-') # help visualize

введите описание изображения здесь

Скажем, мы тренируем модель хребта по X и Y

from sklearn.linear_model import RidgeCV
from sklearn.metrics import mean_squared_error
model = RidgeCV(alphas = [0.001], store_cv_values=True).fit(X, y)

Теперь вывод

mean_squared_error(y_true=y, y_pred=model.predict(X))

является 0.1204000013110009, а на выходе

model.cv_values_.mean()

является 0.24472577167818438,

Почему такая огромная разница? Я что-то упускаю из виду?

1 ответ

Решение

С официальной ссылки сайта

cv_values_

Значения перекрестной проверки для каждой альфы (если store_cv_values ​​=True и cv = None). После вызова fit() этот атрибут будет содержать среднеквадратичные ошибки (по умолчанию) или значения функции _func {loss, score} (если это предусмотрено в конструкторе).

В вашем случае, когда вы звоните

model = RidgeCV(alphas = [0.001], store_cv_values=True).fit(X, y)

у тебя есть: cv=None

cv=None означает, что вы используете перекрестную проверку Leave-One-Out.

Так cv_values хранит среднеквадратичную ошибку для каждого образца с использованием перекрестной проверки Leave-One. В каждом фолде у вас есть только 1 контрольная точка и, следовательно, n = 1. Так cv_values_ даст вам квадратичную ошибку для каждого пункта в вашем наборе данных тренировки, когда он был частью тестового сгиба.

Наконец, это означает, что когда вы звоните model.cv_values_.mean()Вы получаете среднее значение этих отдельных ошибок (среднее значение каждой ошибки для каждой точки). Чтобы увидеть эти отдельные ошибки, вы можете использовать print(model.cv_values_)

Индивидуальный означает, что n = 1 в следующем уравнении:

введите описание изображения здесь

С другой стороны, mean_squared_error(y_true=y, y_pred=model.predict(X)) означает, что вы положили n=10 в этом уравнении.

Таким образом, 2 результата будут отличаться.

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