本文是《Python机器学习——预测分析核心算法》截止到第五章的读后笔记,主要涉及惩罚线性回归方法。后续会更新第六、七两章关于集成方法的学习笔记。
第一章 关于预测的两类核心算法
什么是惩罚回归方法?
惩罚线性回归方法是由普通最小二乘法衍生出来的。它设计之初的想法就是要克服最小二乘法可能会带来的过拟合问题。如下图所示:
上面的大图中,图1-1是基于六个点利用最小二乘法拟合出的预测直线;图1-2是基于六个点中的两个点利用最小二乘法拟合出的预测直线。使用两个点来拟合一条直线的主要问题是针对直线的自由度,没有提供足够多的数据。一条直线有两个自由度,两个自由度意味着要有两个独立的参数才能唯一确定一条直线。当自由度与点数相同时,预测效果并不是很好。连接这些点构成了直线,但是在不同点对之间可以形成大量不同的直线。对在自由度与点数相同的情况下所做的预测并不能报太大的信心。图1-1是6个点拟合一条直线,也就是说6个点对应两个自由度。从大量的人类基因中找到可致遗传基因的问题可以阐明相似的道理:例如要从20000个人类基因中找到可致遗传的基因,可选择的基因越多,需要的数据就越多。20000个不同基因就代表20000个自由度,甚至从20000个人中获取的数据都不足以得到可靠的结果,在很多情况下,一个预算相对合理的研究项目只能负担起大约500个人的样本数据。在这种情况下,惩罚线性回归就是最佳的选择了。所谓惩罚线性回归就是在计算线性回归的代价函数时,向代价函数中加入惩罚项作为代价函数额外的约束条件。常见的惩罚线性回归方法有LASSO回归、岭回归、Elastic Net回归等。惩罚线性回归可以减少自由度使之与数据规模、问题的复杂度相匹配。对于有大量自由度的问题,惩罚线性回归方法得到了广泛的应用。
什么是集成方法?
集成方法的基本思想是构建多个不同的预测模型,然后将其输出做某种组合作为最终的输出,如取平均值或采用多数人的意见(
投票
)。单个预测模型叫做基学习器。计算学习理论的研究结果证明只要基学习器比随机猜测稍微好些(如果独立预测模型的数目足够多),那么集成方法就可以达到相当好的效果。
算法的选择(集成与惩罚线性回归)
惩罚线性回归的优势在于训练速度非常快。大规模数据集的训练时间可以是小时、天、甚至是几周。要获得一个可以部署的解决方案往往需要进行多次训练。过长的训练时间会影响大规模数据问题的解决进度及其部署。训练所需的时间当然越短越好,因此惩罚线性回归因其训练所需时间短而获得广泛使用就是显而易见的了。例如,如果训练集合在GB级别,惩罚线性回归算法的训练时间在30分钟这个级别,集成方法可能需要5~6小时。如果特征工程阶段需要10次迭代来选择最佳特征集合,则单单这个阶段就会产生1天对应1周的时间差异。一个有用的技巧就是在开发的早期阶段,如特征工程阶段,利用惩罚线性模型进行训练。这给数据科学家提供一个基本的判断:哪些变量(特征)是有用的、重要的,同时提供了一个后续与其他算法性能比较的基线。对于一些不需要复杂模型的问题,线性方法相比集成方法可以获得同等或者更好的性能。数据科学家的任务就是如何平衡问题的复杂度、预测模型的复杂度和数据集规模,以获得一个最佳的可部署模型。基本思想是如果问题不是很复杂,而且不能获得足够多的数据,则线性方法比更加复杂的集成方法可能会获得全面更优的性能。
构建预测模型的流程
1)构造一个机器学习问题。从业务场景中提取出对应的机器学习问题,这一阶段也可以概括为重述问题;
2)选择模型。根据经验暂时性选择一个适用的模型;
3)特征提取和特征工程;
4)训练模型;
5)评估模型性能;根据评估结果确定是否对上述过程进行迭代;
6)模型部署;
上述流程可以用下图简要概括:
第二章 通过理解数据来了解问题
属性和标签的不同类型决定模型的选择。初始审视数据集时,需要考虑数据集的相关特性,如下:
- 行数、列数
- 类别变量的数目、类别变量的取值范围
- 缺失的值(检测与处理)
- 属性和标签的统计特性
- 异常值(检测与处理)
关于缺失值的处理,可以参考:
https://blog.csdn.net/w352986331qq/article/details/78639233
关于异常值的检测与处理,可以参考:
https://blog.csdn.net/qq_41080850/article/details/86695846
可视化技巧:
- 利用箱形图来显示数据集中的异常值
- 利用平行坐标图来显示属性和目标之间的相关性
关于箱形图的绘制,可以参考:
https://blog.csdn.net/qq_41080850/article/details/83829045
关于平行坐标图的绘制可以参考:
https://blog.csdn.net/qq_41080850/article/details/86698190
第三章 预测模型的构建:平衡性能、复杂性以及大数据
影响算法选择及性能的因素
有几个因素影响预测算法的整体性能。这些因素包括问题的复杂度、模型复杂度以及可用的训练数据量。
1)问题复杂度/模型复杂度:如果问题很复杂(如对不同购物者提供个性化服务),一个拥有大量数据的复杂模型可以生成精确的结果。然而,如果真实模型不复杂,或者没有足够多的数据,一个线性模型可能是最好的答案;
2)训练数据量/模型复杂度:对于分类问题来说,如果数据少的话,边界很难通过视觉确定,所以也更难进行计算。在数据有限的情况下,对于复杂问题,简单模型可能要好于复杂模型。
3)模型选择:最好的办法是用复杂模型解决复杂问题,用简单模型解决简单问题但是必须考虑到数据规模。换句话说,数据规模会影响模型的选择。因此一般是通过权衡问题复杂度、模型复杂度和数据集规模来选择模型。
度量预测模型性能
1)对于回归问题,使用均方误差(MSE),平均绝对错误(MAE)和根MSE即MSE的算术平方根(RMSE)作为性能评价指标;
2)对于分类问题,使用误分类率,ROC曲线和ROC曲线下面积(AUC)作为性能评价指标。
ROC、AUC可以参考:
https://blog.csdn.net/qq_41080850/article/details/87623523
https://blog.csdn.net/qq_41080850/article/details/86764251
部署模型的性能模拟
主要方法:
1)留出法:将数据划分为训练集(约占2/3)和测试集(实际上应该称为验证集,约占1/3);
2)交叉验证:交叉验证除可以用于评估部署模型的性能之外,还可以用于调参。
注意事项:
1)验证集要能代表整个数据集。如果研究对象有特殊的统计特征,抽样过程可能要更加小心。例如,假如要预测的目标事件在整体数据中出现的概率非常小,随机抽样会因为可能导致过多或者过少的样本出现在验证集中而不再适用,此时可以采用分层抽样,将数据划分为不同的子集,分别在子集中进行抽样然后组合成验证集;
2)模型进过训练和测试后,应该讲训练集和验证集再合并为一个更大的集合,重新在该集合上训练模型,从而得到真正要部署的模型。这样得到的部署模型的模型效果会更好,泛化能力也更好。
前向逐步回归与岭回归
前向逐步回归和岭回归都是对基于最小二乘法的一种改进,都可以抑制利用最小二乘法训练线性回归模型的过程中可能会出现的过拟合现象。
1)前向逐步回归:
其基本思想是由少到多地向模型中引入变量,每次增加一个,直到没有可以引入的变量为止。最后通过比较在预留样本上计算出的错误进行模型的选择。Python代码实现,可以参考:
https://blog.csdn.net/qq_41080850/article/details/86764534
2)岭回归:
岭回归是一种常见的惩罚线性回归算法,其基本思想是在最小二乘法的公式中加入基于向量2范数的正则项。
第四章惩罚线性回归模型
为什么惩罚线性回归方法如此有效?
下面的几个特点使得惩罚线性回归方法非常有效:
- 模型训练足够快速
- 可以导出变量的重要性信息
- 部署时的预测足够快速
- 在各种问题上性能可靠,尤其是对于样本并不明显多于属性的矩阵,或者非常稀疏的矩阵。希望模型为稀疏解(即只使用部分属性进行预测的吝啬模型)
- 问题可能适合使用线性模型来解决
常见的惩罚线性回归方法
1)套索(LASSO)回归:使用L1正则项作为惩罚项;
2)岭回归:使用L2正则项作为惩罚项;
3)ElasticNet回归:使用ElasticNet惩罚项,它是套索惩罚项和岭惩罚项的组合。
最小角度回归算法(LARS)
基本思想:
1)将beta的所有值都初始化为0;
在每一步迭代中:
2)判断哪个属性与残差有最大的关联;
3)如果关联为正,小幅度增加关联系数;关联为负,小幅度减少关联系数。
LARS算法的Python实现,可以参考:
https://blog.csdn.net/qq_41080850/article/details/87093905
惩罚线性回归方法的扩展
惩罚线性回归方法除可以解决回归问题外,还能用于求解分类问题,包括二分类和多分类问题。
第五章 使用惩罚线性方法来构建预测模型
使用scikit-learn相关包的几点说明:
1)一些包(不是所有包)在模型拟合前会自动对属性进行归一化处理;
2)scikit-learn包使用alpha来代表系数惩罚项的乘子,使用l1_ratio来代表ElasticNet惩罚项中套索(LASSO)惩罚项所占的比例;
3)调用scikit-learn包训练模型前,是否对属性和标签做归一化处理会影响到训练模型的性能。一般需要对属性集X做归一化处理,X不做归一化处理一定要足够警惕。
交叉验证结果的处理
交叉验证会给我们一个稳定的性能估计,可以据此了解实际应用系统的性能。但是如果交叉验证给出的性能不够好,则需要努力提升。例如,可以尝试使用基扩展(基于原始属性构造新的属性加入模型中)。也可以查看性能表现最差的样本,看能否发现问题,如数据预处理错误,如某个特征对错误的影响最大。如果发现的错误刚好解决了你的问题,那么就应该利用整个数据集来训练部署模型。如果经检查后没有发现任何问题,此时可以考虑更换模型。
参考:《Python机器学习——预测分析核心算法》Michael Bowles著