常见机器学习算法(模型)优缺点比较

博客已转移至 https://lmhgithi.github.io/ 内容更全

朴素贝叶斯NB(分类)(生成)

优点

  • 稳定的分类效率

  • 对小规模数据表现很好,能处理多分类任务,适合增量式训练

  • 对缺失数据不太敏感,算法较简单,多用于文本分类

  • 如果满足条件独立假设,NB的收敛速度将快于判别模型如LR,所以只需要少量数据,即使NB条件独立假设不独立,仍然表现很出色。

缺点

  • 需要计算先验概率

  • 分类决策存在错误率

  • 对输入数据的表达形式很敏感

  • (不能学习出特征间的相互作用)

逻辑回归(分类)(判别)

伯努利分布

有很多正则化模型的方法L0,L1,L2等

优点

  • 实现简单

  • 分类时计算量小,速度快,存储资源少

  • 便利的观测样本概率分布

    问题

    可以简单的用L2正则解决多重共线性

缺点

  • 特征空间很大时,逻辑回归性能不太好

  • 容易欠拟合,一般准确率不会太高

  • 不能很好地处理多特征

  • 只能处理二分类(softmax可用于多分类),且必须线性可分。

  • 对于非线性特征,需要进行转换(如核函数)

如果想处理多分类

  • 可以对每个类别都建立一个二分类器,带有这个类别的样本标记1,不带的标记0。

  • softmax回归,即修改LR的损失函数,让其适合多酚类问题,不只考虑1-0的损失,考虑每个样本标记的损失,并且把激活函数替换为softmax函数。

线性回归(回归)(判别)

高斯分布

基本思想是用梯度下降法对最想二乘法形式的误差函数进行优化,也可以用normal
equation直接求解:
《常见机器学习算法(模型)优缺点比较》

LWLR(局部加权线性回归)
《常见机器学习算法(模型)优缺点比较》
优点

  • 实现简单,计算简单

缺点

  • 不能拟合非线性数据

GBDT梯度提升决策树(回归)

优点

  1. 可以灵活处理各种类型的数据,包括连续值和离散值。

  2. 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。

  3. 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如
    Huber损失函数和Quantile损失函数。

缺点:

  1. 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。

决策树(分类、回归)(判别)

Id3、c4.5、cart

信息增益: g ( D , A ) = H ( D ) − H ( D ∣ A ) g\left( D,A \right) = H\left( D \right) – H\left( D \middle| A \right) g(D,A)=H(D)H(DA)

经验熵减去条件经验熵

信息增益比: g R ( D , A ) = g ( D , A ) H A ( D ) g_{R}\left( D,A \right) = \frac{g\left( D,A \right)}{H_{A}\left( D \right)} gR(D,A)=HA(D)g(D,A)

信息增益和训练集D关于特征A的值的熵之比

优点

  • 计算简单,可解释性强

  • 比较适合处理有缺失属性的样本

  • 不必担心数据有异常值或是否线性可分

  • 能处理不相关的特征

  • 在相对短的时间内能够对大型数据源做出可行且效果良好的结果

缺点

  • 容易过拟合(可以通过剪枝来减轻,或用RF)

  • 忽略了数据之间的相关性

  • 在样本不平衡时,信息增益的结果总偏向于具有更多数量的特征。(信息增益的缺陷)

  • 不支持增量学习,有新特征时,要重新学习。

Xgboost(分类,回归)(判别)

GBDT的工程实现

优点

  • 高准确率,高并发,支持自定义损失函数

  • 可以输出特征重要性,速度块,适合作为高维特征选择的利器

  • 在目标函数中加入正则项,控制了模型复杂度,避免过拟合

  • 支持列抽样,就是随机选择特性,增强了鲁棒性

  • 对缺失值不敏感,可以学习到包含缺失值特征的分裂向量

