任务七 特征工程 特征选择

特征工程是什么

范围:

特征构建 特征探索 特征增强 特征衍生 特征选择 特征转换 特征学习

特征选择的定义

尽管有些特征对我们的问题是有意义的,但是不同特征的重要性不同,有些特征之间可能存在了信息冗余,过多的特征也可能会导致过拟合的情况发生,因此选出一些对问题影响比较大的特征就尤为重要了。

特征选择是从原始的特征集中选择出一个子集,从而在不降低甚至提高模型性能的情况下,减少输入数据的规模。

特征选择的目的

  • 减少特征数量、降维,使模型泛化能力更强,减少过拟合;
  • 增强对特征和特征值之间的理解。

filter过滤法

过滤法一般做预处理步骤,特征选择完全独立于任何机器学习算法

根据各种统计检验中的分数 以及 相关性的各项指标来选择特征

方差选择法

该方法先计算个各个特征的方差,然后移除方差不满足阈值的特征。

假设我们有一个带有布尔特征的数据集,我们要移除那些超过80%的数据都为1或0的特征。布尔特征是伯努利随机变量

sklearn默认设置下,它将移除所有方差为0的特征,即所有样本中数值完全相同的特征。而在本例中,我们将阈值设为:

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

VarianceThreshold_Danker01的博客-CSDN博客

相关系数法

在sklearn当中,有三种常用的方法来评判特征与标签之间的相关性。

卡方过滤/卡方检验法

卡方过滤是专门针对 离散型标签(即分类问题)的相关性过滤

卡方检测类feature_selection.chi2计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。再结合feature_selection.SelectKBest

用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

卡方检测的本质是推测两组数据间的差异,其检测的原假设是“两组数据是相互独立的”

卡方检测返回卡方值和P值两个统计量,p值一般使用0.01或0.05作为显著性水平

从特征工程的角度,希望选取卡方值很大,p值小于0.05的特征,是和标签相关联的特征 

互信息法

互信息(Mutual Information,简称MI)是变量间相互依赖性的量度。当两个随机变量相互独立时,其互信息为0。

 

包裹式特征选择

使用预测模型给特征子集打分。每个新子集都被用来训练一个模型,然后用验证数据集来测试。通过计算验证数据集上的错误次数(即模型的错误率)给特征子集评分。由于包装类方法为每个特征子集训练一个新模型,所以计算量很大。不过,这类方法往往能为特定类型的模型找到性能最好的特征集。

 

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFE
from sklearn.svm import SVR
import pandas as pd

#sklearn的friedman1数据集
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)

#estimator为用于训练原始特征的预测模型,此处选择支持向量机SVR
estimator = SVR(kernel="linear")

#RFE参数为:预测模型、选择的特征数、每轮迭代淘汰的特征数量
selector = RFE(estimator, n_features_to_select = 5, step=1)
selector = selector.fit(X, y)

#返回选取特征的结果
print(selector.support_)
'''
array([ True,  True,  True,  True,  True,
        False, False, False, False, False], dtype=bool)
'''

#特征排名,所有被选上的特征都是rank1
print(selector.ranking_)
'''
array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])
'''

嵌入式特征选择

Embedded(嵌入法)是特征选择的一种方法,它先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。这种方法通过训练来确定特征的优劣。

特征选择-嵌入式选择_clvsit的博客-CSDN博客_嵌入式特征选择

基于LASSO的特征学习方法

lasso函数时 代价函数后面加了一个正则化

深度学习-正则化 - 知乎 

机器学习必知必会:正则化 - 知乎

机器学习(十):损失函数 - 知乎

损失函数(Loss Function) - 知乎

numpy_square函数_付康为的博客-CSDN博客_np.square

numpy之linspace()函数使用详解 | w3c笔记 

写给初学者的LASSO回归 - 腾讯云开发者社区-腾讯云

主成分算法PCA

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值