Вычисление mse из переданной модели

Я пытаюсь построить график среднеквадратичной ошибки моих данных, и мне немного трудно понять, как это сделать. Я знаю, что вам нужно как «истинное» значение, так и «прогнозируемое» значение, чтобы получить mse, но то, как устроен мой проект, довольно запутанно.

У меня есть метод, в котором я создаю модель следующим образом:

def fit_curve(X, y, degree):
    poly_features = PolynomialFeatures(degree = degree)
    x_poly = poly_features.fit_transform(X)
    linreg = LinearRegression()
    model = linreg.fit(x_poly, y)
    return model

Это возвращает уже обученную модель.

Затем я должен найти среднеквадратичную ошибку для указанной модели. Я не уверен, как я должен это сделать, поскольку модель уже обучена без возврата прогнозируемых значений. Прямо сейчас мой метод, который вычисляет mse:

def mse(X, y, degree, model):
    poly_features = PolynomialFeatures(degree = degree)
    linreg = LinearRegression()
    x_poly = poly_features.fit_transform(X)
    linreg.fit(x_poly, y)
    y_predict = linreg.predict(x_poly)
    mse = mean_squared_error(y_predict, y)
    return mse

Я чувствую, что большая часть кода, который я использую в mse, очень избыточна по сравнению с fit_curve. К сожалению, в рекомендациях говорится, что мне нужно сделать это так (с mse, принимающим X, y, degree и model.

Я думаю, также стоит отметить, что мой текущий mse работает правильно примерно до 13-14 градусов, когда ответ, который он генерирует на графике, не соответствует решению, которое мне дали. Я не уверен, почему это не работает идеально, потому что я думал, что это была правильная идея.


person larn    schedule 11.03.2020    source источник


Ответы (1)


Вещи должны быть сделаны таким образом:

1) Разделите ваши X и y на обучающие и тестовые наборы. Для этого вы можете использовать train_test_split. Вы можете выбрать свой test_size (в качестве примера я поставил 0,33) и random_state (это помогает с воспроизводимостью).

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

2) Сопоставьте свою модель (здесь, линейная регрессия), используя X_train и y_train. У вас есть какой-то метод генерации признаков (полиномиальный), это здорово. Используйте его с обучающими данными.

poly_features = PolynomialFeatures(degree=degree)
linreg = LinearRegression()
X_train_poly = poly_features.fit_transform(X_train)
linreg.fit(X_train_poly, y_train)

3) Оцените свою подобранную модель, посмотрев, может ли она правильно прогнозировать невидимые данные (X_test). Для этого вы действительно можете использовать mean_squared_error с model.predict(X_test) и y_test. Осторожно, вы должны применить к X_test то же преобразование, что и к X_train (поэтому мы сначала используем poly_features.transform)

X_test_poly = poly_features.transform(X_test)
print(mean_squared_error(linreg.predict(X_test_poly), y_test))

Надеюсь, это поможет.

person Arnaud    schedule 11.03.2020
comment
Это имеет смысл, спасибо! Меня очень смущала функция train_test_split, поэтому я решил, что могу делать все, что захочу, и без нее. Вы действительно прояснили это для меня, хотя! :-) Спасибо! - person larn; 11.03.2020
comment
Большой! И я думаю, также очень важно подчеркнуть, что предварительная обработка (стандартизация, расширение функций) должна быть подогнана на X_train только, но применена к X_test во время предсказания. В противном случае, если вы соответствуете шагу предварительной обработки полному X, вы в основном пропускаете информацию из тестового дистрибутива в обучающий дистрибутив... это жульничество! - person Arnaud; 11.03.2020