分享

如何理解特征工程?

 昵称11935121 2018-03-29
科学总把简单的问题转化的很复杂,在彰显其严谨的同时,也把大部分的学习者挡在了门外,jacky跟大家谈谈如何深入浅出的学习特征工程?
《特征工程三部曲》之一数据处理

要理解特征工程,首先就要理解好数据(Data)和特征(Feature)的概念

(一)逻辑梳理
  • 特征工程(Feature Engineering)
    • 其本质上是一项工程活动,它目的是最大限度地从原始数据中提取特征以供算法和模型使用。
特征工程在数据挖掘中有举足轻重的位置数据领域一致认为:数据和特征决定了机器学习的上限,而模型和算法只能逼近这个上限而已。
  • 特征工程重要性:
    • 特征越好,灵活性越强;
    • 特征越好,模型越简单;
    • 特征越好,性能越出色;
好特征即使使用一般的模型,也能得到很好的效果!好特征的灵活性在于它允许你可以选择不复杂的模型,同时,运行速度也更快,也更容易理解和维护。好的特征,即使参数不是最优解,模型性能也能表现很好,因此,不需要太多时间去寻找最优参数,大大的降低了模型的复杂度,使模型趋向简单。模型的性能包括模型的效果,执行的效率及模型的可解释性。特征工程的最终目的就是提升模型的性能。

数据科学家通过总结和归纳,把特征工程划分为以下三个部分:

  • 特征工程包括:
    • 数据处理
    • 特征选择
    • 维度压缩
(二)数据处理

数据处理的常用技巧

  • 量纲不一
  • 虚拟变量
  • 缺失值填充
1.数据处理——量纲不一
  • 量纲:就是单位,特征的单位不一致,特征就不能放在一起比较。
  • 解决量纲不一致的方法:标准化
    • 0-1标准化
    • Z标准化
    • Normalizer归一化
(1)0-1标准化

是对原始数据进行线性变换,将特征值映射成区间为[0,1]的标准值中:

(2)Z标准化

基于特征值的均值(mean)和标准差(standard deviation)进行数据的标准化。它的计算公式为:

标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。

(3)Normalizer归一化

将每个样本缩放到单位范数(每个样本的范数为1),计算公式如下:

(4)如何使用sklearn实现标准化sklearn简介
  • sklearn
    • 全名Scikit-Learn,是基于Python的机器学习模块,基于BSD开源许可证,官网上可以找到相关sklearn的资源,模块下载,文档,历程等等;
    • sklearn的数据结构基于numpy和pandas;
    • sklearn的数据计算基于scipy;
    • sklearn的数据可视化基于matplotlib;
  • sklearn是在现有的数据分析,数据计算,数据可视化最好的包的基础上,搭建起来的最好python 机器学习的框架;
  • sklearn的六大基本功能
    • 分类
    • 回归
    • 聚类
    • 数据降维
    • 模型选择
    • 模型预处理
  • sklearn处理机器学习问题的三个步骤:
    • 数据准备与预处理
    • 模型选择与训练
    • 模型验证与参数调优
用sklearn实现标准化2.数据处理——虚拟变量
  • 虚拟变量:也叫哑变量和离散特征编码,可用来表示分类变量、非数据因素可能产生的影响。
  • 虚拟变量的两种数据类型:
    • 离散特征的取值之间有大小的意义:例如:尺寸(L、XL、XXL)
    • 离散特征的取值之间没有大小的意义:例如:颜色(Red、Blue、Green)
  • 离散特征值有大小意义的虚拟变量处理
    • 离散特征的取值之间有大小意义的处理函数,我们只需要把大小值以字典的方式,作为第一个参数传入即可;
    • (1) dict 映射的字典
    • pandas.Series.map(dict)
  • 离散特征值没有大小意义的虚拟变量处理
    • 离散特征的取值之间没有大小意义的处理方法,我们可以使用get_dummies方法处理,它有6个常用的参数
    • (1) data 要处理的DataFrame
    • (2) prefix 列名的前缀,在多个列有相同的离散项时候使用
    • (3) prefix_sep 前缀和离散值的分隔符,默认为下划线,默认即可
    • (4) dummy_na 是否把NA值,作为一个离散值进行处理,默认不处理
    • (5) columns 要处理的列名,如果不指定该列,那么默认处理所有列
    • (6) drop_first 是否从备选项中删第一个,建模的时候为避免共线性使用
    • pandas.getdummies(data,prefix=None,prefix_sep=’‘,dummy_na=False,columns=None,drop_first=False)
虚拟变量—实战案例

以互联网金融行业为例:

其实,虚拟变量的实质就是要把离散型的数据转化为连续型的数据,因为第1列年龄已经是连续值,所以我们就不需要处理了。我们看看如何处理学历和性别?因为不同学历之间是有高低之分的,因此我们要使用Map方法来处理这种类型的离散型数据;
  • 第1步: 首先我们要处理不同学历之间的大小值
    • 我们使用drop_duplicates方法,来看看数据列都有哪些学历
  • 第2步:理解数据值背后的意义,作出我们自己的解析,对每个学历进行评分
  • 第3步 对于性别这种没有大小比较的离散变量,我们使用get_dummies方法,来进行调用处理即可;