缺点

  • 在每次迭代的时候都要遍历整个训练数据多次,如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间

  • 预排序方法空间消耗大

  • 因为xgboost采用的是基于特征的并行计算,所以在每次计算之前,都要对特征进行排序。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点)。这里需要消耗训练数据两倍的内存

  • 时间消耗大,在遍历每个分割点的时候,都需要进行分裂增益的计算,消耗的时间代价大

  • 对cache优化不友好,在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache
    miss.

SVM(分类)(判别)

高准确率,为避免过拟合提供了很好的理论保证,而且就算数据在原特征空间线性不可分,只要给个合适的核函数,它就能运行得很好。在动辄超高维的文本分类问题中特别受欢迎。可惜内存消耗大,难以解释,运行和调参也有些烦人,而随机森林却刚好避开了这些缺点,比较实用。

优点

  • 可以解决高维特征

  • 能够处理非线性特征的互相作用

  • 无需依赖整个数据

  • 可以提高范化能力

缺点

  • 需要对数据提前归一化,毕竟是基于距离的模型

  • 当观测样本很多时,效率不高

  • (解决这个的一个方法是模仿RF,把数据分解k份,训练多个模型求平均,可以将时间复杂度降低k倍)

  • 对缺失数据敏感

  • 要选择核函数

对于核的选择也是有技巧的(libsvm中自带了四种核函数:线性核、多项式核、RBF以及sigmoid核):

  • 第一,如果样本数量小于特征数,那么就没必要选择非线性核,简单的使用线性核就可以了;

  • 第二,如果样本数量大于特征数目,这时可以使用非线性核,将样本映射到更高维度,一般可以得到更好的结果;

  • 第三,如果样本数目和特征数目相等,该情况可以使用非线性核,原理和第二种一样。

  • 对于第一种情况,也可以先对数据进行降维,然后使用非线性核,这也是一种方法。

随机森林(分类、回归)

优点

  • 可以作为特征选择的工具

  • 可以处理高维特征的数据,不用做特征选择

  • 泛化能力强,(对误差是无偏估计)

  • 训练速度快,易实现并行

  • 可以处理特征互相影响

  • 对不平衡数据集来说,可以平衡误差

  • 对缺失值不敏感

缺点

  • 噪声较大的问题上容易过拟合

  • 对于有不同取值的属性的数据,取值划分较多的属性会对RF产生更大影响,此时,RF产出的属性权值是不可信的

人工神经网络的优缺点(判别)

优点

  • 分类的准确度高;

  • 并行分布处理能力强,分布存储及学习能力强,

  • 对噪声神经有较强的鲁棒性和容错能力,能充分逼近复杂的非线性关系;

  • 具备联想记忆的功能。

缺点

  • 神经网络需要大量的参数,如网络拓扑结构、权值和阈值的初始值;

  • 不能观察之间的学习过程,输出结果难以解释,会影响到结果的可信度和可接受程度;

  • 学习时间过长,甚至可能达不到学习的目的。

K-Means聚类

优点

  • 算法简单,容易实现

  • 对于大数据集,该算法是相对可伸缩和高效率的,因为它的复杂度大约是O(nkt),其中n所有对象的数目,k是簇数,t是迭代次数,通常k<<n。

  • 用平方误差函数划分k簇,当簇是密集的,球或团装,且簇间区别明显时聚类效果较好。

缺点

  • 对数据类型要求较高,适合数值型数据

  • 每次迭代会计算所有数据(改进:Elkan K-Means 三角不等式、Mini Batch K-Means)

  • 可能会局部收敛,到局部最小值

  • K值难以选取

  • 对初值的簇心选取敏感(改进:K-Means++)

  • 不舍和发现非凸面形状的簇,或者大小差别很大的簇

  • 对于噪声数据敏感,可对平均值产生很大影响
    Adaboosting
    优点:
    • 是一种有很高精度的分类器;
    • 可以使用各种方法构建子分类器,Adaboost算法提供的是框架;
    • 当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单;
    • 不用做特征筛选;
    • 不用担心过拟合;
    缺点:
    对异常值敏感;

    原文作者:lmh的随笔
    原文地址: https://blog.csdn.net/qq_34329931/article/details/88937343
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