37

机器学习 | 特征工程

 4 years ago
source link: https://www.tuicool.com/articles/EnIjqeq
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

22M7Nfn.jpg!web

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

需要什幺样的数据

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

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

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

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

数据如何存储

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

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

数据清洗

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

数据清洗的步骤:

mQ3uyuZ.jpg!web

预处理

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

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

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

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

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

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

数据清洗–逻辑错误清洗

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

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

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

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

数据清洗–关联性验证

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

数据不平衡

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

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

EasyEnsemble:

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

BalanceCascade:

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

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

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

特征转化

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

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

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

第一步:分词

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

方法:

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

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

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

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

Jieba分词:

定义:中文分词模块

原理:

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

第二步:转换

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

词袋法(Bag of words, BOW)是最早应用于NLP和IR领域的一种文本处理模型, 该模型忽略文本的语法和语序,用一组无序的单词(words)来表达一段文字或者  一个文档,词袋法中使用单词在文档中出现的次数(频数)来表示文档

词集法(Set of words, SOW)是词袋法的一种变种,应用的比较多,和词袋法的 原理一样,是以文档中的单词来表示文档的一种的模型,区别在于:词袋法使用  的是单词的频数,而在词集法中使用的是单词是否出现,如果出现赋值为1,否  则为0。

TF-IDF:在词袋法或者词集法中,使用的是单词的词频或者是否存在来进行表示文档特征, 但是不同的单词在不同文档中出现的次数不同,而且有些单词仅仅在某一些文档  中出现(eg:专业名称等等),也就是说不同单词对于文本而言具有不同的重要性,  那幺,如何评估一个单词对于一个文本的重要性呢?

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

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

2. 缺省值填充

主要步骤:

确定缺省值范围

去除不需要的字段

填充缺省值内容、

重新获取数据

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

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

aeiAFnq.jpg!web

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

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

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

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

4. 哑编码

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK