@[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。link1、link2
而另一个文本情绪分类更关心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