机器学习项目的完整流程
文章目录
- 机器学习项目的完整流程
- 1 模型抽象
- 2 数据处理
- 2.1 数据采集
- 2.2 数据格式化
- 2.2.1 确定存储格式
- 2.2.2 数据文件关联
- 2.3 数据清洗
- 2.3.1 主要做的工作:去掉脏数据
- 2.3.2 示例、思考角度
- 2.4 数据采样
- 2.4.1 随机采样
- 2.4.2 分层抽样
- 2.4.3 正负样本不平衡的处理办法
- 2.4.3.1 情景
- 2.4.3.2 处理办法
- 3 特征提取和特征选择
- 3.1 特征工程的意义
- 3.2 特征处理
- 3.2.1 数值型特征
- 3.2.2 类别型特征
- 3.2.3 时间类特征
- 3.2.4 文本型特征
- 3.2.5 统计特征
- 3.2.6 组合特征
- 3.3 特征选择
- 3.3.1 filter过滤型
- 3.3.2 wrapper包裹型
- 3.3.3 embedded嵌入型
- 总结
- 4 训练模型与调优
- 4.1 模型选择
- 4.2 模型训练
- 5 模型诊断
- 5.1 模型状态判断
- 5.2 特征重要性分析
- 5.3 bad-case分析
- 6 模型融合
- 7 上线运行
- 后记
1 模型抽象
对于实际生活中的复杂事物来说,如果要使用机器学习方法来解决,对实际问题进行建模,将其抽象为数学问题是首要的工作。下面举几个简单例子
预测本地明天的天气
首先你需要利用生活常识和收集资料得到的专业知识,知道可能会对天气有影响的因素;然后去收集数据,明确自己的目的。是想使用过去的天气情况来预测明天的气温范围呢,还是单纯的想知道明天会不会下雨,会不会有雾霾。根据你的目标不同,前者是回归问题,而后者是分类问题。
决定要不要购买一件商品
首先你可能会查看店铺评分,判断这是不是一家靠谱的店铺;其次可能会查看一些商品信息,如品牌、商品的成交量、价格、评论、实物图等等。这里所有你可以搜集到的信息都可以作为是否购买这件商品的参考,同样的这是一个分类问题。
简而言之,在这个阶段我们应该充分发掘复杂场景的内容,充分明确我们的目标。
2 数据处理
2.1 数据采集
- 选择对最后结果预测有帮助的信息:需要思考哪些数据有用
- 需要消除掉线下可以使用但是线上实时采集不到的信息,如地理位置
- 考虑一些基于统计的需要耗时计算的信息
- 例子:商品推荐,需要采集店家、商品、用户(埋点)信息
2.2 数据格式化
2.2.1 确定存储格式
- 时间使用年月日or时间戳or第几天or…
- 单个行为动作or一天行为聚合
- 其他
2.2.2 数据文件关联
- 大多数情况下,需要关联非常多的
hive
表和集群(如HDFS
)文件
2.3 数据清洗
2.3.1 主要做的工作:去掉脏数据
数据和特征决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。
2.3.2 示例、思考角度
- 违背常识的数据
- 组合或统计属性判定:多个特征之间相互矛盾的数据
- 补齐可对应的缺省值:丢掉不可信的数据,缺省值极多的字段考虑不使用
2.4 数据采样
大多数模型对于样本分布(如二分类任务中的正负样本分布)比较敏感,如LR、NN比较敏感,而基于树的模型不是很敏感。当我们要处理海量数据时,一般没有时间和精力在所有的数据上面进行特征提取、模型训练、寻找超参数等,需要对数据进行采样处理。对原始数据集划分为训练集和测试集的过程也是一种数据采样操作。
2.4.1 随机采样
可能会破坏掉原来数据中存在的结构(如性别比例等)
2.4.2 分层抽样
在保持数据原有结构(如性别比例等)的情况下,进行采样
2.4.3 正负样本不平衡的处理办法
这里我们认为正样本数量少,负样本数量多,差距在一个数量级以上
2.4.3.1 情景
- 广告点击率估计
- 商品购买率估计
- 是否患病估计
2.4.3.2 处理办法
- 正负样本数据量都很大的情况下:
下采样(随机采样、分层抽样) - 正负样本数据量都很小的情况下:
- 采集更多的数据
- 上采样,数据增强,如对于图像的镜像和旋转
- 修改损失函数,使不同类别占有的权重不同,引申为代价敏感学习
- 改变正负样本权重
-
lightGBM
、xgboost
的模型中可以进行相关设置(balanced
,scale_pos_weight
)
3 特征提取和特征选择
3.1 特征工程的意义
特征是指从数据中抽取出来的对预测结果有用的信息
特征工程指使用专业背景知识和技巧处理数据,使得特征能够在机器学习算法中发挥更好作用地过程。更好地特征意味着模型更高的上限,意味着使用简单的模型就能达到好的效果,意味着更强的灵活度。
对于工业界来说,大部分复杂模型的算法精进都是资深的数据科学家的任务,大部分人员的工作还是跑数据、map-reduce
,hive SQL
,数据仓库搬砖,做一些业务分析、数据清洗、特征工程(找特征)的工作。
特征工程的作用也很明显,对于搜索引擎厂、广告部门、电商的商品推荐,阿里天池比赛经常出现上万维的交叉特征。
3.2 特征处理
3.2.1 数值型特征
- 二值化:根据给定的阈值threshold将特征值变为0和1
>>> from sklearn.preprocessing import Binarizer
>>> X = [[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]]
>>> transformer = Binarizer().fit(X) # fit does nothing.
>>> transformer
Binarizer(copy=True, threshold=0.0)
>>> transformer.transform(X)
array([[1., 0., 1.],
[1., 0., 0.],
[0., 1., 0.]])
- 最大最小化:Transforms features by scaling each feature to a given range,幅度调整到给定的范围内,默认范围为(0,1),变换按照下式计算,其中(min,max)是给定的range。
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
example:
>>> from sklearn.preprocessing import MinMaxScaler
>>>
>>> data = [[-1, 2],
... [-0.5, 6],
... [0, 10],
... [1, 18]]
>>> scaler = MinMaxScaler()
>>> print(scaler.fit(data))
MinMaxScaler(copy=True, feature_range=(0, 1))
>>> print(scaler.data_max_)
[ 1. 18.]
>>> print(scaler.transform(data))
[[0. 0. ]
[0.25 0.25]
[0.5 0.5 ]
[1. 1. ]]
>>> print(scaler.transform([[2, 2]]))
[[1.5 0. ]]
- 归一化:均值为0,方差为1
- 标准化:
- log、exp等变化:针对长尾分布,将其转换为类正态分布
- 统计值max、min、mean、std:如考虑日最高气温、日最低气温来决定是否开空调
- 连续数值离散化:对于如用户年龄、商品价格等离散化。等步长划分:简单、线上线下没有区别。等频划分(等分位数、等样本数),如min,25%,50%,75%,max:精准,线上应用时需要重新计算
- hash分桶:如判断新闻主题的时候,统计每句话中含有的政治、经济、体育词库中词的个数
- 每个类别下对应的变量统计值histohistogram(分布状况):如分别统计男生和女生对于所有爱好的比例,将其作为男生和女生的直方图映射,如男:
[1/3,2/3,0]
,女:[1/3,0,2/3]
- 转换为类别型
3.2.2 类别型特征
- one-hot编码:调用
sklearn.one-hot_encoder()
,对于user id
等数量很大的特征,会先根据其历史购物行为进行聚类,再按照其cluster id
进行one-hot编码 - 哑编码:与one-hot编码相同,调用
pandas.get_dummies()
- hash与聚类处理:hash技巧,对文本分桶,记录每个样本含有的每个类别的词的个数
- 直方图映射:统计每个类别变量下各个target的比例,转成数值型
3.2.3 时间类特征
- 时间类特征既可以看做连续值,也可以看做离散值
- 对于连续值来说,有持续时间,如用户浏览一家商户的时间;有间隔时间,如用户上次登录(购买、点击等行为)距现在的时间
- 对于离散值来说,有如下特征:一天中的哪个时间段、一周中的第几天、一年中的第几周、一年中的第几个月、一年中的第几个季度、工作日or周末、节假日or促销节
3.2.4 文本型特征
- 词袋(word bag):指对于文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中映射的稀疏向量
- n元词袋:将词袋中的词扩展到n-gram,分词后相邻的n个词也进入词袋
- TF-idf特征:一种用来评估一个字词对于一个文件集或一个语料库中的一份文件的重要程度的统计方法。字词的重要性与它在文件中出现的次数成正比,与它在语料库中出现的频率成反比。TF(Term freqiency),
TF(t)=词t在当前文中出现的次数/词t在全部文档中出现的次数
,IDF(t)=ln(总文档数/含t的文档数)
,TF-IDF权重=TF(t)*IDF(t)
-
word2vec
:现有的工具有Google word2vec
、gensim
3.2.5 统计特征
历届kaggle、天池比赛,天猫、京东排序和推荐业务线里模型用到的特征:
- 加减平均:如商品价格高于平均价格多少,用户在某个品类下的消费超过平均水平多少,商户评分超过平均评分多少
- 分位数:商品属于售出商品价格的多少分位线处
- 次序型:商品销量排在同品类商品的第几位
- 比例型:电商中好、中、差评的比例
3.2.6 组合特征
- 简单组合特征:拼接型,
user clustered id && category
,user clustered id && clothes style
- 模型特征组合GBDT+LR:最早Facebook使用的方式,多家互联网公司再用。gbdt训练模型,从根节点到叶子结点的每一条路径看做一个组合特征,组合特征和原有特征一起放进LR训练
3.3 特征选择
- 原因:1.冗余:部分特征的相关度太高,消耗计算性能;2.噪声:部分特征对预测结果无影响或有负影响
- 特征选择vs降维:特征选择只踢掉原本特征中和结果预测关系不大的,后者做特征的计算组合构成新特征;SVD或PCA也能解决一定的高维度问题
- 良好的数据要能够提取出良好的特征才能真正发挥效力。
3.3.1 filter过滤型
- 评估单个特征和结果值之间的相关程度,排序留下top相关的特征部分
- 可能对线性模型有用
- pearson相关系数、互信息、距离相关度
- 缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉
3.3.2 wrapper包裹型
- 把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果
- 典型的包裹型算法:递归特征删除算法,recursive feature elimination algorithm,RFE
- 举个例子:如逻辑回归,1.用全量特征跑一个模型;2.根据线性模型的系数(体现相关性),删掉5%-10%的弱特征,观察准确率的变化;3.逐步进行,直至准确率出现大的下滑停止
3.3.3 embedded嵌入型
- 根据模型来分析特征的重要性
- 最常见的方式是用正则化做特征选择
- 最早在电商用LR作CTR预估,在3-5亿维的系数特征上用L1正则化的LR模型,剩余2-3千万的feature,意味着其他的feature重要度不够
- L1正则化,截断型效应,不重要的特征权重会变为0
- L2正则化,缩放效应,特征权重只会缩小
总结
- 特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。
筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。
4 训练模型与调优
4.1 模型选择
- 广义的模型选择:sklearn algorithm cheat-sheet
- 超参数选择:交叉验证,k折交叉验证
4.2 模型训练
直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的超参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。
5 模型诊断
如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。
5.1 模型状态判断
过拟合、欠拟合判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线(如同时绘制训练数据和验证数据的损失,观察其变化情况)等。过拟合的基本调优思路是增加数据量,降低模型复杂度(如进行特征选择)。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。
5.2 特征重要性分析
5.3 bad-case分析
误差分析也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……
诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。
6 模型融合
一般来说,模型融合后都能使得效果有一定提升,而且效果很好。
工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。
7 上线运行
这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。
这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。
后记
后面会整理数据处理、特征处理的例子,加入到文章中