特征工程是什么
范围:
特征构建 特征探索 特征增强 特征衍生 特征选择 特征转换 特征学习
特征选择的定义
尽管有些特征对我们的问题是有意义的,但是不同特征的重要性不同,有些特征之间可能存在了信息冗余,过多的特征也可能会导致过拟合的情况发生,因此选出一些对问题影响比较大的特征就尤为重要了。
特征选择是从原始的特征集中选择出一个子集,从而在不降低甚至提高模型性能的情况下,减少输入数据的规模。
特征选择的目的
- 减少特征数量、降维,使模型泛化能力更强,减少过拟合;
- 增强对特征和特征值之间的理解。
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函数时 代价函数后面加了一个正则化
numpy_square函数_付康为的博客-CSDN博客_np.square
numpy之linspace()函数使用详解 | w3c笔记
主成分算法PCA