Recent Posts
Recent Comments
Link
Today
Total
12-29 06:30
관리 메뉴

Hippo's data

변수 선택(Feature selection) - RFE/RFE-CV/UFS 본문

ML(Machine Learning)

변수 선택(Feature selection) - RFE/RFE-CV/UFS

Hippo's data 2024. 1. 2. 19:25
728x90

데이터에는 다양한 칼럼으로 이루어진 변수들이 존재하는데요 어떠한 변수들을 모델학습에 사용하느냐에 따라서 모델의 성능이 달라지곤 합니다 이 경우 사용할 수 있는 변수 선택(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)

728x90