机器学习 | 特征工程

不懂技术怎么做产品?15天在线学习,补齐产品经理必备技术知识,再也不被开发忽悠。了解一下>

特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。

简单来说就是算法的前期处理阶段,经过特征工程处理后的数据是无法直接通过肉眼辨别处理的好换,只有通过算法的结果反推特征工程处理的好坏,如果模型任何效果不好,任何一个模型的效果都不好,八成是特征工程不好,需要重新做特征工程。

需要什么样的数据

一般公司内部做机器学习的数据源:

用户行为日志数据:记录的用户在系统上所有操作所留下来的日志行为数据

业务数据:商品/物品的信息、用户/会员的信息……

第三方数据:爬虫数据、购买的数据、合作方的数据……

数据如何存储

一般情况下,用于后期模型创建的数据都是存在在本地磁盘、关系型数据库或者一些相关的分布式数据存储平台的。

本地磁盘MySQL、Oracle、Hbase、HDFS、Hive。

数据清洗

数据清洗(datacleaning)是在机器学习过程中一个不可缺少的环节,其数据的清洗结果直接关系到模型效果以及最终的结论。

数据清洗的步骤:

预处理

在数据预处理过程主要考虑两个方面,如下:

选择数据处理工具:关系型数据库或者Python查看数据的元数据以及数据特征:一是查看元数据,包括字段解释、数据来源等一切可以描述数据的信息;

另外是抽取一部分数据,通过人工查看的方式,对数据本身做一个比较直观的了解,并且初步发现一些问题,为之后的数据处理做准备。

数据清洗–格式内容错误数据清洗

一般情况下,数据是由用户/访客产生的,也就有很大的可能性存在格式和内容上不一致的情况,所以在进行模型构建之前需要先进行数据的格式内容清洗操作。格式内容问题主要有以下几类:

  1. 时间、日期、数值、半全角等显示格式不一致:直接将数据转换为一类格式即可,该问题一般出现在多个数据源整合的情况下。
  2. 内容中有不该存在的字符:最典型的就是在头部、中间、尾部的空格等问题,这种情况下,需要以半自动校验加半人工方式来找出问题,并去除不需要的字符。
  3. 内容与该字段应有的内容不符:比如姓名写成了性别、身份证号写成手机号等问题。

数据清洗–逻辑错误清洗

主要是通过简单的逻辑推理发现数据中的问题数据,防止分析结果走偏,主要包  含以下几个步骤:

  1. 数据去重,去除/替换不合理的值
  2. 去除/重构不可靠的字段值(修改矛盾的内容)

数据清洗–去除不需要的数据

一般情况下,我们会尽可能多的收集数据,但是不是所有的字段数据都是可以应  用到模型构建过程的,也不是说将所有的字段属性都放到构建模型中,最终模型  的效果就一定会好,实际上来讲,字段属性越多,模型的构建就会越慢,所以有  时候可以考虑将不要的字段进行删除操作。在进行该过程的时候,要注意备份原  始数据。

数据清洗–关联性验证

如果数据有多个来源,那么有必要进行关联性验证,该过程常应用到多数据源合  并的过程中,通过验证数据之间的关联性来选择比较正确的特征属性,比如:汽  车的线下购买信息和电话客服问卷信息,两者之间可以通过姓名和手机号进行关  联操作,匹配两者之间的车辆信息是否是同一辆,如果不是,那么就需要进行数  据调整。

数据不平衡

