python卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)...

引言

基于前几篇文章关于筛选方法的介绍,本篇同样给大家介绍两种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.compython卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)..._第1张图片

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-Trees​xueshu.baidu.comReal-Time Lane Estimation Using Deep Features and Extra Trees Regression​xueshu.baidu.comExtraTrees原理_数据结构与算法_xbmatrix的博客-CSDN博客​blog.csdn.net

你可能感兴趣的:(python卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)...)