이 글은 파이썬 라이브러리를 활용한 머신러닝의 내용을 요약한 글입니다. 더불어 대학원 수업 "통계계산 방법론" 내용도 일부 포함하였습니다.
Python Libraries
1 2 3 4 5 6
%matplotlib inline import matplotlib.pyplot as plt import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.datasets import load_boston
Summary
원리: 반응변수 y에 영향을 주는 p개의 설명변수 X와의 선형 관계로 표현해 y의 값을 예측하는 방법,
이를 위해 최소제곱법 (OLS)로 선형 관계의 계수 (coefficients)를 찾음
촐레스키 분해 / QR 분해를 하는 이유?
선형 회귀의 해를 구할 때 역행렬 계산을 피하기 위함
Linear Regression
선형 회귀 식
반응변수 y와 p개의 설명변수 X로 이루어진 n개의 데이터에 관한 선형 회귀 식은 다음과 같습니다.
yn×1=Xn×pβp×1+en×1,cov(e)=σ2I
여기서 X는 n×p행렬로 design matrix라 불립니다.
선형회귀의 목표
제곱합오차 (SSE; Sum of Squared Error)를 β에 대하여 최소화하는 것입니다. SSE인 S(β)는 다음과 같이 정의됩니다.
S(β)=(y−Xβ)⊤(y−Xβ)
SSE의 최소화했을 때의 β의 해는 다음식의 해 β와 같습니다.
X⊤Xβ⇔β=X⊤y=(X⊤X)−1X⊤y
선형회귀의 성질
적합값 (fitted values): y=Xβ=Hy,H=X(X⊤X)−1X⊤
여기서 H는 투영 행렬(projection matrix)이라 부릅니다. projection라 부르는 이유는 y를 X의 column space에 투영하기 때문입니다. 이 행렬은 항상 대칭이고 idempotent의 성질을 가지고 있습니다.
잔차 벡터 (residual vector): e=y−y=(I−H)y
적합값 y와 잔차 e는 직교 (orthogonal): y⊤e=0
예제: 보스턴 데이터
보스턴의 집값에 영향을 주는 변수들을 선별해 선형 회귀를 실행해보았습니다. 보스턴 데이터에 관한 설명은 print(boston.DESCR)를 통해 볼 수 있고, 여기에서도 확인하실 수 있습니다.
설명변수의 X는 총 13개로,
CRIM: 범죄율
INDUS: 비소매상업지역 면적 비율
NOX: 일산화질소 농도
RM: 주택당 방 수
LSTAT: 인구 중 하위 계층 비율
B: 인구 중 흑인 비율
PTRATIO: 학생/교사 비율
ZN: 25,000 평방피트를 초과 거주지역 비율
CHAS: 찰스강의 경계에 위치한 경우는 1, 아니면 0
AGE: 1940년 이전에 건축된 주택의 비율
RAD: 방사형 고속도로까지의 거리
DIS: 보스톤 직업 센터 5곳까지의 가중평균거리
TAX: 재산세율
여기서 .format을 이용해 숫자를 소수점 둘째 자리까지 프린트하도록 설정하는데, ndarray객체인 lr.coef_는 바로 .format함수에 넣을 수가 없어 따로 옵션을 성정했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
boston = load_boston() X = boston.data y = boston.target X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=433) lr=LinearRegression().fit(X_train,y_train)
훈련 데이터의 R2에 비해 테스트 데이터의 R2가 떨어지는 것을 보아 훈련 데이터에 치중해 적합 (과대적합)됨을 알 수있습니다.
또한, 회귀 계수 β를 보면 0에 가까운 추정치들이 많습니다. 예를 들어, lr.coef_의 7, 10, 12번 째 값은 0에 가깝습니다. 이는 이에 해당하는 설명 변수인 PTRATIO,AGE,DIS의 설명력이 약함 (weak signal)을 시사합니다.
사실 보스턴 데이터는 이렇게 signal은 약하고 noise는 큰 자료이기 때문에 Ridge, Lasso 회귀에 적합한 자료입니다. 이는 Ridge/ Lasso 회귀 섹션에서 더 살펴보겠습니다.
Cholesky Decomposition
행렬을 계산할 때 특히 컴퓨터 상 문제가 되는 부분은 역행렬입니다. 원칙상 선형 회귀에서 계수의 해를 구하기 위해서는 (X⊤X)−1을 구해줘야 합니다. 그러나 촐레스키 분해를 이용하게 되면 역행렬 계산을 피할 수 있기 때문에 컴퓨터 상 더 stable하다 알려져 있습니다.
어떤 양정치 행렬(positive definite matrix) A가 A를 촐레스키 분해하면 다음의 식을 만족하는 하삼각행렬 (lower triangular matrix)가 항상 존재합니다.
A=LL⊤
여기서 하삼각 행렬인 L을 구하는 방법은 R에서는 chol함수를, Python에서는 np.linalg.cholesky를 사용합니다.