변수 선택 기법(Feature Selection Method)
모델을 돌릴 때 쓸모 없는 변수들을 제거함으로써
모델의 속도 개선, 오버피팅 방지 등의 효과를 얻기 위해 사용하는 방법.
Feature Selection의 3가지 방법
1. Wrapper method : 모델링 돌리면서 변수 채택
2. Filter Method : 전처리단에서 통계기법 사용하여 변수 채택
3. Embedded method : 라쏘, 릿지, 엘라스틱넷 등 내장함수 사용하여 변수 채택
내 방식대로 정리해보고자 한다
정리
Filter Method
전처리단에서 주로 사용할 만 하며 통계기법등을 사용하여 상관관계가 높은 변수나, 성능이 높은 변수를 추출하는 방법
분산
피쳐가 종속변에 따라 그다지 변하지 않는다면 예측에도 도움이 되지 않을 가능성이 높다.
이를 표현하는 분산이 낮은 데이터는 도움이 안된다고 판단하여 제거하는 방법.
하지만 분산에 의한 선택은 반드시 상관관계와 일치한다는 보장이 없기 때문에 신중하게 사용해야 한다.
from sklearn.feature_selection import VarianceThreshold
단일 변수 선택
- 카이스퀘어 검정 통계값
- F검정 통계값
- 상호정보량(mutual information)
- Information Value(보통 실제 프로젝트할때 많이 쓰는 변수)
각각의 독립변수를 하나만 사용한 예측모형의 성능을 이용하여 가장 분류성능 혹은 상관관계가 높은 변수만 선택하는 방법이다.
사이킷런 패키지의 feature_selection 서브패키지는 다음 성능지표를 제공한다.
카이제곱 검정 통계값 : chi2
분산분석(ANOVA) F검정 통계값 : f_classif
상호정보량(mutual information) : mutual_info_classif
하지만 단일 변수의 성능이 높은 특징만 모았을 때 전체 성능이 반드시 향상된다는 보장은 없다.
feature_selection 서브패키지는 성능이 좋은 변수만 사용하는 전처리기인 SelectKBest 클래스도 제공한다. 사용법은 다음과 같다.
from sklearn.feature_selection import chi2, SelectKBest
selector1 = SelectKBest(chi2, k=14330)
X_train1 = selector1.fit_transform(X_train, y_train)
X_test1 = selector1.transform(X_test)
상호정보량(mutual information)
1. 두 확률변수 𝑋,𝑌 가 독립이면 정의에 의해 결합확률밀도함수는 주변확률밀도함수의 곱과 같다. 𝑝(𝑥,𝑦) = 𝑝(𝑥)𝑝(𝑦)
2. 쿨벡-라이블러 발산은 두 확률분포가 얼마나 다른지를 정량적으로 나타내는 수치다. 같으면 쿨벡-라이블러 발산은 0이 된다.
상호정보량은 결합확률밀도함수 𝑝(𝑥,𝑦)와 주변확률밀도함수의 곱 𝑝(𝑥)𝑝(𝑦)을 가지고 쿨벡-라이블러 발산을 구한 것이다.
즉 결합확률밀도함수와 주변확률밀도함수의 차이를 측정하므로써 두 확률변수의 상관관계를 측정하는 방법이다.
만약 두 확률변수가 독립이면 결합확률밀도함수는 주변확률밀도함수의 곱과 같으므로 상호정보량은 0이 된다.
반대로 상관관계가 있다면 그만큼 양의 상호정보량을 가진다.
상호정보량은 엔트로피와 조건부엔트로피의 차이와 같다.
조건부엔트로피는 두 확률변수의 상관관계가 강할수록 원래의 엔트로피보다 더 작아지므로 상호정보량이 커진다.
Information value(IV)
주로 모델을 학습하기전 첫 단계에서 변수들을 제거하는 데 사용한다.
최종 모델에서는 대략 10개 내외의 변수를 사용하도록 한다(여러개 만들어 보고 비교해보는 것이 좋다).
IV와 WOE 신용채무능력이 가능한(good) 고객과 불가능한(bad) 고객을 예측하는 로지스틱 회귀 모델링과 밀접한 관계가 있다.
신용 정보 관련분야에서는 good customer는 부채를 갚을 수 있는 고객,
bad customer는 부채를 갚을 수 없는 고객을 뜻한다.
일반적으로 이야기할 때는 good customer는 non-events를 의미하고 bad customer는 events를 의미한다.
woe = ln * (distribution of non-event /distribution of event)
iv = sum(woe * (distribution of non_event - distribution of event))
IV 예측력
0~0.02 무의미
0.02~0.1 낮은 예측
0.1~0.3 중간 예측
0.3~0.5 강한 예측
0.5~1 너무 강한 예측(의심되는 수치)
0.5~1의 경우 의심해보아야 한다.
IV는 WOE를 활용한다. WOE는 good과 bad의 분포를 이용하는데, 데이터가 good으로 쏠려있을 경우 WOE는 무조건 잘 나올 수 밖에 없고,
이에 따라 IV값도 잘 나오게 된다.
따라서 IV의 값을 볼 때는 데이터가 어떻게 되어있는지 먼저 살펴보는 게 중요하다.
# 실제 프로젝트 진행하면 1이상이 많이 나온다.
# 이론상 0.5~1을 의심하라고는 하지만 경험상 현업에서는 0.6이상 높은 값을 원한다.
Wrapper method
글을 읽다보면 전진선택법, 후진제거법, step-wise라고 적혀있던데 회귀분석에서 배웠던 그 용어가 맞다면
하나씩 돌려보면서 변수를 추가하는 방법, 전체에서 제거해나가는 방법, 둘을 혼합한 방법이라고 생각하면 편할 듯 하다.
사이킷런에 패키지로 존재하는 후진제거법 기반 방식인 RFE만 정리하고자 한다.
RFE(recursive feature elimination)
모든 변수를 우선 다 포함시킨 후 반복해서 학습을 진행하면서 중요도가 낮은 변수를 하나씩 제거하는 방식.
from sklearn.feature_selection import RFE
RFE = RFE(model, n_features_to_select=20)
X_train_RFE = RFE.fit_transform(X_train,y_train)
X_test_RFE = RFE.transform(X_test)
또는 트리기반 모델을 돌려서 feature_importances_를 소팅해서 상위 몇개의 변수만을 사용하는 방법도 있다.
Embedded method
모델 안에서 l1, l2 정규화를 통해 변수를 축소해서 사용하는 방법이다.
참고문서
https://datascienceschool.net/view-notebook/ff367da95afc43ed8ae6ec30efc0fb9f/
https://datascienceschool.net/view-notebook/bf8d9a70e92b48c2853449ec175c55ab/