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

3eaeec6fac3530c6985c37d2d2b3fc48.png

引言

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

手把手解决RandomizedLogisticRegression ImportError​blog.csdn.net
cbc4528cf1f69405ce799771992a427a.png

主要方法原理

1.稳定度筛选原理

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

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

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

基尼指数的计算公式:

f42fec23e3be8afd2f8bd825a88c86bf.png
其中,K表示有K个类别,pmk表示节点m中类别k所占的比例。 直观地说,就是随便从节点m中随机抽取两个样本,其类别标记不一致的概率

数据介绍

本实验采用的数据与该文相同:

上官:基于Python的遥感特征筛选—卡方检验筛选​zhuanlan.zhihu.com
dc4c86e5be48474397da02dbd5c27a95.png

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

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,表明稳定度越高。

8f74eea4798adae7f637751d6bcd0a86.png
a.第一个稳定度矩阵

图b是stability_RLR()函数运行的结果,随机Logistic回归筛选方法结果。对应顺序和图a相同。

2dfef07e0384a96d98536b01a6c590db.png
b.第二个稳定度矩阵

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

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

d328bd80bd9a0092043d50174534a3d4.png
c.平均不纯度减少量矩阵

参考文献

Python - 回归(线性回归、RFE、LASSO 和 岭回归+K折交叉验证)​blog.csdn.net
a3a1e7b10941da9306bf609147ded127.png
随机森林之特征选择 - 人若无名 - 博客园​www.cnblogs.com 特征筛选(随机森林) - 小丑_jk - 博客园​www.cnblogs.com
a412d18b3feba7c9c71de6222047c04a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值