回归特征选取_[特征选择]特征重要性

特征重要性指的是根据输入特征在预测目标变量时的有用程度给它们打分的技术。
计算特征重要性的方法很多,如统计上的相关系数,线性模型的相关系数、决策树和排列重要性分数。
下面从以下几个方面介绍特征重要性:
-
1 特征重要性概念
-
2 特征重要性方法
-
2.1 系数作为特征重要性
-
2.2 决策树特征重要性
-
2.3 排列特征重要性
-
2.4 重要特征选取
-
1 特征重要性概念
特征重要性指的是为预测建模中的输入特征分配分数的一种技术,即表示每个特征在进行预测时的相对重要性。
在数值预测(回归)和标签预测(分类)中,可以计算特征重要性得分。
重要性得分在预测建模型中,可以使我们更好的理解数据和模型以及减少输入特征数。
特征重要性得分在预测建模中具有重要的作用:
- 提供对数据的洞察。相对得分可以突出哪些特征与目标最相关以及哪些特征与目标最不相关。领域专家可能会对此进行解释,并将其用作收集更多或不同数据的基础。
- 提供对模型的洞察。多数重要性得分是通过预测模型在数据集上的拟合计算得到的。通过对重要性得分检查,可以深入了解特定模型,以及在进行预测时,哪些特征对模型来说是最重要的,哪些是最不重要的。这可以作为模型支持它的模型解释。
- 为降维和特征选择提供依据,从而提高预测模型的效率和有效性。这可以通过重要性得分来选择要删除的特征(最低分)或要保留的特征(最高分)来实现。这是一种特征选择,可以简化用于建模的问题,加快建模过程(删除特征称为降维),在某些情况下,还可以提高模型的性能。
通常,我们希望量化预测因素(特征)和结果之间的关系强度。在筛选时,对预测因素排名(ranking)是很有用的。
特征重要性得分可用于包裹模型(wrapper model),例如SelectFromModel类[1],来执行特征选择。
2 特征重要性方法
首先准备数据:
from sklearn.datasets import make_classification, make_regression# 创建分类数据集,5个有用特征,5个无用特征X_class,y_class=make_classification(n_samples=1000,n_features=10,n_informative=5,n_redundant=5,random_state=1)X_reg,y_reg=make_regression(n_samples=1000,n_features=10,n_informative=5,random_state=1)
2.1 系数作为特征重要性
线性机器学习算法拟合的模型的预测是输入值的加权和,如线性回归、逻辑回归、加入正则项的岭回归、套索回归和弹性网络。
所有这些算法都是通过找到一组系数用于加权和,然后用于预测。这些系数可以直接用作特征重要性评分的一种粗略类型。
下面看一下如何使用系数作为分类和回归的重要特征。我们将在数据集上拟合一个模型来找到系数,然后总结每个输入特征的重要性分数,最后创建一个条形图来了解这些特征的相对重要性。
# 系数作为特征重要性from sklearn.linear_model import LinearRegression,LogisticRegressionimport matplotlib.pyplot as plt# 定义函数def plot_importance(model,X,y): model.fit(X,y) importance=model.coef_if importance.ndim==2:importance=importance[0]for i,v in enumerate(importance): print('Feature: %0d, Score: %.5f'%(i,v)) plt.bar([*range(len(importance))],importance) plt.show()# 1 线性回归特征重要性# 在回归数据集上拟合线性回归模型,并检索coeff_属性,该属性包含为每个输入变量找到的系数# 这些系数可以为粗略的特征重要性评分提供依据。这假设输入变量具有相同的比例,或者在拟合模型之前已经进行了比例调整。model = LinearRegression()plot_importance(model,X_reg,y_reg) # 选出了5个重要特征# 2 逻辑回归# 输入数据已进行比例调整model = LogisticRegression()plot_importance(model,X_class,y_class) # 看不出哪个重要#这是类0和1的分类问题。系数是正的和负的。#正的分数表示预测类别1的特征,负的分数表示预测类别0的特征。

