美团机器学习实践阅读笔记

[TOC]

第1章 问题建模

机器学习应用流程:

<pre class="mermaid">graph TD; 问题建模-->特征工程 特征工程-->模型选择 模型选择-->模型融合</pre>

线下指标(AUC)要和线上指标(Page Views)等保持一致

精确率 = TP/(TP+FP) 及预测为T的结果中多少是对的

召回率R = TP/(TP+FN) 及预测中召回了多少个T, 预测地震时,精确率无所谓,但是我们希望召回率尽量高

AUC VS ROC

真正率 = TP / (TP + FN)

假正率 = FP / (FP + TN)

AUC area under roc curve

auc越大说明模型越可能将正样本排在负样本前面

auc还有一些统计特性,auc等于随机挑选一个正样本和负样本时,分类器将正样本排前面的概率

AUC只对正负样本排序能力强弱,对score大小和精度没有要求

auc越高模型的排序能力越强

AUC把所有正样本排在负样本前面,AUC=1.0

对数损失 logistic loss

对预测概率的似然估计

对数损失最小化本质上是利用样本中的已知分布,求解导致这种分布的最佳模型参数,

使这种分布出现概率最大

logloss衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。

与AUC不同,logloss对预测概率敏感

回归metric

平均绝对误差 mean absolute error MAE

也叫L1-norm loss.

MAE是绝对误差的平均值

使用MAE做lossFuc 是对数据分布的median做拟合

均方根误差 RMSE--root mean squared error

RMSE代表的是预测值和真实值差值的样本标准差

和MAE比,RMSE对大误差样本有更大的惩罚,对outlier敏感,健壮性不如MAE

用RMSE做lossFuc是对数据分布的mean做拟合

1.2样本选择

第2章 特征工程

数据和特征决定了机器学习算法的上限,模型和算法只是不断逼近这个上限而已

第16章 分布式机器学习

分布式机器学习需要解决如下三个问题:

  1. 如何更好切分成多个任务
  2. 如何调度子任务
  3. 均衡各节点负载

参数服务器

  • 参数的获取与提交:计算节点从参数服务节点上获取当前的梯度,然后根据本地分配的训练样本进行梯度计算,通过几轮迭代后将更新后的梯度推送给参数服务器节点。参数在参数服务器需要高效地进行分布式存储,同时计算节点和参数服务节点之间的通信要足够高效
  • 参数值的同步问题:根据参数服务器的设计和运行原理,我们可以得知在每一个时刻计算节点的梯度和当前参数服务节点上储存的梯度可能是不一致的。

ps

什么时候计算节点与参数服务器节点更新同步一次参数呢?

这个更新同步过程对每个计算节点来说都是相互独立的。一般来说,一个比较简单而且常用的方式是,我们可以采用固定的迭代轮数,每个计算节点迭代这个轮数后和参数服务节点做一次同步

非凸问题

梯度如何更新

主要有参数平均法和基于更新方法两种

参数平均法

参数平均法的核心思想是将每个计算节点获取的参数值求平均后作为全局参数值,可以证明参数平均法的结果在数学意义上等同于用单个机器进行训练

异步梯度下降更新

相对于在工作节点与参数服务器之间传递参数,我们只传递梯度更新信息。

比较

比较

XGBoost

使用rabit,rabit在MPI的allReduce和broadcast操作原语这个基础上提供了更好的容错处理功能,弥补了MPI的不足

xgboost优化了rabit的MR流程

  1. 每一轮迭代结束后,计算结果不用放入储存系统。保留在内存里
  2. 每一轮迭代后没有数据重新分发的过程(no shuffle)

rabit

xgboost容错

rabit在一轮AllReduce后,会把在各个节点内存中将模型结果缓存为checkpoint,并加版本号

同步结束后,各个节点会继续计算到下一次AllReduce通信同步。

如果有节点发生故障,该故障节点会从集群中找到最近的节点,拿到上一轮的模型文件,然后重新开始计算,其他无故障的节点等待故障节点计算完成后再AllReduce

PSlite

啥都没说,duang。美团用zmq,应该是pslite改的

第17章 特征工程

特征生产

离线特征生产

所谓的离线特征主要是从历史数据中总结和归纳出来的特征表示。原始数据一般保存在分布式储存Hive, HBase,ES或者DB中。

离线特征的生产过程主要包括特征计算和定时调度(linkedin的azakaban)

实时特征

实时特征