《美团机器学习实践》笔记

偶然在群里看到了《美团机器学习实践》这本书的pdf资源,而美团又是一直以来我最敬佩的公司之一,之前从美团技术团队那个账号学到了很多,所以拜读一下这本书,这里简要整理一下读书笔记。
全书总共分为通用流程、数据挖掘、搜索与推荐、计算广告、深度学习、算法工程这几部分,涉及范围较为广泛。

一、通用流程

1.问题建模

一个问题拿到手,需要通过机器学习的方式进行处理,首先要通过评估指标、样本选择、交叉验证等一系列方式进行问题建模,而后特征工程、模型选择、模型融合,最后应用。

1.1评估指标

评估指标分为机器学习评估指标与业务指标,分别用于线下与线上。为保证线下指标与线上指标变化趋势一致,通常需要多轮模型迭代。通常评估指标按照任务类型可分为分类、回归、聚类、排序等。

1.1.1分类

对于分类指标,精确度(precision)和召回率(recall)分别表示在二分类中真实正例占全部预测样本和全部正例的比例。通常在同一个模型中,一项的升高会导致另一项的降低,此时以recall作为横轴、precision作为纵轴作PR曲线,PR曲线越靠近右上角也就是与横轴围成面积越大表示模型越好。若是用一个指标表示这两个,则可使用 F 1 F_1 F1指标,也就是以上两项的调和平均值。除此外,也可使用准确率(accuracy),表示预测正确的样本数占全部样本数的比例,因此accuracy可用于多分类。
另外一个重要的指标为ROC曲线,其横轴为假正率(FPR)也就是估计为正例的负例占全部负例的比例,纵轴为真正率(TPR)是估计为正例的正例占全部正例的比例,ROC越接近左上角越好,在数据量较少时,ROC曲线通常不平滑,随着数据量增多而逐渐平滑。ROC曲线与横轴围成的面积称为AUC(Area Under Curve),一个重要特性就是AUC等于Wilcoxon Test of Ranks,计算方式为任意挑选一个正样本与负样本,正样本输出概率值高于负样本的概率,这也是实际算法中AUC的计算方式。AUC与排序顺序高度敏感,但对输出概率是否准确就没那么敏感。
logistic loss,也就是所有样本logistic loss或者cross entropy的平均值,用于表示二分类或多分类中,预测概率分布与真实概率分布的差异性,与AUC相对,其对排序结果不敏感,但是对预测概率值敏感。

1.1.2回归

平均绝对误差(Mean Absolute Error,MAE),也就是 L 1 L_1 L1范数,是对数据分布的中值进行拟合,但是若是损失函数有二阶导如XGBoost时则不能直接优化,可考虑次梯度。在此基础上,也可对不同样本进行加权,如考虑时间因素。在MAE基础上除以真实值,则表示偏理的百分比程度,注意此时在真实值等于0的地方无意义。
均方根误差(Root Mean Squared Error,RMSE),最为常见,表示预测值与真实值的标准差,是对数据的平均值进行拟合,对离群点比较敏感。或者将预测值与真实值取对数后再进行MSE,此时对预测值偏小的样本惩罚大于预测值偏大的(由于对数曲线的特性)。

1.1.3排序

排序常见的有平均准确率均值(Mean Acerage Precision,MAP)和归一化贴现累计收益(Normalized Discounted Cumulative Gain,NDCG),这部分在另一篇关于Learn To Rank的文章中详加描述。

1.2样本选择

样本选择的目的在于从完整训练集中找出一个子集,使得训练出的模型效果近似不变差。

1.2.1数据去噪

数据中不可避免地存在噪声,训练集中适当引入噪声也可以增强模型的健壮性。数据去噪指的是去除标注带噪声的样本,但是对于特征带有噪声的样本通常不去除,而是将缺失噪声也作为一个特征,表达一定的信息。

1.2.2采样

在类别不平衡的训练集中,通过采样可以实现平衡样本比例。一个好的样本子集应具有无偏性,即样本期望等于全体样本期望。采样方法常见的有有放回的、无放回的、分层采样等,其中分层采样常用于不平衡分类问题,按照不同类别样本占总样本比例进行采样。

1.3交叉验证

为防止全部样本用来训练造成的过拟合现象,通常采用交叉验证。其中留出法(Hold-Out)指的是按照一定比例将全部数据集划分为互斥的两部分,如2:1,实际上并没有进行“交叉”,但是有些应用场景如和时间序列有关,通常需要将时间靠前的样本划分为训练集,靠后的划分为测试集。
K折交叉验证(K-fold Cross Validation)是最常见的交叉验证方式,即将完整数据集划分为K份互斥数据集,常用5和10,然后每次选一份作为测试集,其他用于训练,将K次测试结果取平均。
自助法(Bootsrapping)是以有放回的方式进行采样,从m个样本中采出m个,计算概率为0.368的样本会被采到,可用于解决数据集较小的情况,但是采集的数据分布与原分布不同,因此在数据充分时通常不使用。

