基於模型刷選特征方法有:排列重要性、shap value、null importance
這里簡單介紹一下排列重要性:
一、排列重要性原理
首先建立一個模型,計算某列特征重要性時,打亂該列順序,其余列不變,然后再使用打亂后的數據來預測,最后計算正確率;如果某列對模型預測很重要,那么打亂該列順序之后,模型預測正確率就會很差,如果對預測結果沒有影響,則說明該變量對模型沒有那么重要;為了消減隨機對結果的影響,我們會多次亂打,再求均值和方差。
二、排列重要性的好處
- 計算速度快
- 應用廣泛、易於理解
- 與我們期望一個特征重要性度量所具有的性質一致
三、排列重要性如何使用Python實現
1.可以直接eli5
庫計算和展示排列重要性
eli5
庫計算和展示排列重要性# -*- coding: utf-8 -*- """ Created on Sun Sep 26 15:51:26 2021 @author: chenguimei """ # 引入數據 from sklearn import datasets import pandas as pd import numpy as np iris = datasets.load_iris() X = pd.DataFrame(iris.data) X.columns = iris.feature_names y = iris.target print("Class labels:",np.unique(y)) #打印分類類別的種類 # 切分訓練數據和測試數據 from sklearn.model_selection import train_test_split ## 30%測試數據,70%訓練數據,stratify=y表示訓練數據和測試數據具有相同的類別比例 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1,stratify=y) #決策樹模型 from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier(criterion='gini',max_depth=4,random_state=1) tree.fit(X_train,y_train) print(X.columns,tree.feature_importances_) from sklearn.metrics import roc_curve, auc resu = tree.predict(X_test) print(resu) print(y_test) import eli5 from eli5.sklearn import PermutationImportance perm = PermutationImportance(lr, random_state=1).fit(X_test, y_test) eli5.show_weights(perm, feature_names = X_test.columns.tolist())
2.sklearn.inspection._permutation_importance 的permutation_importance
from sklearn.inspection._permutation_importance import permutation_importance from sklearn.datasets import load_iris from sklearn.metrics import get_scorer from sklearn.linear_model import LogisticRegression permutation_importance(tree, X_test, y_test, get_scorer('accuracy'))
文章強調2點:(1)打亂順序;(2)使用准確率指標衡量