特征选择

特征选择是特征工程里的一个重要问题,其目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。并且常能听到“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”,由此可见其重要性。
特征选择有以下三种常见的方法:
导入数据:

import pandas as pd
data = pd.read_csv(r"C:\Users\18700\Desktop\03数据预处理和特征工程\digit recognizor.csv")
data.head()X = data.iloc[:,1:] #特征矩阵
y = data.iloc[:,0] #标签
X.shape #维度指的是特征的数量,这个数据维度太高
#(42000, 784)
"""
这个数据量相对夸张,如果使用支持向量机和神经网络,很可能会直接跑不出来。使用KNN跑一次大概需要半个小时。
用这个数据举例,能更够体现特征工程的重要性。
"""

Wrapper(包装法)

基本思想:基于hold-out方法,对于每一个待选的特征子集,都在训练集上训练一遍模型,然后在测试集上根据误差大小选择出特征子集。需要先选定特定算法,通常选用普遍效果较好的算法, 例如Random Forest, SVM, kNN等等。
但是遍历所有可能的组合达到全局最优级,计算复杂度是2^n,一般是不太实际的算法。

Filter(过滤法)

Filter(过滤法):按照发散性或相关性对各个特征进行评分,设定阈值或者待选择特征的个数进行筛选
基本想法是:分别对每个特征x,计算x相对于标签y的信息量S。然后将S按照从大到小排序,输出前k个特征。关键的问题是使用什么样的方法来度量 S?下面给出几种常见的度量方式:

Pearson相关系数

Pearson相关系数
皮尔森相关系数是一种最简单的,能帮助理解特征和变量之间关系的方法,衡量的是变量之间的线性相关性,结果的取值区间为[-1,1] , -1 表示完全的负相关(这个变量下降,那个就会上升), +1 表示完全的正相关, 0 表示没有线性相关性。Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的pearsonr方法能够同时计算相关系数和p-value

import numpy as np
from scipy.stats import pearsonrnp.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
print("Lower noise:", pearsonr(x, x + np.random.normal(0, 1, size)))
print("Higher noise:", pearsonr(x, x + np.random.normal(0, 10, size)))from sklearn.feature_selection import SelectKBest
# 选择K个最好的特征,返回选择特征后的数据
# 第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
# 参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近 0 。

卡方验证

卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。卡方检验类feature_selection.chi2计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。再结合feature_selection.SelectKBest这个可以输入”评分标准“来选出前K个分数最高的特征的类,我们可以借此除去最可能独立于标签,与我们分类目的无关的特征。

from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest #选择k个分数最高的特征
from sklearn.feature_selection import chi2 #卡方检验#假设在这里我需要300个特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y) #选择前300个卡方值的特征
X_fschi.shape
#(42000, 300)

验证模型的效果如何

cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

输出结果:

0.9344761904761905
'''
如果模型的效果降低了,这说明我们在设定k=300的时候删除了与模型相关且有效的特征,
我们的K值设置得太小,要么我们需要调整K值,要么我们必须放弃相关性过滤。
'''

互信息法

互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似,它既可以做回归也可以做分类,并且包含两个类feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)。
它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。

from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y)
k = result.shape[0] - sum(result <= 0)
#X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()

方差选择法

过滤特征选择法还有一种方法不需要度量特征 x 和标签 y 的信息量。这种方法先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。优先消除方差为0的特征。VarianceThreshold有重要参数threshold,表示方差的阈值,表示舍弃所有方差小于threshold的特征,不填默认为0,即删除所有的记录都相同的特征。
VarianceThreshold:

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold() #实例化,不填参数默认方差为0
X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵
#也可以直接写成 X = VairanceThreshold().fit_transform(X)
X_var0.shape #是一个ndarray
#(42000, 708) #可将特征变少了,删除了方差为0的特征#X_var0.head() #会报错
pd.DataFrame(X_var0).head() #所以需要转换为dataframe

根据方差的中位数进行过滤

#通过var的中位数进行过滤
import numpy as np
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X) #就是舍弃方差小于中位数方差的特征
#X.var()是一个series,.values提取对应的值
X.var().values
np.median(X.var().values)
X_fsvar.shape
#(42000, 392)

特征是伯努利随机变量(二分类)

#若特征是伯努利随机变量,假设p=0.8,即二分类特征中某种分类占到80%以上的时候删除特征
X_bvar = VarianceThreshold(.8 * (1 - .8)).fit_transform(X)
X_bvar.shape
#(42000, 685)

方差选择的逻辑并不是很合理,这个是基于各特征分布较为接近的时候,才能以方差的逻辑来衡量信息量。但是如果是离散的或是仅集中在几个数值上,如果分布过于集中,其信息量则较小。而对于连续变量,由于阈值可以连续变化,所以信息量不随方差而变。 实际使用时,可以结合cross-validate进行检验

Embedded(嵌入法)

Embedded(嵌入法):先使用某些机器学习的模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征(类似于Filter,只不过系数是通过训练得来的)
基于惩罚项的特征选择法 通过L1正则项来选择特征:L1正则方法具有稀疏解的特性,因此天然具备特征选择的特性。

feature_selection.SelectFromModel

class sklearn.feature_selection.SelectFromModel (estimator, threshold=None, prefit=False, norm_order=1,max_features=None)
#estimator:使用的模型评估器,只要是带feature_importances_或者coef_属性,或带有l1和l2惩罚项的模型都可以使用。
#threshold:特征重要性的阈值,重要性低于这个阈值的特征都将被删除。
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFCRFC_ = RFC(n_estimators =10,random_state=0) #需要先实例化随机森林,再带入SelectFromModel。
X_embedded = SelectFromModel(RFC_,threshold=0.005).fit_transform(X,y) #这个是嵌入法的实例化
#在这里我只想取出来有限的特征。0.005这个阈值对于有780个特征的数据来说,是非常高的阈值,因为平均每个特征只能够分到大约0.001的feature_importances_
X_embedded.shape
#(42000, 47)  模型的维度明显被降低了