2.特征工程

众所周知,为了达到较好的效果,通常有复杂的模型+简单的特征和简单的模型+复杂的特征两种方式,而在实际应用中,更重视数据清洗和特征构建。

2.1特征提取

特征的提取通常需要对业务的深刻理解,比如在酒店搜索排序中,浏览次数等计数特征、点击率等比率特征、价格均值等统计特征都是可以构建抽取的特征。
对于数值型特征,主要考虑其分布与大小。线性模型如LR等,或者DNN,对输入特征的大小敏感,而树类型的如GBDT则对特征大小不敏感,不需要归一化。常见处理方式为各种离散化,比如对于长尾数据,先进性对数变换后选取一定阈值进行截断,或者根据特征数值大小进行离散区间划分,或者根据累计概率值进行离散区间划分。也可以对数值特征进行缩放,比如z-score或者用 L 1 L_1 L1范数进行归一化。对于缺失值,可采用均值填补,或者直接讲缺失作为一类特征,现在一些模型如XGBoost可以处理缺失值,在训练时直接忽略缺失值,预测时则直接分入右子树。贝叶斯模型、树模型、大数据量下用DNN对缺失数据均不敏感,但与距离相关的模型如SVM和KNN则对缺失值十分敏感。另外,对于新特征的构建,可采用特征交叉,或者高斯核等非线性编码,或者输入GBDT等树模型后将输出叶节点值作为新特征交给LR。
对于类别特征,常见的是进行One-Hot编码。另外,也可进行计数编码、计数排名编码等。
时间特征在推荐排序实际应用中是一个非常重要的特征,通常采用前面时刻的特征对接下来的进行预测,或者采用滑动窗口统计特征。在YouTube的文章中,采用了将用户以往观看记录的特征进行均值处理输入,而阿里的DIN模型,则是根据特征之间的相似程度进行加权,权重通过数据进行训练。如何挖掘时间序列特征,对提高推荐效果有着重要的意义。空间特征则可以进行计算距离、聚类后编码等方式进行处理。
对于文本特征,包含多个词语,常见的有N-Gram、Skip-Gram或者近年来的word2vec模型,这又涉及到NLP中的一个重要方面,这里不展开讲述。

2.2特征选择

本身存在的特征加上交叉组合和构建的特征,往往会产生冗余、过拟合、计算复杂等问题,因此需要对特征集进行一定提取筛选。首先可以比较特征变量和目标变量之间的相关性,如覆盖率,即特征在训练集中出现的比例,或者皮尔逊相关系数,这个可以很好的度量两个变量之间的线性相关度,表达了消除了便准差影响的余弦相似度,又或者进行卡方检验。另外,皮尔逊相关度也可以检测不同特征之间的相关程度。应用树模型,本身非叶节点对特征的选取也会确定特征的重要性排序,因此可以通过GBDT先进行特征重要度排序后再进行选取。除此外,正则项的添加,尤其是 L 1 L_1 L1正则项,本身就可以进行特征的筛选,使重要程度较低的特征系数为0。

3.常用模型

常用模型就不讲述了,无非是LR类的线性模型,或者XGBoost等集成树模型,或者DNN模型。在工业界尤其是新闻、广告、推荐等的线上运行,通常采用LR系列的模型,因为模型相对简单,可以实现实时快速更新,Google提出的FTRL算法集合了FOBOS算法、RDA算法等的优点,加入了 L 1 L_1 L1 L 2 L_2 L2正则项以0和过往的参数同时对现在的参数 w w w进行了正则化处理。FM类的模型是在LR基础上增加了特征之间的二阶组合,可以看作对高维稀疏特征的embedding。或者采用GBDT等树模型,将连续特征进行处理,以输出值作为新的特征加入LR。

4.模型融合

模型融合经常会在比赛中后期大放异彩。常见的有回归问题中的平均法、分类问题中的投票法等。有两种方法重点提一下,一个叫Bagging,是通过有放回的对数据集采样同样多的样本,类似于自助法,T次后用这T份数据训练T个但模型,将每个但模型的结果用平均法或投票法进行融合。Bagging是一种并行的方法,通过重采样的方法降低了模型过拟合的可能性。另一种叫做Stacking,这种方法是通过分级的方式,以二级为例,首先通过K-fold将数据分为K份后,每次选用K-1份训练,对剩下的一份做预测,用这1/K个数据作为第二级模型的输入值,在完全进行结束后,得到全部数据的新的输入值和输出值,输出值为真实label,然后对于新的数据,首先使用一级模型得到预测结果作为二级模型的输入值,然后送入二级模型进行预测。在线上运行时,考虑到响应速度,一般谨慎使用模型融合。

你可能感兴趣的:(《美团机器学习实践》笔记)