特征工程指的是把原始数据转变为模型的训练数据的过程, 它的目的就是获取更好的训练数据特征, 使得机器学习模型逼近这个上限.
简单来说就是算法的前期处理阶段, 经过特征工程处理后的数据是无法直接通过肉眼辨别处理的好换, 只有通过算法的结果反推特征工程处理的好坏, 如果模型任何效果不好, 任何一个模型的效果都不好, 八成是特征工程不好, 需要重新做特征工程.
需要什幺样的数据
一般公司内部做机器学习的数据源:
用户行为日志数据: 记录的用户在系统上所有操作所留下来的日志行为数据
业务数据: 商品 / 物品的信息, 用户 / 会员的信息......
第三方数据: 爬虫数据, 购买的数据, 合作方的数据......
数据如何存储
一般情况下, 用于后期模型创建的数据都是存在在本地磁盘, 关系型数据库或者一些相关的分布式数据存储平台的.
本地磁盘 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] 表示.
来源: http://www.tuicool.com/articles/EnIjqeq