변수 선택(Feature selection) - RFE/RFE-CV/UFS
데이터에는 다양한 칼럼으로 이루어진 변수들이 존재하는데요 어떠한 변수들을 모델학습에 사용하느냐에 따라서 모델의 성능이 달라지곤 합니다 이 경우 사용할 수 있는 변수 선택(Feature selection) 방법들을 소개해보겠습니다!
1. RFE (Recursive Feature Elimination)
-> 변수중요도(예: 회귀 계수, 결정 트리에서의 Gini importance 등)를 기반으로 원하는 변수 수에 도달할 때까지 중요하지 않은 변수를 재귀적으로 제거
-> 재귀적이라는 단어가 왜 쓰였나?
전체 변수 학습 -> 변수 중요도 가장 낮은 변수 삭제 -> 남은 변수 학습 (원하는 변수 수까지 반복)
# 선택된 최종 변수는 모델 예측에 가장 큰 영향을 주는 특성 / 점수 지표가 가장 높음
<코드로 구현>
from sklearn.feature_selection import RFE # 사이킷런 모듈 불러오기
X = data[['feature1', 'feature2', 'feature3']] # 독립 변수
y = data['output'] # 종속 변수
model = LinearRegression() # 예시로 선형회귀 모델 적용
# RFE 모델 생성 및 학습
selector = RFE(model, n_features_to_select=2) # 원하는 최종 변수 수 지정
selector = selector.fit(X, y)
# 결과 출력
print(selector.support_) # 선택된 최종 변수
print(selector.ranking_) # 변수 중요도 순위
2. RFE-CV (Recursive Feature Elimination with Cross-Validation)
-> RFE에 교차검증(Cross-validation)을 추가한 것 / 변수 중요성에 대해 더 정확한 평가 제공, 변수 개수 지정안해도 됨
<코드로 구현>
from sklearn.feature_selection import RFECV # 사이킷런 모듈 불러오기
X = data[['feature1', 'feature2', 'feature3']] # 독립 변수
y = data['output'] # 종속 변수
model = LinearRegression() # 예시로 선형회귀 모델 적용
# RFE 모델 생성 및 학습
selector = RFECV(model, step=1, cv=5) # step = 각 반복에서 제거할 변수의 수 / cv = 교차 검증을 위한 분할 수
selector = selector.fit(X, y)
# 결과 출력
print(selector.support_) # 선택된 최종 변수
print(selector.ranking_) # 변수 중요도 순위
3. UFS (Univariate Feature Selection)
-> 일변량 통계 테스트(F-value, 카이 제곱값 등)을 통해 최상의 변수를 선택 / 변수 간의 관계를 고려하지 않음
<코드로 구현>
from sklearn.feature_selection import SelectKBest
# SelectKBest 상위 K개 변수 선택 / SelectPercentile 상위 백분위수 개수 변수 선택
from sklearn.feature_selection import chi2 # 카이제곱값 이용
X = data[['feature1', 'feature2', 'feature3']] # 독립 변수
y = data['output'] # 종속 변수
selector = SelectKBest(chi2, k=2) # SelectKBest를 사용하여 상위 2개의 특성 선택
X_new = selector.fit_transform(X, y)