설명변수의 거듭제곱의 영향
다음은 특정기간의 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)을 보입니다.

댓글
댓글 쓰기