特征工程
数据清洗
数据清洗 (data cleaning) 是在机器学习过程中一个不可缺少的环节,其数据的清洗结果直接关系到模型效果以及最终的结论。在实际的工作中,数据清洗通常占开发过程的50%-80%左右的时间。
过程
预处理
去除/补全有缺失数据
去除/修改格式和内容错误的数据
去除/修改逻辑错误的数据
去除不需要的数据
关联性验证
预处理
选择数据处理工具:关系型数据库或者Python
查看数据的元数据以及数据特征:一是查看元数据,包括字段解释、数据来源等一切可以描述数据的信息;另外是抽取一部分数据,通过人工查看的方式,对数据本身做一个比较直观的了解,并且初步发现一些问题,为之后的数据处理做准备。
缺省值清洗
缺省值缺省范围
去除不需要的字段
填充缺省值内容(重要)
重新获取数据
缺失比例
在进行确定缺省值范围的时候,对每个字段都计算其缺失比例,然后按照缺失比例和字段重要性分别指定不同的策略。有些比较重要的字段不能直接去除,但可以考虑通过爬虫或者各种手段重新收集。某些缺失率高但是重要性低的就直接去除该字段。
删除字段
在进行去除不需要的字段的时候,需要注意的是:删除操作最好不要直接操作与原始数据上,最好的是抽取部分数据进行删除字段后的模型构建,查看模型效果,如果效果不错,那么再到全量数据上进行删除字段操作。
总而言之:该过程简单但是必须慎用,不过一般效果不错,删除一些丢失率高以及重要性低的数据可以降低模型的训练复杂度,同时又不会降低模型的效果。
填充缺省值内容
填充缺省值内容是一个比较重要的过程,也是我们常用的一种缺省值解决方案,一般采用下面几种方式进行数据的填充:
以业务知识或经验推测填充缺省值
以同一字段指标的计算结果(均值、中位数、众数等)填充缺省值
以不同字段指标的计算结果来推测性的填充缺省值,比如通过身份证号码计算年龄、通过收货地址来推测家庭住址、通过访问的IP地址来推测家庭/公司/ 学校的家庭住址等等
格式内容清洗
时间、日期、数值、半全角等显示格式不一致:直接将数据转换为一类格式即可,该问题一般出现在多个数据源整合的情况下。
内容中有不该存在的字符:最典型的就是在头部、中间、尾部的空格等问题,这种情况下,需要以半自动校验加半人工方式来找出问题,并去除不需要的字符。内容与该字段应有的内容不符:比如姓名写成了性别、身份证号写成手机号等问题。
去除不必要的字段
一般情况下,我们会尽可能多的收集数据,但是不是所有的字段数据都是可以应用到模型构建过程的,也不是说将所有的字段属性都放到构建模型中,最终模型的效果就一定会好,实际上来讲,字段属性越多,模型的构建就会越慢,所以有时候可以考虑将不要的字段进行删除操作。在进行该过程的时候,要注意备份原始数据。
关联性验证
如果数据有多个来源,那么有必要进行关联性验证,该过程常应用到多数据源合并的过程中,通过验证数据之间的关联性来选择比较正确的特征属性。多个来源可以是线上线下等等。
特征转换
特征转换主要指将原始数据中的字段数据进行转换操作,从而得到适合进行算法模型构建的输入数据(数值型数据),在这个过程中主要包括但不限于以下几种数据的处理:
文本数据转换为数值型数据
缺省值填充
定性特征属性哑编码
定量特征属性二值化
特征标准化与归一化
文本特征属性转换
机器学习的模型算法均要求输入的数据必须是数值型的,所以对于文本类型的特征属性,需要进行文本数据转换,也就是需要将文本数据转换为数值型数据。
词袋法(BOW/TF)
该模型忽略文本的语法和语序,用一组无序的单词(words) 来表达一段文字或者一个文档,词袋法中使用单词在文档中出现的次数(频数)来表示文档。
词集法(SOW)
词集法中使用的是单词是否出现,如果出现赋值为1,否则为0。
TF-IDF(常用)
TF的意思是词频(Item Frequency),IDF的意思是逆向文件频率(Inverse DocumentFrequency)。
TF-IDF可以反映语料中单词对文档/文本的重要程度。
假设单词用t表示,文档用d表示,语料库用D表示,那么N(t,D)表示包含单词t的文档数量,|D|表示文档数量,|d|表示文档d中的所有单词数量。N(t,d)表示在文档d中单词t出现的次数。
缺省值填充
对于缺省的数据,在处理之前一定需要进行预处理操作,一般采用中位数、均值或者众数来进行填充。
在scikit中主要通过Imputer类来实现对缺省值的填充。
哑编码
对于定性的数据(也就是分类的数据),可以采用N位的状态寄存器来对N个状态进行编码,每个状态都有一个独立的寄存器位,并且在任意状态下只有一位有效;是一种常用的将特征数字化的方式。比如有一个特征属性:['male','female'],那么male使用向量[1,0]表示,female使用[0,1]表示。
二值化
对于定量的数据根据给定的阈值,将其进行转换,如果大于阈值,那么赋值为1;否则赋值为0
标准化
基于特征属性的数据(也就是特征矩阵的列),获取均值和方差,然后将特征值转换至服从标准正态分布。
区间缩放
是指按照数据的方差特性对数据进行缩放操作,将数据缩放到给定区间上。其实跟标准化差不多,因为标准化也是把数据集中在一起。
归一化
和标准化不同,归一化是基于矩阵的行进行数据处理,其目的是将矩阵的行均转换为“单位向量”。
数据多项式扩展
多项式数据变换主要是指基于输入的特征数据按照既定的多项式规则构建更多的输出特征属性。
比如输入特征属性为[a,b],当设置degree为2的时候,那么输出的多项式特征为[1, a, b, a^2, ab, b^2]。
特征选择
当做完特征转换后,实际上可能会存在很多的特征属性,比如:多项式扩展转换、文本数据转换等等,但是太多的特征属性的存在可能会导致模型构建效率降低,同时模型的效果有可能会变的不好,那么这个时候就需要从这些特征属性中选择出影响最大的特征属性作为最后构建模型的特征属性列表。
我们会考虑:
特征是否是发散的,这点通过方差决定。
特征与目标的相关性:如果目标相关性较高,应当优先选择。
主要方法:
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,从而选择特征;常用方法包括方差选择法、相关系数法、卡方检验、互信息法等。
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征或者排除若干特征;常用方法主要是递归特征消除法。
Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权重系数,根据系数从大到小选择特征;常用方法主要是基于惩罚项的特征选择法。
方差选择法
先计算各个特征属性的方差值,然后根据阈值,获取方差大于阈值的特征。
相关系数法
先计算各个特征属性对于目标值的相关系数以及相关系数的P值,然后获取大于阈值的特征属性。
卡方检验
检查定性自变量对定性因变量的相关性。(使用较多)
递归特征消除法
使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
惩罚项
在使用惩罚项的基模型,除了可以筛选出特征外,同时还可以进行降维操作。
特征降维
当特征选择完成后,可以直接可以进行训练模型了,但是可能由于特征矩阵过大,导致计算量比较大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了基于L1的惩罚模型外,还有主成分析法(PCA)和线性判别分析法(LDA),这两种方法的本质都是将原始数据映射到维度更低的样本空间中;但是采用的方式不同,PCA是为了让映射后的样本具有更大的发散性,LDA是为了让映射后的样本有最好的分类性能。
也就是PCA做完后,数据比较集中密集;LDA做完后分类能力较强。
PCA
主成分析:将高纬的特征向量合并称为低纬度的特征属性,是一种无监督的降维方法。
LDA
线性判断分析:LDA是一种基于分类模型进行特征属性合并的操作,是一种有监督的降维方法。