python节点平均度_基于Python的遥感特征筛选—稳定度与平均不纯度减少量

引言

本文将向大家讲解特征筛选方法中,较为常用的两种方法,分别是稳定度与平均不纯度减少量(Mean impurity decrease)。其中,稳定度采用了python中机器学习库(Scikit-lean)中所支持的两种实现方法,分别是随机lasso和随机logistic回归。由于sklearn(版本0.21.3)下,两种方法已经被移出sklearn包,因此,本文章将基于Scikit-lean 0.19.1版本进行筛选实现。另外,目前也有学者安装了github网站上的新库,以完成调用,但该库内算法实现可能不够完全,感兴趣的同学可以试试:手把手解决RandomizedLogisticRegression ImportError​blog.csdn.net

主要方法原理

1.稳定度筛选原理

稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果。比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

2.平均不纯度减少量筛选原理

随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。

基尼指数的计算公式:其中,K表示有K个类别,pmk表示节点m中类别k所占的比例。 直观地说,就是随便从节点m中随机抽取两个样本,其类别标记不一致的概率

数据介绍

本实验采用的数据与该文相同:上官:基于Python的遥感特征筛选—卡方检验筛选​zhuanlan.zhihu.com

python代码实现(稳定度筛选方法)

import pandas as pd

from sklearn.linear_model import RandomizedLasso

from sklearn.linear_model import RandomizedLogisticRegression

#Step1. 读取数据,指定标签和特征

Filepath = r"E:\yync\try\edata\data_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:\yync\try\edata\data_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,表明稳定度越高。a.第一个稳定度矩阵

图b是stability_RLR()函数运行的结果,随机Logistic回归筛选方法结果。对应顺序和图a相同。b.第二个稳定度矩阵

2.运行代码"python代码实现(随机森林筛选方法)"后我们得到了如下输出:

图c中矩阵元素共27个,对应原始数据出去status列后的每一项特征,不纯度减少量越大,证明特征越好。c.平均不纯度减少量矩阵

参考文献Python - 回归(线性回归、RFE、LASSO 和 岭回归+K折交叉验证)​blog.csdn.net随机森林之特征选择 - 人若无名 - 博客园​www.cnblogs.com特征筛选(随机森林) - 小丑_jk - 博客园​www.cnblogs.com


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部