2.2 决策树特征重要性
决策树算法,如分类和回归树(CART),在用于选择分割点的准则如基尼指数或熵的减少的基础上提供重要性得分。
# 决策树、随机森林,XGBoost重要性from sklearn.tree import DecisionTreeClassifier,DecisionTreeRegressorfrom sklearn.ensemble import RandomForestClassifier,RandomForestRegressorfrom xgboost import XGBRegressor,XGBClassifier# 定义函数def plot_importance(model,X,y): model.fit(X,y) importance=model.feature_importances_if importance.ndim==2:importance=importance[0]for i,v in enumerate(importance): print('Feature: %0d, Score: %.5f'%(i,v)) plt.bar([*range(len(importance))],importance) plt.show()# 1 CART特征重要性# 1.1 回归model = DecisionTreeRegressor()plot_importance(model,X_reg,y_reg) # 选出了3个重要特征# 1.2 分类model = DecisionTreeClassifier()plot_importance(model,X_class,y_class) # 选出了4个重要特征# 2 随机森林# 2.1 回归model = RandomForestRegressor()plot_importance(model,X_reg,y_reg) # 选出了2-3个重要特征# 2.2 分类model = RandomForestClassifier()plot_importance(model,X_class,y_class) # 选出了2-3个重要特征# 3 XGBoost# 3.1 回归model = XGBRegressor()plot_importance(model,X_reg,y_reg) # 选出了2-3个重要特征# 3.2 分类model = XGBClassifier()plot_importance(model,X_class,y_class) # 选出了7个重要特征

2.3 排列特征重要性
排列特征重要性(permutation feature importance )[2]是一种计算相对重要性分数的技术,独立于所使用的模型。
首先模型对数据进行拟合,该模型自身不支持特征重要性评分。然后,该模型对数据集进行预测,但是数据集中的某一个特征的值被打乱。对数据集中的每个特征都重复此操作。然后整个过程重复3,5,10或更多次。每个输入特征的平均重要性分数(以及给定重复的分数分布)作为结果。
该方法可用于回归和分类,但需要提供一个性能指标作为重要性评分的基础,如回归的均方误差和分类的准确率。
# 排列特征重要性# 模型选用不支持特征选择的KNNfrom sklearn.inspection import permutation_importancefrom sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor# 定义函数def plot_importance(model,X,y,scoring): model.fit(X,y) results=permutation_importance(model,X,y,scoring=scoring) importance=results.importances_meanif importance.ndim==2:importance=importance[0]for i,v in enumerate(importance): print('Feature: %0d, Score: %.5f'%(i,v)) plt.bar([*range(len(importance))],importance) plt.show()# 1 回归model = KNeighborsRegressor()plot_importance(model,X_reg,y_reg,scoring='neg_mean_squared_error') # 选出了2-3个重要特征# 2 分类model = KNeighborsClassifier()plot_importance(model,X_class,y_class,scoring='accuracy') # 选出了2-3个重要特征

2.4 重要特征选取
特征重要性得分可以用来解释数据,但也可以直接用来排序和选择对预测建模最有用的特征。
用下面的列子进行说明。
# 1 用所有特征建模并评估模型表现from sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom sklearn.feature_selection import SelectFromModelX_train,X_test,y_train,y_test=train_test_split(X_class,y_class,test_size=0.33,random_state=1)model=LogisticRegression(solver='liblinear')model.fit(X_train,y_train)yhat=model.predict(X_test)accuracy=accuracy_score(y_test,yhat)print('Accuracy: %.2f'%(accuracy*100))# 2 从模型中进行特征选择fs=SelectFromModel(RandomForestClassifier(n_estimators=200),max_features=5)# 特征选择方法对训练数据进行拟合,然后计算所有输入特征的重要性得分并排序最后选取特征# learning relationship from training datdafs.fit(X_train,y_train)# transform train input dataX_train_fs=fs.transform(X_train)# transform test input dataX_test_fs=fs.transform(X_test)model=LogisticRegression(solver='liblinear')model.fit(X_train_fs,y_train)yhat=model.predict(X_test_fs)accuracy=accuracy_score(y_test,yhat)print('Accuracy: %.2f'%(accuracy*100))# Accuracy: 84.55# Accuracy: 84.55
可以看到模型在数据集上取得了相同的性能,尽管只有一半的输入特征。正如预期的那样,随机森林计算出的特征重要性得分允许我们对输入特征进行排序,并删除那些与目标变量无关的特征。
参考资料
[1]
SelectFromModel类: _https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html_
[2]
排列特征重要性: _https://scikit-learn.org/stable/modules/permutation_importance.html_

