博客已转移至 https://lmhgithi.github.io/ 内容更全
朴素贝叶斯NB(分类)(生成)
优点
稳定的分类效率
对小规模数据表现很好,能处理多分类任务,适合增量式训练
对缺失数据不太敏感,算法较简单,多用于文本分类
如果满足条件独立假设,NB的收敛速度将快于判别模型如LR,所以只需要少量数据,即使NB条件独立假设不独立,仍然表现很出色。
缺点
需要计算先验概率
分类决策存在错误率
对输入数据的表达形式很敏感
(不能学习出特征间的相互作用)
逻辑回归(分类)(判别)
伯努利分布
有很多正则化模型的方法L0,L1,L2等
优点
实现简单
分类时计算量小,速度快,存储资源少
便利的观测样本概率分布
问题
可以简单的用L2正则解决多重共线性
缺点
特征空间很大时,逻辑回归性能不太好
容易欠拟合,一般准确率不会太高
不能很好地处理多特征
只能处理二分类(softmax可用于多分类),且必须线性可分。
对于非线性特征,需要进行转换(如核函数)
如果想处理多分类
可以对每个类别都建立一个二分类器,带有这个类别的样本标记1,不带的标记0。
softmax回归,即修改LR的损失函数,让其适合多酚类问题,不只考虑1-0的损失,考虑每个样本标记的损失,并且把激活函数替换为softmax函数。
线性回归(回归)(判别)
高斯分布
基本思想是用梯度下降法对最想二乘法形式的误差函数进行优化,也可以用normal
equation直接求解:
LWLR(局部加权线性回归)
优点
- 实现简单,计算简单
缺点
- 不能拟合非线性数据
GBDT梯度提升决策树(回归)
优点
可以灵活处理各种类型的数据,包括连续值和离散值。
在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如
Huber损失函数和Quantile损失函数。
缺点:
- 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的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(D∣A)
经验熵减去条件经验熵
信息增益比: 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算法提供的是框架;
• 当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单;
• 不用做特征筛选;
• 不用担心过拟合;
缺点:
对异常值敏感;