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
результат прямо в список. так далее...