内容简介:特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。简单来说就是算法的前期处理阶段,经过特征工程处理后的数据是无法直接通过肉眼辨别处理的好换,只有通过算法的结果反推特征工程处理的好坏,如果模型任何效果不好,任何一个模型的效果都不好,八成是特征工程不好,需要重新做特征工程。
特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。
简单来说就是算法的前期处理阶段,经过特征工程处理后的数据是无法直接通过肉眼辨别处理的好换,只有通过算法的结果反推特征工程处理的好坏,如果模型任何效果不好,任何一个模型的效果都不好,八成是特征工程不好,需要重新做特征工程。
需要什幺样的数据
一般公司内部做机器学习的数据源:
用户行为日志数据:记录的用户在系统上所有操作所留下来的日志行为数据
业务数据:商品/物品的信息、用户/会员的信息……
第三方数据:爬虫数据、购买的数据、合作方的数据……
数据如何存储
一般情况下,用于后期模型创建的数据都是存在在本地磁盘、关系型数据库或者一些相关的分布式数据存储平台的。
本地磁盘 MySQL 、Oracle、Hbase、HDFS、Hive。
数据清洗
数据清洗(datacleaning)是在机器学习过程中一个不可缺少的环节,其数据的清洗结果直接关系到模型效果以及最终的结论。
数据清洗的步骤:
预处理
在数据预处理过程主要考虑两个方面,如下:
选择数据处理工具:关系型数据库或者 Python 查看数据的元数据以及数据特征:一是查看元数据,包括字段解释、数据来源等一切可以描述数据的信息;
另外是抽取一部分数据,通过人工查看的方式,对数据本身做一个比较直观的了解,并且初步发现一些问题,为之后的数据处理做准备。
数据清洗–格式内容错误数据清洗
一般情况下,数据是由用户/访客产生的,也就有很大的可能性存在格式和内容上不一致的情况,所以在进行模型构建之前需要先进行数据的格式内容清洗操作。格式内容问题主要有以下几类:
-
-
时间、日期、数值、半全角等显示格式不一致:直接将数据转换为一类格式即可,该问题一般出现在多个数据源整合的情况下。
-
-
内容中有不该存在的字符:最典型的就是在头部、中间、尾部的空格等问题,这种情况下,需要以半自动校验加半人工方式来找出问题,并去除不需要的字符。
-
-
内容与该字段应有的内容不符:比如姓名写成了性别、身份证号写成手机号等问题。
数据清洗–逻辑错误清洗
主要是通过简单的逻辑推理发现数据中的问题数据,防止分析结果走偏,主要包 含以下几个步骤:
-
-
数据去重,去除/替换不合理的值
-
-
去除/重构不可靠的字段值(修改矛盾的内容)
数据清洗–去除不需要的数据
一般情况下,我们会尽可能多的收集数据,但是不是所有的字段数据都是可以应 用到模型构建过程的,也不是说将所有的字段属性都放到构建模型中,最终模型 的效果就一定会好,实际上来讲,字段属性越多,模型的构建就会越慢,所以有 时候可以考虑将不要的字段进行删除操作。在进行该过程的时候,要注意备份原 始数据。
数据清洗–关联性验证
如果数据有多个来源,那幺有必要进行关联性验证,该过程常应用到多数据源合 并的过程中,通过验证数据之间的关联性来选择比较正确的特征属性,比如:汽 车的线下购买信息和电话客服问卷信息,两者之间可以通过姓名和手机号进行关 联操作,匹配两者之间的车辆信息是否是同一辆,如果不是,那幺就需要进行数 据调整。
数据不平衡
在实际应用中,数据往往分布得非常不均匀,也就是会出现“长尾现象”,即绝 大多数的数据在一个范围/属于一个类别,而在另外一个范围或者另外一个类别 中,只有很少的一部分数据。那幺这个时候直接使用机器学习可能效果会不太少, 所以这个时候需要我们进行一系列的转换操作。
-
-
设置损失函数的权重,使得少数类别数据判断错误的损失大于多数类别数据判断 错误的损失,即当我们的少数类别数据预测错误的时候,会产生一个比较大的损 失值,从而导致模型参数往让少数类别数据预测准确的方向偏。可以通过scikit- learn中的class_weight参数来设置权重。
-
-
下采样/欠采样(under sampling):从多数类中随机抽取样本从而减少多数类别 样本数据,使数据达到平衡的方式。
-
-
集成下采样/欠采样:采用普通的下采样方式会导致信息丢失,所以一般采用集 成学习和下采样结合的方式来解决这个问题;主要有两种方式:
EasyEnsemble:
采用不放回的数据抽取方式抽取多数类别样本数据,然后将抽取出来的数据和少数类别 数据组合训练一个模型;多次进行这样的操作,从而构建多个模型,然后使用多个模型 共同决策/预测。
BalanceCascade:
利用Boosting这种增量思想来训练模型;先通过下采样产生训练集,然后使用 Adaboost算法训练一个分类器;然后使用该分类器多对所有的大众样本数据进行预测, 并将预测正确的样本从大众样本数据中删除;重复迭代上述两个操作,直到大众样本数 据量等于小众样本数据量。
-
-
Edited Nearest Neighbor(ENN):对于多数类别样本数据而言,如果这个样本 的大部分k近邻样本都和自身类别不一样,那我们就将其删除,然后使用删除后 的数据训练模型。
-
-
Repeated Edited Nearest Neighbor(RENN):对于多数类别样本数据而言, 如果这个样本的大部分k近邻样本都和自身类别不一样,那我们就将其删除;重 复性的进行上述的删除操作,直到数据集无法再被删除后,使用此时的数据集据 训练模型
-
-
Tomek Link Removal:如果两个不同类别的样本,它们的最近邻都是对方,也 就是A的最近邻是B,B的最近邻也是A,那幺A、B就是Tomek Link。将所有 Tomek Link中多数类别的样本删除。然后使用删除后的样本来训练模型
-
-
过采样/上采样(Over Sampling):和欠采样采用同样的原理,通过抽样来增加 少数样本的数目,从而达到数据平衡的目的。一种简单的方式就是通过有放回抽 样,不断的从少数类别样本数据中抽取样本,然后使用抽取样本+原始数据组成 训练数据集来训练模型;不过该方式比较容易导致过拟合,一般抽样样本不要超过50%。
过采样/上采样(Over Sampling):因为在上采样过程中,是进行是随机有放回 的抽样,所以最终模型中,数据其实是相当于存在一定的重复数据,为了防止这 个重复数据导致的问题,我们可以加入一定的随机性,也就是说:在抽取数据后, 对数据的各个维度可以进行随机的小范围变动,eg: (1,2,3) –> (1.01, 1.99, 3); 通过该方式可以相对比较容易的降低上采样导致的过拟合问题。
特征转化
特征转换主要指将原始数据中的字段数据进行转换操作,从而得到适合进行算法型构建的输入数据(数值型数据),在这个过程中主要包括但不限于以下几种数据的处理:
-
-
文本数据转换为数值型数据
-
-
缺省值填充
-
-
定性特征属性哑编码
-
-
定量特征属性二值化
-
-
特征标准化与归一化
1. 文本数据转换为数值型数据
第一步:分词
定义:通过某种技术将连续的文本分隔成更具有语言语义学上意义的词。这个过 程就叫做分词
方法:
按照文本/单词特征进行划分:对于英文文档,可以基于空格进行单词划分。
词典匹配:匹配方式可以从左到右,从右到左。对于匹配中遇到的多种分段可能性, 通常会选取分隔出来词的数目最小的。
基于统计的方法:隐马尔可夫模型(HMM)、最大熵模型(ME),估计相邻汉字 之间的关联性,进而实现切分
基于深度学习:神经网络抽取特征、联合建模
Jieba分词:
定义:中文分词模块
原理:
-
-
字符串匹配:把汉字串与词典中的词条进行匹配,识别出一个词
-
-
理解分词法:通过分词子系统、句法语义子系统、总控部分来模拟人对句子的理解。
-
-
统计分词法:建立大规模语料库,通过隐马尔可夫模型或其他模型训练,进行分词
第二步:转换
常用方法:词袋法(BOW/TF)、TF-IDF、HashTF、Word2Vec
词袋法(Bag of words, BOW)是最早应用于NLP和IR领域的一种文本处理模型, 该模型忽略文本的语法和语序,用一组无序的单词(words)来表达一段文字或者 一个文档,词袋法中使用单词在文档中出现的次数(频数)来表示文档
词集法(Set of words, SOW)是词袋法的一种变种,应用的比较多,和词袋法的 原理一样,是以文档中的单词来表示文档的一种的模型,区别在于:词袋法使用 的是单词的频数,而在词集法中使用的是单词是否出现,如果出现赋值为1,否 则为0。
TF-IDF:在词袋法或者词集法中,使用的是单词的词频或者是否存在来进行表示文档特征, 但是不同的单词在不同文档中出现的次数不同,而且有些单词仅仅在某一些文档 中出现(eg:专业名称等等),也就是说不同单词对于文本而言具有不同的重要性, 那幺,如何评估一个单词对于一个文本的重要性呢?
单词的重要性随着它在文本中出现的次数成正比增加,也就是单词的出现次数越多, 该单词对于文本的重要性就越高。 同时单词的重要性会随着在语料库中出现的频率成反比下降,也就是单词在语料库
中出现的频率越高,表示该单词越常见,也就是该单词对于文本的重要性越低。
2. 缺省值填充
主要步骤:
确定缺省值范围
去除不需要的字段
填充缺省值内容、
重新获取数据
重点是填充缺省值内容的填充。
在进行确定缺省值范围的时候,对每个字段都计算其缺失比例,然后按照缺失比例和字段重要性分别指定不同的策略。
在进行去除不需要的字段的时候,需要注意的是:删除操作最好不要直接操作与 原始数据上,最好的是抽取部分数据进行删除字段后的模型构建,查看模型效果, 如果效果不错,那幺再到全量数据上进行删除字段操作。总而言之:该过程简单 但是必须慎用,不过一般效果不错,删除一些丢失率高以及重要性低的数据可以 降低模型的训练复杂度,同时又不会降低模型的效果。
填充缺省值内容是一个比较重要的过程,也是我们常用的一种缺省值解决方案, 一般采用下面几种方式进行数据的填充:
-
-
以业务知识或经验推测填充缺省值 以同一字段指标的计算结果(均值、中位数、众数等)填充缺省值
-
-
以不同字段指标的计算结果来推测性的填充缺省值,比如通过身份证号码计算年龄、 通过收货地址来推测家庭住址、通过访问的IP地址来推测家庭/公司/学校的家庭住址 等等
如果某些指标非常重要,但是缺失率有比较高,而且通过其它字段没法比较精准 的计算出指标值的情况下,那幺就需要和数据产生方(业务人员、数据收集人员 等)沟通协商,是否可以通过其它的渠道获取相关的数据,也就是进行重新获取 数据的操作。
4. 哑编码
哑编码(OneHotEncoder):对于定性的数据(也就是分类的数据),可以采用N位 的状态寄存器来对N个状态进行编码,每个状态都有一个独立的寄存器位,并且 在任意状态下只有一位有效;是一种常用的将特征数字化的方式。
比如有一个特征属性:[‘male’,’female’],那幺male使用向量[1,0]表示,female使用[0,1]表示。
以上所述就是小编给大家介绍的《机器学习 | 特征工程》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective Ruby:改善Ruby程序的48条建议
Peter J. Jones / 杨政权、秦五一、孟樊超 / 机械工业出版社 / 2016-1 / 49
如果你是经验丰富的Rub程序员,本书能帮助你发挥Ruby的全部力量来编写更稳健、高效、可维护和易执行的代码。Peter J.Jones凭借其近十年的Ruby开发经验,总结出48条Ruby的最佳实践、专家建议和捷径,并辅以可执行的代码实例。 Jones在Ruby开发的每个主要领域都给出了实用的建议,从模块、内存到元编程。他对鲜为人知的Ruby方言、怪癖、误区和强力影响代码行为与性能的复杂性的揭......一起来看看 《Effective Ruby:改善Ruby程序的48条建议》 这本书的介绍吧!
SHA 加密
SHA 加密工具
HEX CMYK 转换工具
HEX CMYK 互转工具