본문 바로가기
2023 빅리더 프로젝트 인턴십/ML

[ML] day4 지도학습 - 회귀분석(Ridge, Lasso, ElasticNet)

by 혜o_n 2023. 7. 20.

 선형 회귀 분석

* 선형 회귀 분석

- 피처(독립 변수)가 1개이면 단순 회귀 분석

- 예측 결과를 중요시하기 때문에 머신러닝에서는 가정을 무시함

 

* W를 구하는 방법

 

* 최소 제곱 추정량 ( Least square estimator )

- 미분해서 0이 되는 값을 찾는 것이 목적!

 

* 다시 선형 회귀 분석

 

* 결정 계수 R^2

 

* 단순 회귀 분석 개념

 

==> 회귀 분석

 

* 다중 공선성

- 상관관계성을 이용해서 다중 공선성을 가지고 있는 피처를 쳐낼 수 있음 ( 차원 축소 )

 

* 차원 축소

- 카이제곱 검정을 통해 상관관계를 가지는 피처를 걸러냄

(regulization이 이런 경우 사용됨)

- 다중 공선성 문제를 해결하는데 라쏘 도움됨 ( ∵ 차원 축소)

 

==> 라쏘와 릿지 두가지 정규화를 동시에 사용한 회귀 분석 : 엘라스틱 넷( Elastic net )

** 릿지 회귀 분석 - 라그랑주 프리멀 함수로 표현

- 람다λ 는 원의 크기를 조정

    - 계수(cofficient)의 사이즈 조절

    - 정규식의 크기 조절

    - 0에 가까워질수록, 최소 제곱 추정량에 가까워짐

    - 무한대에 가까워질수록 릿지 해는 0에 가까워짐 즉, 상수항만 남은 모형에 가까워짐

- 미분이 가능 => closed form solution

 

** 라쏘 회귀 분석 - 라그랑주 프리멀 함수로 표현 

- closed form이 없으므로(∵미분불가능) => 그래디언트 디센트 방법으로 추정

    => 사람이 break 지정 ( 사람마다 값이 달라질 수 있음) 

 

* 엘라스틱 넷(Elastic net)

- 릿지 회귀 분석과 라쏘 회귀 분석을 합쳐놓은 형태

- α 로 릿지와 라쏘의 비율을 조정 가능

- λ 는 전체 제약식의 비중을 나타냄

 

* 실습

import pandas as pd
df = pd.read_csv('../data/house_prices.csv')

features = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX',
       'PTRATIO', 'B', 'LSTAT']

X = df[features]
y = df['MEDV']

# 트레이닝 / 테스트 데이터 분할
from sklearn.model_selection import train_test_split
X_tn, X_te, y_tn, y_te = train_test_split(X, y, random_state=42)

# 데이터 표준화
from sklearn.preprocessing import StandardScaler
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)

# 선형 회귀분석 학습
from sklearn.linear_model import LinearRegression
clf_lr = LinearRegression()
clf_lr.fit(X_tn_std, y_tn)
# 선형 회귀 분석 모형 추정 계수 확인
print(clf_lr.coef_)
print(clf_lr.intercept_)

- c o e f _ : weight (계수)

    - 영향도(피처의 중요도)를 알기 위해서는 weight를 보면 됨( 절대값으로 봐야 함 )

    => 'LSTAT'의 영향이 가장 큼!

- i n t e r c e p t _ : bias (상수)

 

# 회귀분석 모델 훈련

# 릿지 회귀분석 ( L2 제약식 적용 )
from sklearn.linear_model import Ridge
clf_ridge = Ridge(alpha=1)
clf_ridge.fit(X_tn_std, y_tn)

    - α값으로 릿지 도형의 모양(크기)를 정함

    - α는 상수 & 양수 ( ∵ 제곱수이므로 => L2 제약 )

    - α가 0이면 제약식이 없는 일반적인 선형 회귀분석(LinearRegression)

    - sklearn이 제공하는 함수(Ridge)는 미분을 사용하여 최적화를 시키는 것이 아니라 그래디언트 디센트를 이용해 최적값을 구함

    - 주의할 점(파이썬) : 행렬에서는 얕은 복사(Shallow copy)가 아닌 깊은 복사(Deep copy)가 일어남

        ex) A = 행렬, B = A로 복사를 한 후 B의 요소 값을 변경하면 A에도 적용이 됨 ==> 깊은 복사

# 라쏘 회귀분석 ( L1 제약식 적용 ) 
from sklearn.linear_model import Lasso
clf_lasso = Lasso(alpha=0.01)
clf_lasso.fit(X_tn_std, y_tn)
#  엘라스틱 넷(Elastic net)
from sklearn.linear_model import ElasticNet
clf_elastic = ElasticNet(alpha=0.01, l1_ratio=0.01) # 라쏘 비율
clf_elastic.fit(X_tn_std, y_tn)

- alpha : 전체(penalty terms)에 대한 가중치

- l1_ratio : 라쏘에 대한 가중치 ( 라쏘 가중치 + 릿지 가중치 = 1 )

# 예측
pred_lr = clf_lr.predict(X_te_std)
pred_ridge = clf_ridge.predict(X_te_std)
pred_lasso = clf_lasso.predict(X_te_std)
pred_elastic = clf_elastic.predict(X_te_std)
# 모형 평가 - R 제곱값
from sklearn.metrics import r2_score
print(r2_score(y_te, pred_lr))
print(r2_score(y_te, pred_ridge))
print(r2_score(y_te, pred_lasso))
print(r2_score(y_te, pred_elastic))

### 결과값 ###
0.6354638433202133
0.6345884564889055
0.6343061000666704
0.6322273400977834
# 모형 평가 - MSE
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_te, pred_lr))
print(mean_squared_error(y_te, pred_ridge))
print(mean_squared_error(y_te, pred_lasso))
print(mean_squared_error(y_te, pred_elastic))

### 결과값 ###
29.782245092302333
29.853763334547597
29.876831576246808
30.046664219036877

 

댓글