传统机器学习算法-分类算法比较

806 阅读8分钟

@[TOC]

引言

如果精度很重要,最好的办法应该是一个一个的尝试,调整参数,选择最好的。
如果时间有限,那就要根据不同算法的特点,先尝试最有可能的。
如果精度要求差不多就可以,直接按照特定要求选择最好的。

n个数据、d维度、分成m类别。

朴素贝叶斯

  首先说一下偏差和方差理论,通常认为模型的error=bias+var 偏差往往是由模型复杂度较小,欠拟合带来的,方差是由于模型过拟合带来的。对于小数据集,用复杂的模型容易过拟合,所以用简单一点的模型如贝叶斯比较好,这就是所谓的小数据集使用高偏差/低方差分类器link

算法朴素贝叶斯 (可多分类)
训练时间O(n*d) :在每个数据每个维度计算后验概率
预测时间O(m*d):不同类别,遍历每个特征相应的后验概率,速度算快
样本需求1. 假设特征之间不相关,无法学习这样的知识:
(一个人可能喜欢成龙也喜欢爱情片 却不喜欢成龙参演的爱情片 )
2. 样本特征关联时效果不好,模型简单复杂的情况效果就不好
3. 特征独立时,效果可能比LR还好
4.可以人为去掉相关特征呀

5.模型不复杂,可以处理小样本数据

6. 注意平滑,要不然数据集未出现过的类别,怎么都是0
7.连续特征要转化成高斯分布,因为后面计算后验概率是假设其为高斯分布的
8. 文本分类要选择合适的NB以及相应的文本预处理方式
参数
过拟合模型简单不容易过拟合
解释性容易理解,就是概率模型,应该没什么必要可视化
应用场景文本分类(文本情感分类积极/消极 文章属于政治/体育/科技 是否为垃圾邮件)
多分类实时预测
推荐系统(感觉和多分类实时有密切关系)

  西瓜书看到的NB都是离散变量,如果有连续变量就要正态分布后用高斯分布的NB。

  全是离散变量的情况会出现在文本分类(非情绪)。对于一个词袋模型(特征是不同单词,具体值就是出现在文本的次数)。这个时候想要用NB关键是算后验概率,显然这和纯类别的计算不同,有自己的算法(见例子China)。这时应该使用多项式分布的NB。link1link2

  而另一个文本情绪分类更关心bad出没出现而不是频数。特征集还是出现过的单词组称单词表,用0/1表示出没出现过。这样计算后验概率就像所有特征都是二分类一样来计算就可以了,垃圾邮件的分类和文本情感分类很像。

SVM

算法SVM
训练时间众说纷纭 n方差不多
预测时间支持向量个数d(贝叶斯是类别个数d 大概率贝叶斯时间更短)
按照这里的说法是因为使用核函数才需要保存支持向量
样本需求1. 显然大样本训练很麻烦
2. 不是线性可分的显然要用核函数
3. 对于离散变量用哑变量(独热码减少一个维度)
4.特征数量比样本多很多时,效果不好
5.特征数量比较少1-1000的时候,样本10000左右 带核SVM;样本50000+ 不带核SVM/LR

我倾向(特征数量比较少1-1000的时候,样本10000左右 带核SVM)这个时候尝试,
样本再少的话,直接上贝叶斯
参数核函数 和 软间隔的惩罚系数(实际用sk-learn参数很多,网格调参)
过拟合容易过拟合,要靠调参缓解
解释性应该是线性核有好的解释性,参数越大影响越大。其它核解释性不好
应用场景找不到特别好的应用场景(说明没什么特别好的特点,那就是普通的二分类任务)
  • SVM和LR放在一起比较,都是线性模型。LR的决策边界是线性的。
  • 都是判别式模型(我的理解判别式模型,直接算出后验概率)
  • 生成模型如贝叶斯,借助贝叶斯公式迂回算后验概率,然后不同类别生成多个模型,最后论断要多个模型判别多个类别进行比较。

决策树

