0%

机器学习小结

本文是关于机器学习的一些总结式内容,暂时不包含神经网络和深度学习内容;

适用于机器学习相关面试突袭!!!

分类

SVM的简要介绍

SVM( support vector machine,支持向量机)是一个面向数据的分类算法,基本模型就是在空间上找到一个超平面来将不同类别的数据划分出来,学习的策略是根据支持向量使得超平面的间隔最大化,最终转化为一个凸优化规划的求解问题。

LR

LR(Logistic Regression,逻辑回归),逻辑回归虽然被称为是回归,但本质上还是一个二分类模型,名字的逻辑来源于logistic(逻辑斯蒂)分布, \[ logit(x) = ln(\frac{P(y=1|x)}{P(y=0|x)}) = ln(\frac{P(y=1|x)}{1-P(y=1|x)}) = wx,其中w=\theta_1,\theta_2,\dots,\theta_n \] 获得概率函数 \[ P(y=1|x) = \frac{1}{1+e^{-wx}} \] 逻辑回归求解的话,一般是采用梯度下降算法进行求解,主要方法就是先对目标损失函数\(J(w)\)计算梯度(也就是求导),设计一个学习率(步长),向梯度的(负)方向更新回归系数,令损失函数不断减小,直至低于设置的临界门限,此时获得的回归系数就是最终使得损失函数最小的极小值点。

逻辑回归中遇到有很多参数的时候,容易遇到过拟合的问题,此时采用正则化的方式,在经验风险上增加一个正则化项来惩罚过大的参数。

正则化

正则化是针对过拟合提出来的,正则化项是模型参数向量的范数,一定程度上也能表现出模型复杂度。一般模型求解是优化最小的经验风险,通过加上正则化项和权重,来控制结构经验风险最优,防止模型结构过于复杂,降低过拟合风险。

  • \(L_1\)正则化项(lasso回归),参数稀疏,自动完成特征选择,去除影响很小的特征;
  • \(L_2\)正则化项(岭回归),能够解决过拟合问题。

奥卡姆剃刀:所有的模型中,能够用最简单的方法来解释已知数据的模型是最好的。

逻辑回归与线性回归

逻辑回归和线性回归本质上都是广义的线性回归。

线性回归 逻辑回归
目标函数 最小二乘 似然函数
敏感度 整个实数域内预测,敏感度一致 Sigmoid函数减小预测范围,提高局部敏感度

逻辑回归本质上在线性回归上增加了一层sigmoid函数,但是这一层函数却改变了预测的敏感度。线性回归在整个数据域中,对数据的敏感度是一致的,在分类的边界往往模糊不清,而sigmoid函数使得逻辑回归的值在\([0,1]\)之间,数据在x=0的附近是是十分敏感的,而在远大于或远小于0的部分是非常不敏感的,也就使得在边界的分类更加的准确。

逻辑回归与SVM

逻辑回归和SVM都可以处理分类问题,一般用于二分类问题。

区别:

LR SVM
模型 参数模型 非参数模型
损失函数 Logistical Loss hinge loss,最小化经验分类错误
数据量 通过非线性映射,减少离分类面较远的属性权重,增加与分类相关的属性权重 仅考虑少数的几个支持向量进行学习,SVM转化为对偶问题之后,仅需要计算少数几个支持向量的距离,在进行复杂的核函数计算时有很大的优势
LR能做的SVM都能 准确率上SVM能做的LR不一定能

K-means和KNN为何使用欧式距离而不是曼哈顿距离计算

欧式距离:\(d(X,Y) = \sqrt{(x_1-y_1)^2+(x_2-y_2)^2+\dots+(x_n-y_n)^2}=\sqrt{\sum^n_{i=1}(x_i-y_i)^2}\),欧式距离将不同的属性的量纲视作等同,不适用于对个体具有不同重要性的指标。因此,欧式距离使用之前需要各属性都标准统一

曼哈顿距离:\(d(X,Y) = |x_i-x_2|+|y_1-y_2|\)(L1),曼哈顿距离表示的是两线线段对轴产生投影的总和,仅计算垂直或水平距离,依赖坐标系的转度,有维度的限制。

数据点存在于任何空间,欧式距离将会是更可靠的选择。

简单描述特征工程

过拟合

  • 数据上,数据量太少,统计特征使用未来标签
  • 算法上:算法过于复杂
  • 解决方法:1. 数据规范化,增加数据量;2. 利用正则化降低模型复杂度;3. 减少迭代次数;4. 调整学习率;5. 模型融合。

朴素贝叶斯

