선형 회귀 분석
* 선형 회귀 분석
- 피처(독립 변수)가 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
'2023 빅리더 프로젝트 인턴십 > ML' 카테고리의 다른 글
[ML] day4 지도학습 - 나이브 베이즈 알고리즘( Naive Bayes ) (0) | 2023.07.21 |
---|---|
[ML] day4 지도학습 - 의사결정나무(Decision Tree) (0) | 2023.07.20 |
[ML] day3 지도학습 - KNN(K 최근접 이웃 알고리즘) (0) | 2023.07.20 |
[ML] day3 모형 평가 (0) | 2023.07.19 |
[ML] day3 최적화 (0) | 2023.07.19 |
댓글