如何进行特征选择|机器学习

简介: 如何进行特征选择|机器学习

特征选择

为什么要进行特征选择

我们在现实任务中经常会遇到维数灾难的问题,这是由于属性过多而造成的,若能从中选择出重要的特征,使得后续学习过程仅需在一部分特征上构建模型,则维数灾难问题会大为减轻。


去除不相关特征往往会降低学习任务的难度,我们把复杂的问题变得简单化,往往也能使得效率变高,结果变的更准确。


过滤式(Filter)

过滤式是过滤式的方法先对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关,也就是说我们先用特征选择过程对初始特征进行“过滤”,再用过滤后的特征来训练模型。


  • 方差选择法


设置一个阈值,然后计算各个特征的方差,根据阈值,选择方差大于阈值的特征。

该方法的代码使用方式如下:

from sklearn.feature_selection import VarianceThreshold
# 方差选择法,返回值为特征选择后的数据
# 参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)
  • 相关系数法


计算各个特征x对目标值y的Pearson相关系数,Pearson相关系数的计算方式如下:

image.png

Pearson 反应的是两个变量间的线性相关性,它的取值区间为[-1,1],其中1表示完全正相关,0表示完全没有线性关系,-1表示完全的负相关。相关系数越接近于0,相关性越弱,通常在0.8-1.0之间极强相关,0.6-0.8强相关,0.4-0.6中等强度相关,0.2-0.4弱相关,0-0.2极弱相关或者不相关。


该方法的代码使用方式如下:

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
# 选择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)
  • 卡方检验


对于卡方检验,我们需要检验的是定性自变量对定性因变量的相关性,假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建如下的统计量(这里的A表示观察值,E表示理论值):

image.png

我们可以看出,这个统计量的含义简而言之就是自变量对因变量的相关性。

该方法的代码使用方式如下:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# 选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
  • 互信息法

互信息可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性,互信息是联合分布与边缘分布的相对熵,互信息计算公式如下:

image.png

该方法的代码使用方式如下:

from sklearn.feature_selection import SelectKBest
from minepy import MINE
# 由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x, y):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), 0.5)
# 选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

包裹式(wrapper)

与过滤式特征选择不考虑后续学习器不同,包裹式特征选择直接把最终将要使用的学习器性能作为特征子集的评价准则。因此从最终学习器性能来看,包裹式特征选择比过滤式特征选择更好,但是其计算开销也要比过滤式特征选择大得多。


  • 递归特征消除法


递归特征消除法使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。


该方法的代码使用方式如下:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# 递归特征消除法,返回特征选择后的数据
# 参数estimator为基模型
# 参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

嵌入式(Embedding)

在过滤式和包裹式特征选择方法中,特征选择过程与学习器训练过程有明显的分别;与此不同的是,嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动的进行了特征选择。


  • 基于惩罚项的特征选择法


我们使用带有惩罚项的基模型(例如LR、SVM),不仅可以筛选出特征,同时也进行了降维,下面的例子尝试使用LR+L1正则来进行特征选择:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
  • 基于树模型的特征选择


同样我们也可以使用树模型进行特征的选择,树模型中的GBDT就是一个很好的例子,代码的实现方式如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
相关文章
vscode ctrl+/ 注释快捷键失效
首次安装vscode 不知道为何会快捷键失效,首先想到的就是键位冲突! 于是解决了。
6241 0
vscode ctrl+/ 注释快捷键失效
|
数据采集 SQL 数据挖掘
2024年8个Python高效数据分析的技巧_python 数据分析 效率,2024年最新阿里社招p7面试几轮
2024年8个Python高效数据分析的技巧_python 数据分析 效率,2024年最新阿里社招p7面试几轮
|
供应链 数据挖掘
数据分析五大指标分类
数据分析中常见的指标分类方法
|
数据挖掘
数据分析思维(四)|分类/矩阵思维
在进行数据分析工作时,我们往往会涉及到多个核心指标,而对于不同数值核心指标的结合又会产生多种不同的结果,我们将相似结果的内容放到一起进行统一决策就会大大节省数据分析的时间,这种思想我们称之为分类思维
数据分析思维(四)|分类/矩阵思维
|
数据挖掘 Python
数据分析思维(二)|相关思维
相关思维是数据分析中最常见的思维之一,在我们观察指标变化的时候,往往需要观察指标之间的相关关系,比如观察自己身高和体重的变化,这就是一种相关思维的体现。
数据分析思维(二)|相关思维
|
数据挖掘
数据分析面试手册《统计篇》
数据分析面试中常见统计类问题。
数据分析面试手册《统计篇》
|
SQL 数据挖掘 关系型数据库
数据分析面试手册《SQL篇》
数据分析面试常见SQL题解读。
|
机器学习/深度学习 数据挖掘
数据分析面试手册《指标篇》
数据分析面试,指标类问题如何进行作答?
|
机器学习/深度学习
|
数据挖掘
数据分析思维(五)|逻辑树思维
在很多数据分析场景中我们需要梳理分析的逻辑,需要进行指标从大到小的拆分,这时候我们可以顺着影响分析结果的因素进行层层溯源,从而抓住问题的核心。为了有更清晰的逻辑结构,常常采用逻辑树(又称问题树、分解树)进行整体过程的呈现。逻辑树使用层级的结构将每个大问题的所有子问题进行罗列,然后再将子问题的子问题进行罗列,以此类推,当问题不能够被拆分时形成一个完整的逻辑树。
数据分析思维(五)|逻辑树思维