Расчет mse по модели, переданной в - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь изобразить среднеквадратичную ошибку моих данных, и у меня есть небольшая трудность, чтобы понять, как это сделать. Я знаю, что вам нужно и "истинное" значение, и "прогнозируемое" значение, чтобы получить значение 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 градусов, где ответ, который он генерирует на графике, не соответствует решению, которое мне дали. Я не уверен, почему это не работает идеально, потому что я думал, что это правильная идея .

1 Ответ

1 голос
/ 11 марта 2020

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

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))

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

...