Как построить полиномиальную регрессию и рассчитать среднеквадратичную ошибку с Python? - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть приложение, которое использует фрейм данных, интересующие столбцы которого - значения pm2.5 и значения даты. У меня более 43 000 значений, зарегистрированных в кадре данных, и цель состоит в том, чтобы использовать регрессию полиномиальной модели для прогнозирования значений для pm2.5. Я должен использовать 70% в качестве моих данных и 30% в качестве теста и сравнивать значения между реальными и прогнозными значениями. Для этого я использую среднеквадратическую ошибку. Пока мне удалось обучить модель и спрогнозировать данные, но дело в том, что независимо от того, какую оценку я использую для полинома, график почти не меняется, а также среднеквадратичная ошибка. Я думаю, что чем выше оценка полинома, тем лучше прогноз и тем лучше сюжет. Как я могу изменить код, чтобы получить различные значения графиков при изменении оценки? А также, чтобы достичь другой среднеквадратичной ошибки!

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import plotly.express as px
from datetime import datetime
from sklearn.metrics import mean_squared_error

def parser(x):
    return datetime.strptime(x, '%d/%m/%Y')

data = pd.read_csv("https://raw.githubusercontent.com/iulianastroia/csv_data/master/final_dataframe.csv")

data['day'] = pd.to_datetime(data['day'], dayfirst=True)
data = data.sort_values(by=['day'])

X = data['time'].values.reshape(-1, 1)
y = data['pm25'].values.reshape(-1, 1)

# Splitting the dataset into training(70%) and test(30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
                                                    shuffle=False)

# Fitting Polynomial Regression to the dataset
poly_reg = PolynomialFeatures(degree=4)#if i put grade=20, almost nothing changes; 
#also, grade=1 doesn't create linear regression
X_poly = poly_reg.fit_transform(X_train)
print("x poly", X_poly)
pol_reg = LinearRegression()
pol_reg.fit(X_poly, y_train)

x_test_transformed = []
for i in X_test:
    print("*", i)
    x_test_transformed.append(i)

dfObj = pd.DataFrame(x_test_transformed)
dfObj.columns = ['x_test_transformed']
dfObj['color'] = 2 #red color for plot
data['color'] = 2#red color for plot

fig = px.line(x=data['readable time'], y=y)
fig.update_traces(name='Actual Data', showlegend=True, mode='lines+markers')
print("LEN", len(X_test))
print("LEN", len(data))
fig.add_trace(
    px.scatter(x=data['readable time'], y=pol_reg.predict(poly_reg.fit_transform(X)), color=data['color']).data[0])
y=pol_reg.predict(poly_reg.fit_transform(X_test))
fig.update_traces(name='Predicted Data', showlegend=True)
fig.update_layout(coloraxis_showscale=False, title='Real data and forecast for November 2019', showlegend=True,yaxis_title='Pm2.5', xaxis_title='Day')

fig.show()

predicted_list = pol_reg.predict(poly_reg.fit_transform(X))
predicted_list = [arr.tolist() for arr in predicted_list]
print("MSE(mean squared error)", mean_squared_error(data['pm25'], predicted_list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...