机器学习各算法介绍
1. SVM
SVM(Support Vector Machine)指的是支持向量机,是一种常见的判别模型,也是一种二分类方法,它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。
特性:
- SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律,因此不同于现有的统计方法
- 非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射
- SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了 “维数灾难”
- SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值
- 其本身的优化目标是结构化风险最小,而不是经验风险最小,也就是自带正则化
缺点:
- SVM算法对大规模训练样本难以实施
SVM是借助二次规划来求解支持向量,而求解二次规划将涉及 m 阶矩阵的计算 - 用 SVM 解决多分类问题存在困难
- 对缺失数据敏感,对参数和核函数的选择敏感
- 对于核函数的高维映射解释力不强,尤其是径向基函数
2. LR
logistic回归又称logistic回归分析,是一种常见的判别模型,也是一种对数线性模型
特性:
- 实现简单,广泛的应用于工业问题上
- 分类时计算量非常小,速度很快,存储资源低
- 输出为概率,可以便利的观测样本概率分数
- 对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题
缺点:
- 当特征空间很大时,逻辑回归的性能不是很好
- 容易欠拟合,一般准确度不太高
- 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分
3. 决策树
特性:
- 决策树易于理解和实现
- 决策树算法的时间复杂度(即预测数据)是用于训练决策树的数据点的对数
- 对于决策树,数据的准备往往是简单或者是不必要的。
- 对缺失值不敏感
缺点:
- 容易过拟合
- 学习一个最优决策树的问题是NP难问题,所以使用启发式算法,不能确定是全局最优解
- 在处理特征关联性比较强的数据时表现得不是太好
4. Naive Bayes classifier
朴素贝叶斯法是基于贝叶斯定理与特征条件独立的分类方法,是一种生成模型,其分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率
特性:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
- 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练
- 对缺失数据不太敏感,算法也比较简单
缺点:
- 特征条件独立性假设往往是不成立的,导致误差变大
- 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳
- 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率
5. KNN
KNN最近邻算法,K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表
特性:
- 简单,易于理解,易于实现,无需估计参数,无需训练
- 特别适合于多分类问题,kNN比SVM的表现要好
缺点:
- 懒惰算法,对测试样本分类时的计算量大,需要全局计算,内存开销大,评分慢
- 样本不平衡时,预测偏差比较大
- k值大小的选择比较困难
6. adaboost
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)
特性:
- 很好的利用了弱分类器进行级联
- 可以将不同的分类算法作为弱分类器
- AdaBoost具有很高的精度
- 相对于bagging算法和Random Forest算法,AdaBoost充分考虑的每个分类器的权重
缺点:
- AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定
- 数据不平衡导致分类精度下降
- 训练比较耗时,每次重新选择当前分类器最好切分点
7. RF
特性:
- 容易理解和解释,树可以被可视化
- 不需要太多的数据预处理工作,即不需要进行数据归一化,创造哑变量等操作
- 隐含地创造了多个联合特征,并能够解决非线性问题
- 和决策树模型,GBDT模型相比,随机森林模型不容易过拟合
- 自带out-of-bag (oob)错误评估功能
- 易于并行化
- RF使用随机采样
随机采样(bootsrap)就是从我们的训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到
缺点:
- 不适合小样本,只适合大样本
- 大多数情况下,RF模型的精度略低于GBDT模型的精度
- 适合决策边界是矩形的,不适合对角线型的
机器学习各算法异同
1. GBDT 与 XGBoost
- 基分类器的选择:传统GBDT以CART作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)
- 二阶泰勒展开:传统GBDT在优化时只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数,损失函数更精确。顺便提一下,XGBoost工具支持自定义损失函数,只要函数可一阶和二阶求导
- 方差-方差权衡:XGBoost在目标函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出分数的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance(方差),使学习出来的模型更加简单,防止过拟合,这也是XGBoost优于传统GBDT的一个特性。
- Shrinkage(缩减):相当于学习速率(xgboost中的)。XGBoost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
- 列抽样(column subsampling):XGBoost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是XGBoost异于传统GBDT的一个特性。
- 缺失值处理:XGBoost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍。即对于特征的值有缺失的样本,XGBoost可以自动学习出它的分裂方向。
- XGBoost工具支持并行:Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block(块)结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
2. SVM 和 LR
相同点:
- LR和SVM都是分类算法
- 如果不考虑核函数,LR和SVM都是线性分类算法,即分类决策面都是线性的
- LR和SVM都是监督学习算法
- 都是判别方法
不同点:
- 本质上是其loss function不同
- 支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用),线性SVM不直接依赖于数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing
- 在解决非线性问题时,支持向量机采用核函数的机制,而 LR 通常不采用核函数的方法。这个问题理解起来非常简单。分类模型的结果就是计算决策面,模型训练的过程就是决策面的计算过程。通过上面的第二点不同点可以了解,在计算决策面时,SVM 算法里只有少数几个代表支持向量的样本参与了计算,也就是只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。然而,LR算法里,每个样本点都必须参与决策面的计算过程,也就是说,假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。所以,在具体应用时,LR很少运用核函数机制。
- 线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization,LR不受其影响。
- SVM的损失函数就自带正则,(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因,而LR必须另外在损失函数上添加正则项
3. GBDT 和 RF
相同点:
- 都是由多棵树组成
- 最终的结果都是由多棵树一起决定
不同点:
- GBDT是采用boosing方法,RF采用的是baggging方法
- 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
- 组成随机森林的树可以并行生成;而 GBDT 只能是串行生成
- 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
- 随机森林对异常值不敏感,GBDT对异常值非常敏感
- 随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
- 随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
- 随机森林不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化
其他
算法要从以下几个方面来掌握:
- 产生背景,适用场合(数据规模,特征维度,是否有 Online 算法,离散/连续特征处理等角度);
- 原理推导(最大间隔,软间隔,对偶);
- 求解方法(随机梯度下降、拟牛顿法等优化算法);
- 优缺点,相关改进;
- 和其他基本方法的对比;
过拟合原因
- 数据:数据不规范,数据量少,数据穿越,统计特征用到了未来的信息或者标签信息
- 算法:算法过于复杂
- 解决:
- 将数据规范化,处理缺失值,增加数据量,采样,添加噪声数据
- 正则化,控制模型复杂程度
- early stoping,减少迭代次数,减少树的深度
- 学习率调大/小点
- 融合几个模型
- dropout、regularization、batch normalizatin
L1和L2的区别
- L1是Lasso Regression,表示向量中每个元素绝对值的和:L1范数的解通常是稀疏性的,倾向于选择数目较少的一些非常大的值或者数目较多的 insignificant 的小值。
- L2是岭回归,Ridge Regression,是欧氏距离也就是平方和的平方根。L2范数越小,可以使得 w 的每个元素都很小,接近于0,但与 L1 范数不同的是他不会让它等于 0 而是接近于 0。
- L1 正则化的w可取的值是转置的方形,L2 对应的是圆形。这样损失函数 l(w) l ( w ) 的最小值更容易在 L1 对应的边角上取得,从而这些维度变成 0 了。
- 从贝叶斯的角度来看,加入正则项相当于加入了一种先验。即当训练一个模型时,仅依靠当前的训练数据集是不够的,为了实现更好的泛化能力,往往需要加入先验项。
L1范数相当于加入了一个Laplacean先验;
L2范数相当于加入了一个Gaussian先验。
L2对大数的惩罚更大,但是解相对来说比较均匀。
生成模型和判别模型区别
- 对于输入x,类别标签y:
生成式模型先求它们的联合概率分布 P(x,y) P ( x , y ) ,然后根据贝叶斯定理求 P(y|x) P ( y | x )
判别式模型直接求条件概率分布 P(y|x) P ( y | x ) - 常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场
- 常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机
梯度消失和梯度膨胀
梯度消失:
- 根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0
- 可以采用 ReLU 激活函数有效的解决梯度消失的情况
梯度膨胀:
- 根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大
- 可以通过激活函数来解决
欧氏距离与曼哈顿距离
- 欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,对应于 L2
- 曼哈顿距离,我们可以定义曼哈顿距离的正式意义为 L1-距离 或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和
- 通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。而实际驾驶距离就是这个“曼哈顿距离”,这也是曼哈顿距离名称的来源, 同时,曼哈顿距离也称为城市街区距离(City Block distance)
数据归一化
归一化为什么能提高梯度下降法求解最优解的速度?
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛
对原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。归一化有可能提高精度
一些分类器需要计算样本之间的距离(如欧氏距离),例如 KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)