引言
本文将向大家讲解特征筛选方法中,较为常用的两种方法,分别是稳定度与平均不纯度减少量(Mean impurity decrease)。其中,稳定度采用了python中机器学习库(Scikit-lean)中所支持的两种实现方法,分别是随机lasso和随机logistic回归。由于sklearn(版本0.21.3)下,两种方法已经被移出sklearn包,因此,本文章将基于Scikit-lean 0.19.1版本进行筛选实现。另外,目前也有学者安装了github网站上的新库,以完成调用,但该库内算法实现可能不够完全,感兴趣的同学可以试试:
手把手解决RandomizedLogisticRegression ImportErrorblog.csdn.net主要方法原理
1.稳定度筛选原理
稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果。比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。
2.平均不纯度减少量筛选原理
随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
基尼指数的计算公式:
数据介绍
本实验采用的数据与该文相同:
上官:基于Python的遥感特征筛选—卡方检验筛选zhuanlan.zhihu.compython代码实现(稳定度筛选方法)
import pandas as pd
from sklearn.linear_model import RandomizedLasso
from sklearn.linear_model import RandomizedLogisticRegression
#Step1. 读取数据,指定标签和特征
Filepath = r"E:yynctryedatadata_shift.txt"
data1 = pd.read_csv(Filepath)
label = data1["status"]
feature = data1.drop(["status"], axis = 1)
#Note:填充NA或NAN值(指定列)
feature["RGB_mean_2j"].fillna(feature["RGB_mean_2j"].mean(), inplace=True)
feature.fillna('UNKNOWN', inplace=True)
#Step2. 定义随机Lasso筛选方法
def stability_RL():
Rlasso = RandomizedLasso()
Rlasso.fit(feature, label)
print(Rlasso.scores_)
#Step2. 定义随机Logistic回归筛选方法
def stability_RLR():
RogisticregRession = RandomizedLogisticRegression()
RogisticregRession.fit(feature, label)
print(RogisticregRession.scores_)
stability_RL()
stability_RLR()
代码关键点说明:
文章所用的两种随机回归函数均可以进行详细的参数设置。基于上述代码运行稳定度每次都会不一样,这主要是因为,没有设置random_state这一参数造成的,大家可以结合自身的需要设置。筛选后不同特征的得分会受到正则化参数alpha的影响,但是sklearn的随机lasso和logistic能够自动选择最优的alpha。
python代码实现(随机森林筛选方法)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
#Step1. 缺失特征值填充+数据分类(验证集和测试集)
FilePath = r"E:yynctryedatadata_shift.txt"
data1 = pd.read_csv(FilePath)
#Note:数据分类,以0.25比例选测试集
label = data1['status']
feature = data1.drop(['status'], axis=1)
feature_train, feature_test, label_train, label_test = train_test_split(feature, label, test_size=0.25, random_state=1)
#Note:填充NA或NAN值(指定列)
feature["RGB_mean_2j"].fillna(feature["RGB_mean_2j"].mean(), inplace=True)
feature.fillna('UNKNOWN', inplace=True)
#Step2. 定义Mean impurity decrease方法(可自行设定random_state参数)
def random_gini():
forest = RandomForestClassifier(n_estimators=10000, random_state=1, n_jobs=-1)
forest.fit(feature_train, label_train)
importances = forest.feature_importances_
print(importances)
random_gini()
代码关键点说明:
RandomForestClassifier()方法默认的节点分裂优度评估方法为"Gini",因此无需对其进行特别设置。
处理结果
1.运行代码"python代码实现(稳定度筛选方法)"后我们得到了如下输出:
图a是stability_RL()函数运行的结果,即随机Lasso筛选方法结果。一共有27个元素,正好对上数据内部,去除status以后的每一列数据,数值越接近于1,表明稳定度越高。
图b是stability_RLR()函数运行的结果,随机Logistic回归筛选方法结果。对应顺序和图a相同。
2.运行代码"python代码实现(随机森林筛选方法)"后我们得到了如下输出:
图c中矩阵元素共27个,对应原始数据出去status列后的每一项特征,不纯度减少量越大,证明特征越好。
参考文献
Python - 回归(线性回归、RFE、LASSO 和 岭回归+K折交叉验证)blog.csdn.net