我们常把机器学习问题划分为有监督学习和无监督学习。对于我而言,这两种学习方式,我心里明白,但总是感觉难以将二者的区别表述清楚。干脆拿个比喻来举例: 有监督学习更像是有老师的督促下学习,从老师那里学到知识和经验用到自己身上。 无监督学习更像是群魔乱舞。于茫茫人海中寻找和自己相似的人物。只通过样本和样本的特诊来区分。没有标签。输入数据有标签,则为有监督学习,没标签则为无监督学习。
下面重点关注下有监督学习,因为在工业界,有监督学习更常见。在工业界,有监督学习又被细分为两个流程。离线和在线。工作量主要在离线方面。
离线里面有这些工作:
1. 数据筛选
2. 数据清洗
3. 特征抽取
4. 模型训练
5. 模型优化
线上工作有以下几个方面:
1. 对线上的数据进行特征提取
2. 利用提取的特诊进行结果预估
下面的图很清晰的展现整个离线工作的工作过程
解决交易额预估问题,可以用下面的方式
预测交易额,可以直接对交易额本身进行预估。也可以将交易额问题拆分为若干的小问题,分步解决。用子问题的结果来计算原问题。
- 不同方式有不同优缺点,具体如下:
模式 | 缺点 | 优点 |
---|---|---|
单模型 | 1. 预估难度大 2. 风险比较高 | 1. 理论上可以获得最优预估(实际上很难) 2. 一次解决问题 |
多模型 | 1. 可能产生积累误差 2. 训练和应用成本高 | 1. 单个子模型更容易实现比较准地预估 2. 可以调整子模型的融合方式,以达到最佳效果 |
选择哪种模式?
1)问题可预估的难度,难度大,则考虑用多模型;
2)问题本身的重要性,问题很重要,则考虑用多模型;
3)多个模型的关系是否明确,关系明确,则可以用多模型。
划分为多个子问题后。多个子问题的结果如何汇总成总结果?
对于下面这种模型,我仍然有疑问。因为偏下的这张图并没有明确告诉我该如何去融合。
下面针对访购率模型进行估计。
主要考虑
1)选择与业务目标一致的模型;
2)选择与训练数据和特征相符的模型。
训练数据少,High Level特征多,则使用“复杂”的非线性模型(流行的GBDT、Random Forest等);
训练数据很大量,Low Level特征多,则使用“简单”的线性模型(流行的LR、Linear-SVM等)。
关键来了,什么是high level类型的特征,什么又是low level 类型的特征呢?
low level的特征一般指的是较为原始的特征。需要较少的人工干预与处理。能够一眼就能看出来的特征,如用户id,商品id,年龄等等,不需要人工计算,从原始数据就能得到的特征。这种特征维度一般比较高,维度高的意思是这种特征的可选的值很多,如年龄,年龄可选的范围很大。但是这也不是绝对的,如性别,只有两个选项。一般情况下,可选值是非常多的。
high level的特征往往是人工干预,人工计算得到的特征,如人给商品贴的标签,打的分数等等。
low level的特征覆盖面比较小。长尾样本的预测值受high level特征影响大。 热门样本的预测只受low level的影响比较大。
对于非线性模型
1. 使用high level的特征比较好。但是这种特征的维度不适合特别高,因为求得high level 的特征的复杂度比较大。
2. 对high level特征做非线性映射可以较好的拟合目标。
线性模型:
1. 特征体系尽可能全面。特征尽可能的多。high level和low level 尽可能都要有
2. 尽可能的将high level的特征转换为多个low level的特征。
1. 注意: 逻辑回归算是一种广义的线性回归分析模型。
特征处理方面:
1. 归一化:包括按照均匀分布归一化还是按照标准正太分布进行归一化
2.
Filter:
假设特征子集对模型预估的影响互相独立,选择一个特征子集,分析该子集和数据Label的关系,如果存在某种正相关,则认为该特征子集有效。衡量特征子集和数据Label关系的算法有很多,如Chi-square,Information Gain。
Wrapper:
选择一个特征子集加入原有特征集合,用模型进行训练,比较子集加入前后的效果,如果效果变好,则认为该特征子集有效,否则认为无效。
Embedded:
将特征选择和模型训练结合起来,如在损失函数中加入L1 Norm ,L2 Norm。
利用正则项可以起到特征选择的效果。
优化算法:
1.梯度下降 分为随机梯度下降和批量梯度下降
2.牛顿法 以及 拟牛顿法
3.Coordinate Descent 固定其他维度不变,只对一个维度进行搜搜,确定最佳下降方向。
模型的优化:
1. 反思目标是否可以进行评估。
2. 分析模型是否过拟合
训练集表现 | 测试集表现 | 问题 |
---|---|---|
< 期望目标值 | < 期望目标值 | Underfitting |
> 期望目标值 | 接近或略逊于训练集 | 合适 |
> 期望目标值 | 远差于训练集 | Overfitting |
问题 | 数据 | 特征 | 模型 |
---|---|---|---|
Underfitting | 清洗数据 | 1. 增加特征
2. 删除噪音特征 |
1. 调低正则项的惩罚参数
2. 换更“复杂”的模型(如把线性模型换为非线性模型) 3. 多个模型级联或组合 |
Overfitting | 增加数据 | 1. 进行特征选择
2. 降维(如对特征进行聚类、主题模型进行处理等) |
1. 提高正则项的惩罚参数
2. 减少训练迭代次数 3. 换更“简单”的模型(如把非线性模型换为线性模型) |
总结:
1. 要理解业务,分解业务目标
2. 数据要尽可能的可靠。训练集/测试集分布与线上的环境的数据尽可能的一致。
3. 合理的进行特征抽取和特征选择。
4. 模型: 针对不同的数据和特征,选择不同的模型。