MSE регрессии Полфит NumPy для нескольких степеней

Вот что у меня так далеко:

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

Мой первый фрейм данных:

X = np.linspace(0, 18, num=10)
Y = (0.05*X**2)+4*np.sin(X)+1.15*X+2*np.random.randn()

combi = {'X':X, 'Y':Y}
train = pd.DataFrame(combi)
print(train)

Мой второй фрейм данных:

X1 = np.random.uniform(0, 20, size=10)
Y1 = (0.05*X1**2)+4*np.sin(X1)+1.15*X1+2*np.random.randn()

combi2 = {'X':X1, 'Y':Y1}
test = pd.DataFrame(combi2)
print(test)

Я использую NumPy, чтобы найти различные подходящие модели, например:

linear = np.polyfit(X, Y, 1)
linear_fn = np.poly1d(linear)
#linear_fn is now a function which takes in X and returns an estimate for Y
quadratic = np.polyfit(X, Y, 2)
quadratic_fn = np.poly1d(quadratic)
#quadratic_fn is now a function which takes in X and returns an estimate for Y

и т.п.

Я создал два пустых списка:

train_mse = []
test_mse = []

Я попробовал следующее, что я знаю, очень, очень неправильно!:

for i in range (0, 8):
a = np.polyfit (X, Y, i)
b = np.poly1d(a)
c = np.sum(b - Y)
d = np.sum(c)
e = d/10

1 ответ

Решение

Как указано в моем комментарии, MSE (среднеквадратическая ошибка) требуется квадрат и среднее значение, например, как в:

mse = ((y - y_hat)**2).mean()

с условными обозначениями y для данных измерений / справочных данных и y_hat для прогноза / прогнозных данных. Кроме того, я бы рекомендовал использовать более описательные имена переменных, a, b, c и т.д. будет сбивать с толку, как только ваш код растет. Также "аутсорсинг" всего в функции поможет уменьшить сложность и т. Д. (См. "Функциональное программирование" в вики для получения информации о преимуществах и недостатках).

Таким образом, мое решение для вашей проблемы определяет функцию mse_fitter которая будет соответствовать вашей регрессии LSE и вернуть значения MSE. Затем эту функцию можно вызвать из цикла for. То, что вы забыли после создания подгонки регрессии, это на самом деле предсказать значения для расчета MSE. Это сделано в строках y_hat_train = fit_model(data_train.X) а также y_hat_test = fit_model(data_test.X),

def mse_fitter(data_train, data_test, degree):
    fit_coeffs = np.polyfit(data_train.X, data_train.Y, degree)  # fit regression
    fit_model = np.poly1d(fit_coeffs)  # make coefficients into a callable function
    y_hat_train = fit_model(data_train.X)  # make prediction with training data
    y_hat_test = fit_model(data_test.X)  # make prediction with test data
    mse_train = ((data_train.Y - y_hat_train)**2).mean()  # get train mse
    mse_test = ((data_test.Y - y_hat_test)**2).mean()  # get test mse
    return mse_train, mse_test  # return mse values

train_mse = []
test_mse = []
for i in range(0, 8):
    mse_train, mse_test = mse_fitter(train, test, i)  # call mse_fitter
    train_mse.append(mse_train)  # append train mse to list
    test_mse.append(mse_test)  # append test mse to list

Дальнейшие улучшения могут, например, включать: Определение MSE-функции, которая может быть вызвана из mse_fitter функция. Добавление извлеченного кортежа mse_fitter результат прямо в список. так далее...

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