线性趋势
下面是带有趋势的时序数据:
https://raw.githubusercontent.com/FlorinAndrei/misc/master/qdata.csv
让我们加载它,看看它是什么样子:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import mean_squared_error, r2_scoreser = pd.read_csv('qdata.csv', index_col=0, squeeze=True) serx 0 473.917764 1 75.324825 2 -306.969479 3 53.271476 4 372.966686 ... 95 4650.550473 96 4604.573344 97 4891.704638 98 5265.948162 99 5618.909339 Name: y, Length: 100, dtype: float64plt.plot(ser) plt.show()
好的,这里有一个趋势。我们假设它是线性的,我们来做线性回归来找出答案。这是线性回归的一个直接应用。上面导入的sklearn库拥有我们进行回归所需要的一切。
X = ser.index X = np.reshape(X, (len(X), 1)) y = ser.valuesmodel = LinearRegression() model.fit(X, y) trend = model.predict(X)plt.plot(y) plt.plot(trend) plt.legend(['data', 'trend']) plt.show()
看起来很合适,但可能不是很合适。让我们从数据中减去趋势,看看非趋势数据是什么样的:
detr = [y[i] - trend[i] for i in range(0, len(y))] plt.plot(detr) plt.title('data detrended in a linear fashion') plt.show()
不是很令人信服。数据中仍有一个凹的趋势。最初的趋势可能不是线性的。
让我们计算数据和我们提取的趋势之间的RMSE和R²。
r2 = r2_score(y, trend) rmse = np.sqrt(mean_squared_error(y, trend)) print('r2:', r2) print('rmse', rmse) r2: 0.8782399672701933 rmse 553.6078593008505