所谓朴素,就是假设数据集中所有特征的作用同等重要并相互独立,但是这个假设在这个给世界上很少存在,所以认为他很朴素。

  • 条件概率:后验概率\(P(B|A)\)
  • 边缘概率:先验概率\(P(A\)

那么贝叶斯定理为\(P(A|B) = \frac{P(B|A)P(A)}{P(B)}\)

为什么要进行归一化

概率模型不需要归一化,因为概率模型只关心变量的分布和变量之间的条件概率,例如决策树和RF等模型,而Adaboost、GBDT、XGBoost、SVM、LR、KNN、KMeans之类的最优化问题需要进行归一化

就二维特征而言,当两个数据特征的区间范围相差较大,那么数据特征形成的等高线就会比较窄,使用梯度下降算法进行求解的时候往往会出现“之”字形的下降路线,迭代次数多,时间长。而进行归一化之后,数据特征的取值区间相似,等高线会形成一个较为平滑的圆形,梯度下降的时候能够较快收敛。所以使用梯度下降算法的时候往往就很有归一化的必要。

同时需要计算样本距离的时候,例如KNN中使用欧式距离,就需要将特征域缩放在相同范围,使得特征的权重保持一致。

  • 线性归一化:适用于数值比较集中的情况。但是当max和min值不稳定的时候容易使得归一化结果不稳定,所以可以使用经验常量进行替代 \[ x' = \frac{x-min(x)}{max(x)-min(x)} \]

  • 标准差标准化:使得数据符合正态分布 \[ x' = \frac{x-\mu}{\sigma},\mu是样本均值,\sigma是样本标准差 \]

  • 非线性归一化:适用于数据分化较大的场景,常使用log、指数、正切等数学方式,对原始数据进行映射,需要根据实际的数据决定非线性函数曲线。

完整的机器学习项目过程

1. 抽象为数学问题

需要将实际的业务问题转化为数学问题,也就是,我们可以获得什么样的数据,目标是回归还是分类或是聚类问题。

2. 获取数据

数据的价值决定着模型的上限,机器学习算法的优化不过的逼近这个上限。我们所选取的数据需要有代表性,否则就会过拟合。数据也不能偏斜太严重,不同特征之间不要存在数个数量级之间的差距。同时也需要判断需要数据的量级,判断消耗内存或和时间,若数据实在太大,就需要考虑调整算法或利用并行和分布式计算。

3. 特征预处理和特征选择

从良好的数据中选择出良好的特征才能够发挥最大效益。

特征预处理这一步往往能够使得算法的效果和性能得到显著性提高。一般使用的方法有缺失值处理、归一化、离散化、因子化、去除共线性等方法。

进行特征选择需要我们反复理解业务需求,筛选显著特征,去除非显著特征,可以利用相关系数、卡方检验、平均互信息、条件熵、后验概率等方法。

4. 训练模型与调优

这一步就是选择算法对数据进行训练,现在有很多的算法都已经封装好了,例如Python中的sklearn库,真正影响效果的是参数的选择,这需要我们对算法的原理有更好的理解,来进行更好的调度。

5. 模型评估

模型训练之后需要对模型进行评估,首先考虑的是过拟合或欠拟合的问题,一般可以使用交叉验证或绘制学习曲线等方法进行验证,相应的调整数据量或模型复杂度。也可以考虑误差分析,观察误差样本,考虑是参数还是算法的问题,特征还是数据本身问题。不断的修改优化,来达到最优的效果。

6. 模型融合

一般来说,模型的融合都会使得效果有一定的提升。工程上,提升算法准确度的方法一般是在模型建立之前的数据清洗和特征工程上,以及建立模型之后的模型融合上。因为这两点标准可复制,效果也很稳定,细节调参的处理相对来说比较少,因为时间长,代价高,并且效果难以保证。

7. 上线运行

建立的模型投入使用的时候,并不单纯的考虑结果的准确性和误差情况,也需要考虑模型运行的速度、占用内存以及稳定性等情况。

协方差与相关性

协方差是用于衡量两个变量的联合变化程度,也就是同时变化的方向和程度情况。当两个变量之间存在不同的度量,我们会得到无意义的协方差。

相关性是协方差的一个标准化格式,是消除了量纲影响、标准化之后特殊的协方差。 \[ \rho = \frac{Cov(X,Y)}{\sigma_X\sigma_Y} \] 量纲对数据造成的变化幅度,使得协方差虽然能够得到两者是同向变化的,但是却不能发现两者变化相似。

XGBoost与GBDT

传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。 xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。 Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率) 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。 xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

个人收获

------ 本文结束------