설명변수의 거듭제곱의 영향
다음은 특정기간의 kospi 자료로 Open을 설명변수로 Close를 반응변수로 회귀모델을 생성한 것입니다.
import numpy as np import pandas as pd from sklearn import preprocessing from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error import yfinance as yf import matplotlib.pyplot as plt
st=pd.Timestamp(2024,1, 10) et=pd.Timestamp(2024, 5, 30) kos=yf.download("^KS11",st, et)[["Open","Close"]] kos.head(3)
Open | Close | |
---|---|---|
Date | ||
2024-01-10 | 2563.969971 | 2541.979980 |
2024-01-11 | 2543.030029 | 2540.270020 |
2024-01-12 | 2536.550049 | 2525.050049 |
위 자료의 설명변수를 표준화하고 sklearn.linear_model.LinearRegression()
클래스를 적용하여 회귀모델을 생성합니다.
ind=kos.iloc[:-1, [0]] de=kos.iloc[1:, 1] scale=preprocessing.StandardScaler().fit(ind) indN=scale.transform(ind) indN[:3]
array([[-0.99893096], [-1.24235095], [-1.31767861]])
mod=LinearRegression().fit(indN, de) print(f"coef: {mod.coef_.round(2)}\nintercept: {mod.intercept_.round(2)}\nR2: {mod.score(X, y).round(4)}")
coef: [80.45] intercept: 2649.05 R2: -1101.9856
ypre=mod.predict(indN) mse=mean_squared_error(de, ypre) mse.round(2)
859.69
설명변수를 거듭제곱로 조정하여 모델은 다음과 같습니다.
plt.subplot(3,3,1) plt.scatter(indN, de) plt.plot(indN, ypre, color="r") X=indN.copy() MSE=[mse.round(2)] for i in range(2, 7): X=np.c_[X, X**i] m=LinearRegression().fit(X, de) pre=m.predict(X) MSE.append(mean_squared_error(de, pre)) plt.subplot(2, 3, i) plt.scatter(indN, de) plt.plot(indN, pre, color="r", label=f"이전 객체+X^{i}") plt.yticks([]) plt.legend(loc="upper left") plt.show()
MSE
[859.69, 855.8761880159284, 816.1122800091756, 758.2788464442476, 6993.46124159978, 6993.47288858269]
위 결과와 같이 설명변수의 조정으로 선형모델은 비선형으로 변형되면서 모형 생성에 참여한 데이터에 충실한 방향으로 접근합니다. 그러나 한계가 존재하며 그 이상의 경우 모델의 효용은 급격히 감소됩니다. 또한 훈련데이터에 대한 모델의 충실도가 증가할수록 새로운 데이터에 대해 둔감해지는 경향을 보이는 과적합(overfit)을 보입니다.
댓글
댓글 쓰기