绘制threshold的学习曲线

import numpy as np
import matplotlib.pyplot as pltRFC_.fit(X,y).feature_importances_ #看特征重要性
#linspace(小值,大值,个数) 在最大值和最小值之间取20个数
threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20) #让阈值的取值在0到最大值之间取出20个数score = []
for i in threshold:X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y)once = cross_val_score(RFC_,X_embedded,y,cv=5).mean()score.append(once)plt.plot(threshold,score)
plt.show()

X_embedded = SelectFromModel(RFC_,threshold=0.00067).fit_transform(X,y)
X_embedded.shape
#(42000, 324)cross_val_score(RFC_,X_embedded,y,cv=5).mean()
#0.9391190476190475

三种常见的特征选择方法相关推荐

  1. NHibernate学习之五:三种常见的配置方法。

    配置NHibernate有三种常见的配置方法.   1:在web.config,App.config里面配置 <?xml version="1.0" encoding=&qu ...

  2. 三种常见的 Mac 安装 git 工具的方法

    目录 前言 正文 一.佛系法 二.brew 法 三.终极大法 结尾 前言 有时候新 Mac 本子需要安装 git 工具,或者原来的 git 工具损坏了,再或者需要升级 git 版本,都需要涉及重新安装 ...

  3. 一文介绍机器学习中的三种特征选择方法

    作者 | luanhz 来源 | 小数志 导读 机器学习中的一个经典理论是:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.也正因如此,特征工程在机器学习流程中占有着重要地位.广义的特征 ...

  4. xp系统蓝屏代码7b_遇到系统问题,三种常见处理方法你更pick谁

    使用恢复功能之前请务必备份好数据,一旦操作可能导致数据无法恢复!!!卡慢.蓝屏.进不去系统?系统出现故障了,是拜托朋友还是外出花钱?求人不如求己,遇到系统问题 , 三种常见处理方法你更pick谁? 0 ...

  5. java常见的ide_在三个Java IDE中生成的三种常见方法

    java常见的ide 在本文中,我研究了NetBeans 8.0.2 , IntelliJ IDEA 14.0.2和Eclipse Luna 4.4.1生成的三种"通用"方法[ e ...

  6. 在三个Java IDE中生成的三种常见方法

    在本文中,我研究了NetBeans 8.0.2 , IntelliJ IDEA 14.0.2和Eclipse Luna 4.4.1生成的三种"通用"方法[ equals(Objec ...

  7. Android应用开发中三种常见的图片压缩方法

    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法private Bitmap comp ...

  8. 怎么用html3秒自动跳网页,HTML页面3秒后自动跳转的三种常见方法

    在练习中,我分博累发口小定逻间框加题览果些屏洁动理应们常常遇到一种问题就是,怎么实现页面N秒之后自动跳转圈件浏用是刚.它学编套互学工久不都维逻直数构过曾结里总经网屏广明果名呢? 我圈调直年情,量的单框 ...

  9. 图像灰度化的三种常见方法源码

    图像灰度化是图像处理很基础的一部分,在这里给出图像灰度化的三种常见方法的M源码,以供大家参考~ 平均值法,最大值法,加权平均值法 function f=MyGrayProcessing(Img) [m ...

最新文章

  1. pandas使用fillna函数将dataframe中缺失值替换为空字符串(replace missing value with blank string in dataframe)
  2. Moderate Modular Mode %,取模运算性质,数轴,思维
  3. Microsoft Dynamics CRM server 2013   一般销售流程之 订单 简单介绍
  4. beyond compare类似软件_BIM工作是什么?需要哪些BIM软件来完成?
  5. 计算机启动程序bios_如何构建自己的计算机,第三部分:准备BIOS
  6. 北京人文计算机学院,北京人文大学计算机信息工程学院举行元旦晚会
  7. 【待完善】【表达学习】稀疏表达SRC方法研究
  8. Java 10 正式发布!时隔 6 月带来 109 项新特性
  9. PHP网站安全日志系统开发与部署
  10. 闲人闲谈PS之十四——幕墙工程系统化管理施工设计篇
  11. Python计算机视觉之特征提取与图像匹配
  12. java mock when return can not resolve method xxxx error
  13. 360公司2019校招笔试编程题合集答案——python版本
  14. 在docker中运行自己的eureka服务端
  15. 传奇脚本显示服务器开区时间代码,GOM引擎该地图只限新区开放方法,传奇开区时设置老区不能进脚本...
  16. 苹果电脑可以装windows系统吗_Linux系统安装Windows软件? 通过这个工具可以做到...
  17. WIN10环境下配置hadoop+spark并运行实例的教程
  18. 深度学习算法中卷积神经网络的应用
  19. 树脂除镍离子交换作用
  20. Visual Studio for Nintendo Switch? -FUZE4 Nintendo Switch是一个了不起的编码应用程序

热门文章

  1. 这个夏天,我在网上学日语
  2. 数据中心的 TCP-Delay ACK 与 RTO, RACK
  3. 移动电子商务的发展趋势
  4. 软件工程—理论与实践
  5. 安卓强制恢复出厂_手机越用越卡顿,“恢复出厂设置”真的有用吗?网友:咋不早说!...
  6. php 网页转换成pdf,PHP html 转换成PDF wkhtmltopdf HTML 转换成 PDF
  7. 声音编辑软件----CoolEdit
  8. 全国平均工资出炉,这波拖后腿了吗?
  9. SSL证书是否要付费购买 免费SSL证书无法使用
  10. [每日一题]746. 使用最小花费爬楼梯