2021. 1. 10. 17:53ㆍ머신러닝
선형 회귀 분석은 머신러닝에서 가장 기본적인 모형 중에 하나입니다. 계량경제학에서는 선형회귀모형의 해석과 통계적 해석에 더 초점을 맞추고 있다면, 머신러닝 영역에서는 Best parameter를 추정하고 예측력을 검증하는데 좀 더 집중을 하는 것이 차이점입니다.
Computer 성능이 무서울 정도로 빠르게 발전하면서, 선형 모형을 대체하는 복잡한 모형들이 많이 활용되고 있지만 여전히 선형 모형은 Sample이 적을 때, 그리고 Noise가 없는 데이터일 때 강력한 성능을 발휘하고 있으며, 종종 복잡한 모델보다 성능이 뛰어난 모습을 보이기도 합니다.
선형 회귀 모형은 Input $X_1$,$X_2$,..., $X_p$ 일 때 $E(X|Y)$의 함수를 추정하는 것입니다. 일반적인 선형회귀 모형 형식은 아래와 같습니다.
이 때 추정하는 방안은 RSS(The Residual sum of squares)를 최소화 하는 Parameter를 추정하는 것입니다.
Matrix 형식으로 나타내면 아래와 같습니다.
이 때 y은 N-vector이며 X는 N*(p+1) Matrix입니다. N은 obesrvation 수이며, p는 feature 개수입니다. X가 N*(p+1)인 이유는 Intercept를 포함하기 때문에 Columns이 p+1이 됩니다.
RSS를 최소화하는 $\beta$가 Beta Parmeter이기 때문에 RSS를 $\beta$로 미분하여, $\beta$를 추정하게 됩니다.
그렇다면 최종적으로 $\widehat{y}$은 아래와 같이 표현됩니다.
이 때, $(X^TX)^{-1}X^T$은 Hat Matrix 또는 Projection Matrix라고 불립니다. 그 이유는 $y-\widehat{y}$가 featrue X에 span된 영역에 Orthogonal하도록 $\beta$를 선택함으로써 RSS를 최소화하기 때문입니다.
이 때 추정된 $\beta$의 분산은 아래와 같습니다.
Obeservation으로부터 추정된 분산은 아래와 같습니다.
추정된 Parameter $\beta$의 통계적 유의성을 검증하기 위한 Statistics(통계량)은 아래와 같으면 이는 $t_{N-p-1}$분포를 따릅니다.
$v_j$는 위에 분산에 곱해진 $(X^TX)^{-1}$의 j번째 diagonal element입니다.
Python을 활용하여 선형 회귀분석을 해보겠습니다. numpy를 활용하여 계산을 해보고 sklearn과 비교를 해보도록 하겠습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
## Making sample data for regression
X=2*np.random.rand(100,1)
y=4+3*X+np.random.rand(100,1)
## Plot
plt.plot(X,y,"b.")
plt.xlabel("X")
plt.ylabel("y")
plt.axis([0, 2, 0, 15])
plt.show()
## Adding Intercept
X_b = np.c_[np.ones((100,1)),X]
theta_best =np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
theta_best
'''
array([[4.55708606],
[2.97307504]])
'''
## Predict with new data
X_new = np.array([[0],[2]])
X_new_b =np.c_[np.ones((2,1)), X_new]
y_predict = X_new_b.dot(theta_best)
y_predict
'''
array([[ 4.55708606],
[10.50323615]])
'''
## Plot
plt.plot(X_new, y_predict, "r-")
plt.plot(X, y, "b.")
plt.axis([0, 2, 0, 15])
plt.show()
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X, y)
lin_reg.intercept_, lin_reg.coef_
## (array([4.55708606]), array([[2.97307504]]))
lin_reg.predict(X_new)
'''
array([[ 4.55708606],
[10.50323615]])
'''
위에 정리된 내용을 기반으로 Numpy로 직접계산한 값과 sklearn의 결과가 동일함을 알 수 있습니다.
추가적으로 Multiple Output을 가진 Regression을 추정해보도록 하겠습니다. 일반적인 Function form은 아래와 같습니다.
matrix형태로 표현하면 아래와 같습니다.
Muliple Output을 가진 Regression도 마찬가지로 RSS를 최소화하는 Parameter을 추정하게 됩니다.
Single Output을 가진 Regression과 마찬가지로 RSS를 최소화하는 B는 아래와 같은 형태로 구해집니다.
Sklearn을 활용하여 Multiple Output을 가진 회귀모형을 추정해보겠습니다.
from sklearn.datasets import make_regression
## Making sample data with mutliple output data
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1, noise=0.5)
print(X.shape, y.shape)
model = LinearRegression()
model.fit(X, y)
model.intercept_, model.coef_
'''(array([ 0.02955506, -0.00116388]),
array([[-1.46501825e-02, 3.10198161e+01, -1.13677932e-02,
7.65369290e+01, 9.33405919e+01, -2.88942651e-03,
2.93812718e-03, 8.65194262e+01, 1.24393362e+01,
-1.12115602e-02],
[ 4.33840726e-02, 8.90994902e+01, 9.24342060e-03,
9.04424607e+00, 2.67520701e+01, -1.19877070e-02,
-1.12166375e-02, 3.29146078e+00, 3.40535528e+01,
1.12862822e-03]]))
'''
## predict with new data
row = [0.21947749, 0.32948997, 0.81560036, 0.440956, -0.0606303, -0.29257894, -0.2820059, -0.00290545, 0.96402263, 0.04992249]
yhat = model.predict([row])
yhat ## array([[50.06781717, 64.564973 ]])
make_regression method를 활용하여 우리는 원하는 regression 데이터를 만들 수 있습니다. n_sample는 observation 개수, n_feature는 우리가 원하는 Feature의 개수, n_informative는 생성한 Feature 중에 어떤 것이 y를 설명하는데 중요한정보를 가진 Feature 개수이고 n_target은 y의 output수입니다.
sklearn을 활용하여 Multiple Output Regression 추정하는 방안은 Single Output Regression 과 동일합니다.
Reference:
1) The Elements of Statistical Learning
2) Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow
3) machinelearningmastery.com/multi-output-regression-models-with-python/
'머신러닝' 카테고리의 다른 글
선형 분류 모형(Linear Methods for Classification) (0) | 2021.02.20 |
---|---|
Dimension Reduction Method(Principal Components Regression, Partial Least Squares) (0) | 2021.02.03 |
Shrinkage Method2(Elastic Net, LARS) (0) | 2021.01.24 |
Shrinkage Method (0) | 2021.01.23 |
Subset Selection (0) | 2021.01.13 |