오늘은 피처 중요도와 피처 선택 강의를 들었다.
타겟 변수를 예측하는 데 얼마나 유용한 지에 따라 피처에 점수를 할당해서 중요도를 측정하는 방법
Model-specific
머신러닝 모델 자체에서 피처 중요도 계산이 가능하면 방법
Model-agnostic
모델에서 제공하는 기능에 의존하지 않고 모델을 학습한 후에 적용되는 피처중요도 계산 방법
모델의 종류나 가정에 구애받지 않고 피처 중요도를 계산할 수 있다
Training 된 LightGBM 모델 클래스에 feature_importance(importance_type)
함수로 피처 중요도 계산 기능을 제공
파라미터의 importance_type 값에 split이나 gain이 사용가능하다(디폴트는 split)
split
- 트리를 만드는데 피처가 몇 번 사용되었나 횟수(정확하게는 트리의 분할 횟수)
gain
- 분할에 기여한 평균적인 정보 이득(gain) 기준으로 피처 중요도 계산
불순도 감소량을 기준으로 하기 때문에 분할의 질을 반영해 좀 더 정확하다.
프로젝트 모델에서는 order_ts-last가 가장 중요한 피처고 order_ts_diff-max, order_ts-first가 뒤를 이었다.
Training된 XGBoost 모델 클래스에 get_score(importance_type)
함수로 피처 중요도 계산 기능 제공
파라미터의 importance_type의 디폴트는 weight
weight - 피처가 얼마나 자주 사용되었나
gain - lightgbm과 동일
cover - 각 특성이 분할되는 횟수. 특성이 데이터를 얼마나 잘 cover하는지 나타냄
total_gain, total_cover는 위처럼 average가 아니라 합으로 계산
프로젝트 모델에서는 order_ts-last가 가장 중요한 피처고 quantity_diff-skew, cumsum_price_by_prod_id-skew 가 뒤를 이었다.
Training 된 CatBoost 모델 클래스에 get_feature_importance(type)
함수로 피처 중요도 계산 기능을 제공
파라미터의 type의 디폴트는 FeatureImportance
프로젝트 모델에서는 order_ts-last가 가장 중요한 피처고 year_month-mode, order_ts-first, order_ts_diff-max가 뒤를 이었다.
피처의 값들을 하나하나씩 순회하면서 랜덤하게 셔플링 한 뒤 모델의 에러를 측정해서 기존과 에러의 차이가 얼마나 나는 지를 보고 에러 차이가 클수록 중요한 피처로 해석하는 방법
상세 단계
Input: Trained model f, feature matrix X, target vector y, error measure L(y,f).
1. Estimate the original model error eorig = L(y, f(X)) (e.g. mean squared error)
2. For each feature j = 1, ... ,p do:
o Generate feature matrix Xperm by permuting feature j in the data X. This breaks the
association between feature j and true outcome y.
o Estimate error eperm = L(Y,f(Xperm)) based on the predictions of the permuted data.
. Calculate permutation feature importance FI'= eperm/eorig. Alternatively, the difference can
be used: FI = eperm - eorig
3. Sort features by descending Fl.
from sklearn.linear_model import LogisticRegression
from sklearn.inspection import permutation_importance
X= [[1, 9, 9], [1, 9, 9], [1, 9, 9], [0, 9, 9], [0, 9, 9], [0, 9, 9]]
y=[1, 1, 1, 0, 0, 0]
clf = LogisticRegression().fit(X, y)
result = permutation_importance(clf, X, y, n_repeats=10, random_state=0)
result. importances_mean
result. importances_std
본 포스트의 학습 내용은 부스트클래스 <AI 엔지니어 기초 다지기 : 부스트캠프 AI Tech 준비과정> 강의 내용을 바탕으로 작성되었습니다.