引言
基于前几篇文章关于筛选方法的介绍,本篇同样给大家介绍两种python封装的经典特征降维方法,递归特征消除(RFE)与极限树(Extra-Trees, ET)。其中,RFE整合了两种不同的超参数,分别是SVM库中的线性SVC与Logistic方法。而ET函数内采用的仍是基尼系数评价特征重要性,因此这与前文基于随机森林的筛选指标是相同的,即平均不纯度减少量。运行环境:Anoconda python3.7; pycharm; VS2015;
主要方法原理
1.RFE降维
RFE是一种性能良好,泛化能力较强的特征选择方法,它是一种基于模型的后向搜索方法,在每次迭代删除特征的过程中,将模型内部的特征重要性评价指标作为度量标准,重新评估当前被删除的特征子集与当前剩余特征子集之间的关系,试图找回不相关的、非冗余特征,使其有一定几率重新加回当前特征子集。特征越早被删除,被重新考察的机会越大。另外,在“最优特征子集”搜索过程中,在当前特征子集与“最优特征子集”准确率保持持平时,即输出当前子集并对其他非最优子集内部的特征进行重要程度排序。
2.ET降维
ET算法由PierreGeurts等人于2006年提出,该算法与随机森林的基本原理相差不大,均是基于决策树进行回归和预测。因此本文将从这两者区别的角度进行简单描述:
(1)随机森林应用的是Bagging模型,而ET是使用所有的训练样本得到每棵决策树,也就是每棵决策树应用的是相同的全部训练样本;
(2)随机森林是在一个随机子集内得到最佳分叉属性,而ET是完全随机的得到分叉值,从而实现对决策树进行分叉的
第二点也可以那么理解:在ET算法中每棵决策树选择划分点的方式均不同。对于普通决策树,每个特征都是根据某个标准(信息增益或者gini不纯)去进行划分,比如说一个数值特征的取值范围是0到100,当我们把这个特征划分为0-45,45-100的时候,效果最佳(从信息增益或者gini不纯的角度),决策树就会将45作为划分点;然后再按照某个标准来选择特征。而对于ET中的决策树,划分点的选择更为随机,比如一个数值特征的取值范围是0到100,我们随机选择一个0到100的数值作为划分点,然后再按照评判标准选择一个特征。
数据介绍
本实验所使用的数据与该文相同:上官:基于Python的遥感特征筛选—卡方检验筛选zhuanlan.zhihu.com
Python代码实现(RFE)
import pandas as pd
from sklearn.svm import SVC
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#Step1 读取数据+标签与数据分类
FilePath = r"E:\yync\try\edata\data_shift.txt"
data1 = pd.read_csv(FilePath)
label = data1["status"]
feature = data1.drop(["status"], axis=1)
feature["RGB_mean_2j"].fillna(feature["RGB_mean_2j"].mean(), inplace=True)
feature.fillna('UNKNOWN', inplace=True)
#Step2 定义线性SVC和Logistic回归的迭代模型
def SVC_RFE():
svc = SVC(kernel = "linear", C=1)
rfe = RFE(estimator=svc, n_features_to_select=5, step=1)
rfe.fit(feature, label)
print(rfe.n_features_) # 打印最优特征变量数
print(rfe.support_) # 打印选择的最优特征变量
print(rfe.ranking_) # 特征排序
def LR_RFE():
LR = LogisticRegression()
rfe = RFE(estimator=LR, n_features_to_select=3, step=1)
rfe.fit(feature, label)
print(rfe.n_features_) # 打印最优特征变量数
print(rfe.support_) # 打印选择的最优特征变量
print(rfe.ranking_) # 特征排序
SVC_RFE()
LR_RFE()
Python代码实现(Extra-tree)
import pandas as pd
from sklearn.ensemble import ExtraTreesClassifier
#Step1 读取数据+标签与数据分类
FilePath = r"E:\yync\try\edata\data_shift.txt"
data1 = pd.read_csv(FilePath)
label = data1["status"]
feature = data1.drop(["status"], axis=1)
feature["RGB_mean_2j"].fillna(feature["RGB_mean_2j"].mean(), inplace=True)
feature.fillna('UNKNOWN', inplace=True)
#Step2 定义extra-tree特征筛选方法
def Extra_tree():
Extra_model = ExtraTreesClassifier(random_state = 1)
Extra_model.fit(feature, label)
print(Extra_model.feature_importances_)
Extra_tree()
处理结果
1.Python代码实现(RFE)处理结果
如图a所示,根据程序的打印顺序,先输出的是筛选后变量的个数,即最优的特征个数,这个数等于参数x(n_features_to_select = x)。然后程序打印的是特征选择状况的布尔型表达,Fales表明该列数据,没有入选最优特征集合,True代表该列特征入选。如此对应的是第三个矩阵(Ranking矩阵), 元素为1表明排名为1,大家可以看到在这个一维矩阵里,共有5个1,也就是说这些特征均为最优特征,那么次优的就是排名为2的,以此类推。a.SVC_RFE()函数运行结果
图b为LR_RFE()函数运行结果,对应关系与图a相同。b.LR_RFE()函数运行结果
2.Python代码实现(Extra-Trees)处理结果
如图c显示了数据集中27个特征的重要性,根据重要性数值的大小,大家自行选择对应的特征就可以了。c.Extra-Trees筛选结果
pycharm内关键函数的参数展示:RFE()函数ExtraTreesClassifier()函数
参考文献Classification of Endomicroscopic Images of the Lung Based on Random Subwindows and Extra-Treesxueshu.baidu.comReal-Time Lane Estimation Using Deep Features and Extra Trees Regressionxueshu.baidu.comExtraTrees原理_数据结构与算法_xbmatrix的博客-CSDN博客blog.csdn.net