ML 03.릿지 회귀

cuckoo·2022년 12월 7일
0

Machine Learning

목록 보기
3/11

키워드

  • 원핫인코딩(One-hot encoding)
  • 일변량 통계 기반 특성선택(Feature Selection)
  • Ridge 회귀모델

범주형 자료

  • 순서가 없는 명목형(nominal)
  • 순서가 있는 순서형(ordinal)

Encoding

| 문자열로 된 범주형 변수를 모델이 인식하지 못하므로 수치형 변수로 변환하는 기법

One-Hot encoding

• 순서가 없는 범주형 변수(명목형 변수)에 사용

• n개의 범주를 가진 범주형 특성을 개의 이진 특성 (0 또는 1)으로 변환

• n개의 새로운 특성이 생성되므로 범주가 너무 많은 경우(high cardinality)에는 적절하지 않다.

원-핫 인코딩을 두 가지 과정

  1. 첫째, 정수 인코딩을 수행합니다. 다시 말해 각 단어에 고유한 정수를 부여합니다.
  2. 둘째, 표현하고 싶은 단어의 고유한 정수를 인덱스로 간주하고 해당 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여합니다.mtimFxh
## get_dummies 를 사용한 원핫인코딩
df_oh = pd.get_dummies(df, prefix=['City'])

선형회귀 모델 원핫인코딩

# !pip install category_encoders

from category_encoders import OneHotEncoder # 범주형 변수를 가진 특성만 원인코딩 수행

encoder = OneHotEncoder(use_cat_names = True) # 객체 생성

X_train = encoder.fit_transform(X_train) # 훈련셋 -> .fit_transform

X_test = encoder.transform(X_test) # 테스트셋 -> .transform

SelectKBest

## f_regresison, SelectKBest
from sklearn.feature_selection import f_regression, SelectKBest

## target과 상관관계가 높은 상위10개 특성 선택
selector = SelectKBest(score_func=f_regression, k=10)

## 학습데이터에 fit_transform 
X_train_selected = selector.fit_transform(X_train, y_train)

## 테스트 데이터는 transform
X_test_selected = selector.transform(X_test)
  • 각 특성과 타겟변수와 상관관계를 계산합니다.
  • 각 특성들이 독립적으로 평가되므로 계산이 빠르고 모델과 상관없이 전처리에 사용할 수 있습니다.
  • 특성들이 과도하게 많아서 생기는 과적합을 줄일 수 있고 모델 성능을 높일 수 있습니다.
  • 특성의 개수가 줄어들어서 모델 훈련시간도 감소시킬 수 있습니다.
  • 회귀에서는 f_regression을 주로 사용

Ridge Regression 모델 학습

  • 편향을 조금 더하고, 분산을 줄이는 방법으로 정규화(Regularization)를 수행

βridge:  argmin[i=1n(yi  β0  β1xi1βpxip)2 + λj=1pβj2]\beta_{ridge}:  argmin[\sum_{i=1}^n(y_i - \beta_0 - \beta_1x_{i1}-\dotsc-\beta_px_{ip})^2 + \lambda\sum_{j=1}^p\beta_j^2]
n: 샘플수, p: 특성수, λ\lambda: 튜닝 파라미터(패널티)
참고: alpha, lambda, regularization parameter, penalty term 모두 같은 뜻 입니다.

  • 기존 비용함수 SSE에 회귀계수 제곱합 * lambda

Ridge 회귀를 사용하는 이유는 무엇일까요?

  • Ridge 회귀는 과적합을 줄이기 위해서 사용하는 것입니다.
    • 과적합을 줄이는 간단한 방법 중 한 가지는 모델의 복잡도를 줄이는 방법입니다.
    • 특성의 갯수를 줄이거나 모델을 단순한 모양으로 적합하는 것입니다.

λ(lambda,튜닝 파라미터)

  • 패널티의 강도를 조절하는 하이퍼파라미터
  • X의 크기가 클수록 회귀계수값 감소
    • X = 0이면, 기존 회귀모델과 동일
    • X = ∞이면, 회귀모델은 B에 근사
  • 회귀 계수들을 0으로 수렴시킴 → 덜 중요한 특성의 개수를 줄임 → 과적합을 방지
  • 0에 가까워지면 다중회귀모델이 된다.
  • 적절한 lambda 값을 조절해서 일반화가 잘되는 지점을 찾아야함 → 이런 모델을 정규화 모델이라고 부름
  • lambda라는 패널티 값을 적절하게 찾을 수 있다면 일반화를 최대한하면서 이상치의 영향을 최소화 할 수 있다는 것을 알 수 있다.
  • 물론, 패널티를 너무 크게 주면 회귀선이 평균 기준 모델과 같아지는 것을 알 수있다.

lambda 패널티를 효율적으로 구하는 방법

  • 여러 패널티 값으로 교차 검증을 통해 구한다.

Scikit-learn으로 Ridge Regression 구현

• Ridge

• RidgeCV

from sklearn.linear_model import RidgeCV

# RidgeCV를 통한 최적 패널티(alpha, lambda) 검증
alphas = [0, 0.001, 0.01, 0.1, 1]

ridge = RidgeCV(alphas=alphas, normalize=True, cv=5) # cv(교착검증),normalize=True : 표준화
ridge.fit(X_train_selected, y_train)
print("alpha: ", ridge.alpha_) # 최적 패널티 반환
print("best score: ", ridge.best_score_) # 가장 성능이 좋은 score 반환

추가 학습이 필요한 개념

정규화

  • 정규화(Regularization)란 무엇인가요?
  • Ridge Regression은 어떤 패널티가 부과되나요?
  • Ridge Regression의 특징은 무엇인가요?
  • 람다(알파, 패널티)란 무엇인가요?
  • scikit-learn에서 최적의 알파값은 어떻게 찾을 수 있을까요?|
profile
ENTJ 데이터 분석가 준비중입니다:)

0개의 댓글