算法决策树(可多分类,因为选择特征节点的时候显然可以算出“熵增益”)
训练时间O(nd*树深) 树深=log(n) :贝叶斯是nd,也就是比贝叶斯略大
预测时间O(树深)树深=log(n)
样本需求1. 不对数据有分布假设,所以不必搞成高斯分布
2. 噪声在节点处划分,像分箱就好处理,如果恰好是节点阈值就麻烦了
3. 冗余属性(特征间相关)影响较小,假设AB两属性相关,先A划分之后,在子树中B就不会是一个很好的划分特征了(再用B划分,增益会变小,因为增益差让A用了),但是也容易造成过拟合吧,毕竟后续可能还要用这个属性
4.不相关属性(和目标不相关的属性)影响较大,因为他们往往是在书的结尾靠近叶节点开始分支,很容易过拟合
5.约接近叶节点,样本越少,数据不够,容易过拟合

上面三点都应该控制深度剪枝来解决(冗余属性,不相关属性,少样本)
参数前剪枝和后剪枝
过拟合复杂度肯定足够才可以用在大数据集上,中等数据集也可。
过拟合往往体现在叶节点附近,可以通过剪枝减少。
解释性良好解释性
应用场景快速分析,解释性好,可用在中大数据集。

KNN

算法KNN(显然可多分类)
训练时间不用训练直接保存数据
预测时间O(nd)
样本需求1. 对异常值不敏感,邻居有坏蛋,但是是民主投票
2. 存储大
3. 预测慢,预测赶上贝叶斯训练了
4.样本不平衡时,少量样本基本很难预测的到
参数邻居数量 距离衡量方式
过拟合一般和邻居数即k值有关,准确率先下后上。
解释性就是离得近分一类,解释性到不差。
应用场景应该只能分析用一下,实时性和长期存储都不靠谱。

LR

算法LR(softmax就可以多分类)
训练时间O(ncl):n是样本数量,l是迭代次数,c是单个样本计算量(包括反向传播过程)
考虑到迭代次数应该比特征数d大,所以ncl应该是大于nd的
预测时间O(d)
样本需求1. 特征相关会让模型不稳定,相关特征一个5一个10 和10,5是一样点
2. 要求线性可分(是一个线性分类器)这个限制了它的精度
参数学习率 损失函数 正则化之类的
过拟合复杂度肯定比NB强,所以才会使用中样本。
但是在大样本中,它毕竟是一个线性分类器,能力有上限,这时会欠拟合。
又不能用SVM核函数的方法,所以时常考虑和SVM作比较。
解释性解释性良好。
应用场景解释性好,肯定是更高级的分析。
时间内存都可以商量(不像KNN)而且应用也不差,六边形战士。
  • 所以到了这里,样本少用NB KNN
  • 样本中多,用DT SVM LR

随机森林RF

算法随机森林 (DT可多分类,RF自然多分类)
训练时间O(k×nd×树深) 树深=log(n) 决策树复杂度*k 可并行运算
预测时间O(k×树深)树深=log(n) 决策树复杂度*k 可并行运算
样本需求1. 决策树没有先验分布要求,那RF也没有
2. 对于特征特别多可以用,因为会给子树特征的子集
3.缺省也可以处理,但是还是先处理一下数据再跑baseline应该
参数前后剪枝,树的数量,投票方式没准还要stacking
过拟合肯定泛化能力足够好,但是没有调整的意义啊,对吧。
顶天开始给一个合适的决策树的参数,有一个baseline就好了。
解释性不好,单个树可以理解,但多个树去解释就很别扭。
应用场景工业和比赛都很少应用
可以理解,因为光部署就不可能部署好几十个树
但因为集成,泛化能力又比较强,所以用来做baseline不错

Adaboost

算法Adaboost (DT可多分类,自然多分类)
训练时间应该同随机森林(如果用树)O(k×nd×树深) 树深=log(n) 但不可并行
预测时间应该同随机森林(如果用树)O(k×树深)树深=log(n) 但不可并行
样本需求没什么额外需求
参数能改的只有基学习器参数,基学习器个数,没有其他参数可以调节了
过拟合adaboost比它的基学习器容易拟合。
但用如树的简单基学习器,实际应用往往很难过拟合。
解释性没什么好解释的,baseline的命。
应用场景也逃不过用来做baseline。

GBDT

pass