完整代码展示

data['学历 Map']=data['学历'].map(educationLevelDict)

dummies=pandas.get_dummies(data,columns=['性别'],prefix=['性别'],prefix_sep='_',dummy_na=False,drop_first=False)print(dummies)

3.数据处理——缺失值填充
  • 缺失值产生原因
    • 有些信息暂时无法获取;
    • 有些信息被遗漏或者错误的处理了
  • 缺失值处理方法
    • 数据补齐
    • 删除缺失行
    • 不处理
实操-使用统计指标填充缺失值《特征工程三部曲》之二 数据选择(一)什么特征选择
  • 特征选择 ( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ) ,或属性选择( Attribute Selection ) ,是指从全部特征中选取一个特征子集,使构造出来的模型更好。
(二)为什么要做特征选择
  • 在机器学习的实际应用中,特征数量往往较多,其中可能存在不相关的特征,特征之间也可能存在相互依赖,容易导致如下的后果:
    • 特征个数越多,分析特征、训练模型所需的时间就越长。
    • 特征个数越多,容易引起“维度灾难”,模型也会越复杂,其推广能力会下降。
  • 特征选择能剔除不相关(irrelevant)或亢余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化了模型,使研究人员易于理解数据产生的过程。
(三)特征选择基本原则
数据预处理完成之后,我们需要选择有意义的特征,输入机器学习的算法和模型进行训练,通常来说,从两个方面考虑来选择特征
  • 如何选择特征
    • 是否发散
    • 是否相关
如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本没有差异,那我们就可以判断,这个特征对于样本的区别并没有什么用第二个是特征与目标的相关性,与目标相关性高的特征应该优先选择
(四)特征选择常用的四种方法
我们以互联网金融实际情景举例:
  • 说白了,特征选择,就是看累计销售和用户忠诚度评分能不能成为金融产品的特征,我们会有一系统的评估标准,当然这些评估标准也都有人为主观判断在的。
1.方差选择法(过滤法)
  • 使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:

threshold=1两个特征都被显示出来了

为什么阈值设定为1,累计销售与用户忠诚度这两个特征都被选择了出来?首先我们看下累计销售与用户忠诚度各自的方差是什么?
2.相关系数法
  • 先计算各个特征对目标值的相关系数,选择更加相关的特征。
以互联网金融行业为例

最终,python帮助我们选择的特征是:

3.递归特征消除法
  • 使用一个基模型来进行多轮训练,经过多轮训练后,保留指定的特征数。
还是延用上面那个案例

import pandasdata=pandas.read_csv('路径.csv')

#接着,我们使用RFE类,在estimator中,

#把我们的基模型设置为线性回归模型LinearRegression,

#然后在把我们要选择的特征数设置为2,

#接着就可以使用这个rfe对象,把自变量和因变量传入fit_transform方法,

#即可得到我们需要的特征值

from sklearn.feature_selection import RFE

from sklearn.linear_model import LinearRegression

feature =data[['月份','季度','广告推广费','注册并投资人数']]

rfe =RFE( estimator=LinearRegression(), n_features_to_select=2)

sFeature = rfe.fit_transform( feature, data['销售金额'])

#同理,我们要想知道这两个自变量的名字,

#使用get_support方法,即可得到对应的列名

rfe.get_support()

4.模型选择法
  • 它是一种我们把建好的模型对象传入选择器,然后它会根据这个已经建好的模型,自动帮我吗选择最好的特征值。
还是延用上面那个案例
  • 这里jacky就强调一点,模型选择法并不需要指定我们需要多少个特征,selectFromModel的方法会自动帮我们选择最优的特征数
(五)总结
  • 科学总把简单的问题转化的很复杂
  • 有时间的小伙伴可以思考一下,特征选择的第一个方法对应的就是发散性,后面三个方法对应的就是回归。我们细细琢磨,后三个方法其实是一回事,但是得到的结果却略有不同,参透这其中的道理,也就参透数据挖掘和机器学习的奥秘了。
《特征工程三部曲》之三 维度压缩

当特征选择完成之后,就可以直接训练模型了,但是可能由于特征矩阵过大导致计算量大,训练时间长的问题;因此,降低特征矩阵维度,也是必不可少的,主成分分析就是最常用的降维方法,在减少数据集的维度的同时,保持对方差贡献最大的特征,在sklearn中,我们使用PCA类进行主成分分析。

  • 主成分分析(Principal Components Analysis)
  • PCA API
    • 有一个参数用于设置主成分的个数:pca_3=PCA(n_components=3),设置好参数后,就可以生成PCA的对象了
    • 接着我们可以调用fit_transform方法对高维数据进行压缩:data_pca_3=pca3.fit_transform(data)
我们人类只能看到三维数据,那么怎样把四维数据压缩到三维数据呢?

生成的效果图如下:

End ... ...

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多