在实际应用中,数据往往分布得非常不均匀,也就是会出现“长尾现象”,即绝  大多数的数据在一个范围/属于一个类别,而在另外一个范围或者另外一个类别  中,只有很少的一部分数据。那么这个时候直接使用机器学习可能效果会不太少,  所以这个时候需要我们进行一系列的转换操作。

  1. 设置损失函数的权重,使得少数类别数据判断错误的损失大于多数类别数据判断 错误的损失,即当我们的少数类别数据预测错误的时候,会产生一个比较大的损  失值,从而导致模型参数往让少数类别数据预测准确的方向偏。可以通过scikit-  learn中的class_weight参数来设置权重。
  2. 下采样/欠采样(under sampling):从多数类中随机抽取样本从而减少多数类别 样本数据,使数据达到平衡的方式。
  3. 集成下采样/欠采样:采用普通的下采样方式会导致信息丢失,所以一般采用集 成学习和下采样结合的方式来解决这个问题;主要有两种方式:

EasyEnsemble:

采用不放回的数据抽取方式抽取多数类别样本数据,然后将抽取出来的数据和少数类别  数据组合训练一个模型;多次进行这样的操作,从而构建多个模型,然后使用多个模型  共同决策/预测。

BalanceCascade:

利用Boosting这种增量思想来训练模型;先通过下采样产生训练集,然后使用  Adaboost算法训练一个分类器;然后使用该分类器多对所有的大众样本数据进行预测,  并将预测正确的样本从大众样本数据中删除;重复迭代上述两个操作,直到大众样本数  据量等于小众样本数据量。

  1. Edited Nearest Neighbor(ENN):对于多数类别样本数据而言,如果这个样本 的大部分k近邻样本都和自身类别不一样,那我们就将其删除,然后使用删除后  的数据训练模型。
  2. Repeated Edited Nearest Neighbor(RENN):对于多数类别样本数据而言, 如果这个样本的大部分k近邻样本都和自身类别不一样,那我们就将其删除;重  复性的进行上述的删除操作,直到数据集无法再被删除后,使用此时的数据集据  训练模型
  3. Tomek Link Removal:如果两个不同类别的样本,它们的最近邻都是对方,也 就是A的最近邻是B,B的最近邻也是A,那么A、B就是Tomek Link。将所有  Tomek Link中多数类别的样本删除。然后使用删除后的样本来训练模型
  4. 过采样/上采样(Over Sampling):和欠采样采用同样的原理,通过抽样来增加 少数样本的数目,从而达到数据平衡的目的。一种简单的方式就是通过有放回抽  样,不断的从少数类别样本数据中抽取样本,然后使用抽取样本+原始数据组成  训练数据集来训练模型;不过该方式比较容易导致过拟合,一般抽样样本不要超过50%。

过采样/上采样(Over Sampling):因为在上采样过程中,是进行是随机有放回  的抽样,所以最终模型中,数据其实是相当于存在一定的重复数据,为了防止这  个重复数据导致的问题,我们可以加入一定的随机性,也就是说:在抽取数据后,  对数据的各个维度可以进行随机的小范围变动,eg: (1,2,3) –> (1.01, 1.99, 3);  通过该方式可以相对比较容易的降低上采样导致的过拟合问题。

特征转化

特征转换主要指将原始数据中的字段数据进行转换操作,从而得到适合进行算法型构建的输入数据(数值型数据),在这个过程中主要包括但不限于以下几种数据的处理:

  1. 文本数据转换为数值型数据
  2. 缺省值填充
  3. 定性特征属性哑编码
  4. 定量特征属性二值化
  5. 特征标准化与归一化

1.  文本数据转换为数值型数据

第一步:分词

定义:通过某种技术将连续的文本分隔成更具有语言语义学上意义的词。这个过  程就叫做分词

方法:

按照文本/单词特征进行划分:对于英文文档,可以基于空格进行单词划分。

词典匹配:匹配方式可以从左到右,从右到左。对于匹配中遇到的多种分段可能性,  通常会选取分隔出来词的数目最小的。

基于统计的方法:隐马尔可夫模型(HMM)、最大熵模型(ME),估计相邻汉字  之间的关联性,进而实现切分

基于深度学习:神经网络抽取特征、联合建模

Jieba分词:

定义:中文分词模块

