Ridge Regression

이승수·2021년 8월 14일
0

One-Hot Encoding

범주형 자료(Categorical variable)를 다루기 위한 기법
순서가 없는 명목형(nominal) / 순서가 있는 순서형(ordinal)

(도시는 높고 낮음이나 우선순위를 나타낼 필요가 없이 구분만 하면 되므로 명목형 변수이다)

※ Cardinality(집합의 크기)
A = {1, 2, 5} → cardinality of 3
카테고리가 너무 많은 경우(high cardinality)는 one-hot encoding 사용하기 적합하지 않다

from category_encoders import OneHotEncoder

encoder = OneHotEncoder(use_cat_names = True)
X_train = encoder.fit_transform(X_train)
X_test = encoder.transform(X_test)

# 범주형변수인 특성들만 알아서 one-hot encoding을 수행

Feature Selection(특성 선택)

과제에 적합한 특성을 만들어 내는 과정

# target과 가장 연관된 features를 K개 선택
from sklearn.feature_selection import f_regression, SelectKBest

selector = SelectKBest(score_func=f_regression, k=10)    # 특성 10개

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

# 테스트 데이터에 transform
X_test_selected = selector.transform(X_test)

all_features = X_train.columns

selected_mask = selector.get_support()

# 선택된 특성들
selected_names = all_features[selected_mask]

# 선택되지 않은 특성들
unselected_names = all_features[~selected_mask] 

※ 특성수를 1부터 늘리면서 MAE와 R2값을 측정하여 적절한 K값을 찾는다

Ridge Regression 모델

Ridge 회귀는 기존 다중회귀선을 훈련데이터에 덜 적합이 되도록 만들어서 그 결과로 더 좋은 모델이 만들어 진다

  • Ridge회귀를 사용하는 이유? – 과적합을 줄이기 위해서 사용한다 과적합을 줄이는 가장 간단한 방법 중 하나가 모델의 복잡도를 줄이는 방법이다. 특성의 개수를 줄이거나 모델을 단순한 모양으로 적합하는 것이다
  • Ridge 회귀는 편향을 조금 더하고 / 분산을 줄이는 방법으로 정규화를 수행한다
    람다는 정규화의 강도를 조절하는 패널티값이다

βridge\beta_{ridge}  :  argmin[i=1n(yiβ0β1xi1βpxip)2+λj=1pβj2]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 : 튜닝 파라미터(패널티)
argmin(f(x)) : f(x)가 가장 작아지게하는 x값
※ alpha, lambda, regularization parameter, penalty term 모두 같은 뜻

λ\lambda → 0,   βridge\beta_{ridge}βOLS\beta_{OLS}

λ\lambda → ∞,   βridge\beta_{ridge} → 0

  • 람다값이 커지면 전체 식이 최소화되기 위해서는 람다와 곱해지는 베타값들이 0에 가까워야하기 때문에 기울기가 0(기준모델)에 가까워진다
  • 람다값이 작아지면 제약, 페널티의 효과가 줄어들게 되고 베타값들이 다시 살아나서 과적합 방향으로 바뀐다


# sklearn 0.23 버전 이상 필요 
from sklearn.linear_model import RidgeCV

alphas = [0, 0.001, 0.01, 0.1, 1]    # 알파(람다)값들

ridge = RidgeCV(alphas=alphas, normalize=True, cv=5)    # ridgeCV 모델

ridge.fit(X_train, y_train)    # 모델 훈련

ridge.alpha_       # 가장 좋은 점수가 나온 알파값
ridge.best_score_  # 점수
profile
AI/Data Science

0개의 댓글

관련 채용 정보