트리 모델에서 feature_importances_를 사용하면 cardinality가 높은 특성은 분기에 이용될 확률이 높아 중요도가 높게 나오는데, 따라서 모델이 과적합될 위험이 있다.
permutation(순열, 치환)은 특성들의 분포를 임의로 흐트러트린 후, 기존의 결과와 비교해서 해당 특성이 결과값에 얼마만큼의 영향을 미치는지(중요도)를 보여준다.
from sklearn.pipeline import Pipeline
# encoder, imputer를 preprocessing으로 묶었습니다. 후에 eli5 permutation 계산에 사용합니다
pipe = Pipeline([
('preprocessing', make_pipeline(OrdinalEncoder(), SimpleImputer())),
('rf', RandomForestClassifier(n_estimators=100, random_state=2, n_jobs=-1))
])
permutation을 위해서는 pipeline을 사용한다.
import eli5
from eli5.sklearn import PermutationImportance
permuter = PermutationImportance(
pipe.named_steps['model'], # pipeline에서 model을 정의해줬던 변수를 넣어준다
scoring='accuracy', # metric
n_iter=5, # 다른 random seed를 사용하여 5번 반복
random_state=22
)
# permuter 계산은 preprocessing 된 X_val을 사용합니다.
X_val_transformed = pipe.named_steps['preprocessing'].transform(X_val)
# 스코어를 다시 계산
permuter.fit(X_val_transformed, y_val);
feature_names = X_val.columns.tolist()
eli5.show_weights(
permuter,
top=None, # top n 지정 가능, None 일 경우 모든 특성
feature_names=feature_names # list 형식으로 넣어야 합니다
)
permutation importance를 확인했으면,
중요도가 낮은 특성을 제거해 feature selection을 할 수 있다. (하지만 정확도는..줄어든다..!)
minimum_importance = 0.000
mask = permuter.feature_importances_ > minimum_importance
features = X_train.columns[mask]
X_train_selected = X_train[features]
X_val_selected = X_val[features]
중요도가 일정 이상인 feature만 선택할 수 있는데,
그다음에 모델을 다시 돌려, 성능을 확인한다. (하지만 정확도는 feature가 많을수록 올라간다.)
'머신러닝, 딥러닝' 카테고리의 다른 글
clf = RandomForestClassifier() 같이 변수를 설정해주는 이유 (0) | 2021.03.01 |
---|---|
모델의 score - accuracy, f1, rmse, roc_auc, 뭐가 디폴트지? (0) | 2021.02.19 |
multi-label 분류 문제에서 f1 score는 못 사용하는 걸까? (3) | 2021.02.16 |
n_jobs = -1 ? 2 ? 4? 뭘 넣지? (3) | 2021.02.14 |
분류Classification와 회귀Regression의 차이 (0) | 2021.02.13 |