原理:

  1. 字符串匹配:把汉字串与词典中的词条进行匹配,识别出一个词
  2. 理解分词法:通过分词子系统、句法语义子系统、总控部分来模拟人对句子的理解。
  3. 统计分词法:建立大规模语料库,通过隐马尔可夫模型或其他模型训练,进行分词

第二步:转换

常用方法:词袋法(BOW/TF)、TF-IDF、HashTF、Word2Vec

  • 词袋法(Bag of words, BOW)是最早应用于NLP和IR领域的一种文本处理模型, 该模型忽略文本的语法和语序,用一组无序的单词(words)来表达一段文字或者  一个文档,词袋法中使用单词在文档中出现的次数(频数)来表示文档
  • 词集法(Set of words, SOW)是词袋法的一种变种,应用的比较多,和词袋法的 原理一样,是以文档中的单词来表示文档的一种的模型,区别在于:词袋法使用  的是单词的频数,而在词集法中使用的是单词是否出现,如果出现赋值为1,否  则为0。
  • TF-IDF:在词袋法或者词集法中,使用的是单词的词频或者是否存在来进行表示文档特征, 但是不同的单词在不同文档中出现的次数不同,而且有些单词仅仅在某一些文档  中出现(eg:专业名称等等),也就是说不同单词对于文本而言具有不同的重要性,  那么,如何评估一个单词对于一个文本的重要性呢?

单词的重要性随着它在文本中出现的次数成正比增加,也就是单词的出现次数越多,  该单词对于文本的重要性就越高。  同时单词的重要性会随着在语料库中出现的频率成反比下降,也就是单词在语料库

中出现的频率越高,表示该单词越常见,也就是该单词对于文本的重要性越低。

2. 缺省值填充

主要步骤:

  • 确定缺省值范围
  • 去除不需要的字段
  • 填充缺省值内容、
  • 重新获取数据

重点是填充缺省值内容的填充。

在进行确定缺省值范围的时候,对每个字段都计算其缺失比例,然后按照缺失比例和字段重要性分别指定不同的策略。

在进行去除不需要的字段的时候,需要注意的是:删除操作最好不要直接操作与 原始数据上,最好的是抽取部分数据进行删除字段后的模型构建,查看模型效果,  如果效果不错,那么再到全量数据上进行删除字段操作。总而言之:该过程简单  但是必须慎用,不过一般效果不错,删除一些丢失率高以及重要性低的数据可以  降低模型的训练复杂度,同时又不会降低模型的效果。

填充缺省值内容是一个比较重要的过程,也是我们常用的一种缺省值解决方案, 一般采用下面几种方式进行数据的填充:

  1. 以业务知识或经验推测填充缺省值 以同一字段指标的计算结果(均值、中位数、众数等)填充缺省值
  2. 以不同字段指标的计算结果来推测性的填充缺省值,比如通过身份证号码计算年龄、 通过收货地址来推测家庭住址、通过访问的IP地址来推测家庭/公司/学校的家庭住址  等等

如果某些指标非常重要,但是缺失率有比较高,而且通过其它字段没法比较精准 的计算出指标值的情况下,那么就需要和数据产生方(业务人员、数据收集人员  等)沟通协商,是否可以通过其它的渠道获取相关的数据,也就是进行重新获取  数据的操作。

4. 哑编码

哑编码(OneHotEncoder):对于定性的数据(也就是分类的数据),可以采用N位  的状态寄存器来对N个状态进行编码,每个状态都有一个独立的寄存器位,并且  在任意状态下只有一位有效;是一种常用的将特征数字化的方式。

比如有一个特征属性:[‘male’,’female’],那么male使用向量[1,0]表示,female使用[0,1]表示。

 

本文由 @SincerityY 原创发布于人人都是产品经理。未经许可,禁止转载

题图来自Unsplash,基于CC0协议

给作者打赏,鼓励TA抓紧创作!
评论
欢迎留言讨论~!