특성 자동 선택
- 유용한 특성만 선택하고 나머지는 줄이는 방향이 좋음
- 특성 선택 방법 : 일변량 통계, 모델 기반 선택, 반복적 선택
1. 일변량 특성선택
타겟과 변수간의 통계적 의미를 기반으로 유의미한 변수 선택
- chi2: 카이제곱 검정 통계값
- f_classif: 분산분석(ANOVA) F검정 통계값
- mutual_info_classif: 상호정보량(mutual information)
단일 변수 선택법은 각각의 독립변수를 하나만 사용한 예측모형의 성능을 이용하여 가장 분류성능 혹은 상관관계가 높은 변수만 선택하는 방법이다. 사이킷런 패키지의 feature_selection 서브패키지는 다음 성능지표를 제공한다.
하지만 단일 변수의 성능이 높은 특징만 모았을 때 전체 성능이 반드시 향상된다는 보장은 없다.
아래 일변량 변수선택 예제이다.
from sklearn.feature_selection import SelectPercentile
# SelectPercentile을 사용하여 특성의 50%를 선택하는 모델 생성
select = SelectPercentile(percentile=50)
# 특성 선택
select.fit(X_train, y_train)
X_train_selected = select.transform(X_train)
feature_selection 서브패키지는 성능이 좋은 변수만 사용하는 전처리기인 SelectKBest 클래스도 제공한다.
from sklearn.feature_selection import chi2, SelectKBest
%%time
selector1 = SelectKBest(chi2, k=14330)
X_train1 = selector1.fit_transform(X_train, y_train)
X_test1 = selector1.transform(X_test)
model = BernoulliNB()
model.fit(X_train1, y_train)
print("train accuracy:{:5.3f}".format(accuracy_score(y_train, model.predict(X_train1))))
print("test accuracy :{:5.3f}".format(accuracy_score(y_test, model.predict(X_test1))))
2. 모델 기반 특성선택
- 지도 학습 머신러닝 모델을 사용하여 특성의 중요도를 평가, 가장 중요한 것만 선택 (최종학습과는 무관함, 모델이 같을 필요 없음)
- 해당 모델은 각 특성의 중요도를 측정하여 순서로 매길 수 있어야 함
- 결정트리 기반의 모델들은 각 특성의 중요도를 featureimportances에 저장하므로 이를 활용할 수 있음
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
# (지도 학습 모델로 계산된) 중요도가 지정한 임계치보다 큰 모든 특성 선택하는 모델제작
# 절반 가량의 특성이 선택될수 있도록 중간값을 임계치로 사용
select1 = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=0),
threshold='median')
# 특성 선택
select1.fit(X_train, y_train)
X_train_selected1 = select1.transform(X_train)
3. 반복적 특성선택
- 특성을 하나도 선택하지 않은 상태로 시작해 어떤 종료 조건을 도달할 때까지 하나씩 추가하는 방법
- 모든 특성을 가지고 시작해 어떤 종료 조건이 될 때까지 하나씩 제거하는 방법
- 두 가지 방법 중 하나를 활용해 특성을 결정한다.
from sklearn.feature_selection import RFE
# 특성 선택
select2 = RFE(RandomForestClassifier(n_estimators=100, random_state=0),
n_features_to_select=40)
# 특성 선택
select2.fit(X_train, y_train)
X_train_selected2 = select2.transform(X_train)
reference: https://inuplace.tistory.com/618
https://dyddl1993.tistory.com/18
'데이터분석 > 전처리' 카테고리의 다른 글
다중공선성 제거: X변수 축소 (0) | 2023.08.25 |
---|---|
Sampling 방법 (0) | 2023.04.28 |
평가지표 (1) Accuracy와 Precision and Recall (0) | 2021.08.02 |
데이터 불균형 문제를 대하는 법 - Sampling 방법론 (0) | 2021.04.13 |
표준화(standardization)와 정규화(normalization) (0) | 2021.01.27 |