机器学习中的分类算法之性能优劣


  • 1. normal_bayes_classifier 朴素贝叶斯分类

OpenCV最简单的监督学习分类器

这个分类器模型是建立在每一个类别的特征向量服从正态分布的基础上的(据说不满足独立分布,效果也很好)。

整个分布函数被假设为一个高斯分布,每一类别一组系数。当给定了训练数据,算法将会估计每一个类别的向量均值和方差矩阵,然后根据这些进行预测。

特点:如果没有很多数据,该模型会比很多复杂的模型获得更好的性能,因为复杂的模型用了太多假设,以致产生欠拟合。

附贝叶斯公式:<img src="https://pic3.zhimg.com/6348cc328887446a368ec3b6d85c94fa_b.png" data-rawwidth="428" data-rawheight="200" class="origin_image zh-lightbox-thumb" width="428" data-original="https://pic3.zhimg.com/6348cc328887446a368ec3b6d85c94fa_r.png">机器学习中的分类算法之性能优劣_第1张图片



  • 2. k_nearest_neighbors(KNN) K近邻

这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本周围K个最近邻,然后把新样本标记为在K近邻点中频率最高的类。

这种方法有时候被称作“基于样本的学习”,即为了预测,我们对于给定的输入搜索最近的已知其相应的特征向量。

特点:简单有效,但因为需要存储所有的训练集,占用很大内存,速度比较慢。使用该方法前通常训练集聚类来降低数据大小。


  • 3. support_vector_machines(SVM)支持向量机

SVM是一种基于核函数的方法,它通过某些核函数把特征向量映射到高维空间(一般情况下高维空间上比低维空间上更加线性可分),然后建立一个线性判别函数(或者说是一个高维空间中的能够区分训练数据的最优超平面)。

解是最优的在某种意义上是两类中距离分割面最近的特征向量和分割面的距离最大化。离分割面最近的特征向量被称为”支持向量”,意即其它向量不影响分割面(决策函数)。

注:

1. 当数据集合比较小的时候,支持向量机的效果常常最好。

2. 对于核来说,不仅仅只存在于 SVM 内,对于任意的算法,只要计算时出现了内积的,都可以用核函数替代,从而提高在高维数据上的性能。


  • 4. decision_trees 决策树

决策树是一个二叉树。当每个叶节点用类别标识(多个叶子可能有相同的标识)时,它可以表示分类树;当每个叶节点被分配了一个常量(所以回归函数是分段常量)时,决策树就成了回归树

决策树是从根结点递归构造的。用所有的训练数据(特征向量和对应的响应)来在根结点处进行分裂。在每个结点处,优化准则(比如最优分裂)是基于一些基本原则来确定的(比如ML中的“纯度purity”原则被用来进行分类,方差之和用来进行回归)。所有的数据根据初始和替代分裂点来划分给左右子结点(就像在预测算法里做的一样)。然后算法回归的继续分裂左右子结点。在以下情况下算法可能会在某个结点停止:

a) 树的深度达到了指定的最大值

b) 在该结点训练样本的数目少于指定值,比如,没有统计意义上的集合来进一步进行结点分裂了。

c) 在该结点所有的样本属于同一类(或者,如果是回归的话,变化已经非常小了)

d) 跟随机选择相比,能选择到的最好的分裂已经基本没有什么有意义的改进了。

决策树自身的优点:

a) 计算简单,易于理解;

b) 适应不同的数据类型(包括类别数据,数值数据,未归一化的和混合的数据);

c) 比较适合处理有缺失属性的样本;

d) 通过分裂的顺序给数据特征赋不同的重要性;

e) 能够处理不相关的特征;

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

g) 决策树构成了其他算法的基础(如boosting和随机数)。

决策树的缺点:

a) 容易发生过拟合(随即森林可以很大程度上减少过拟合);

b) 忽略了数据之间的相关性;

c) 对于那些,各类别样本数量不一致的数据,在决策树中,信息增益的结果偏向于那些具有更多数值的特征(只要使用了信息增益,都有这个特点,如RF)



  • 5. boosting

Boosting 是个非常强大的学习方法, 它也是一个监督的分类学习方法。它组合许多“弱”分类器来产生一个强大的分类器组。一个弱分类器的性能只是比随机选择好一点,因此它可以被设计的非常简单并且不会有太大的计算花费。将很多弱分类器结合起来组成一个集成的强分类器。

boosting分类器和随机森林在内部使用了决策树,所以继承了决策树的很多有用的性质(能够处理混合数据模型、没有归一化的数据、特征丢失)。

AdaBoost算法如下:

1. 给定N样本 (xi,yi) 其中

2. 初始化权值

3. 重复 for m = 1,2,…,M:

a) 根据每个训练数据的wi计算。

b) 计算

c) 更新权值

并归一化使 Σiwi = 1.

4. 输出分类器

.

优点:

简单,不容易发生过拟合,不用做特征筛选。

注:opencv执行的boosting算法是一个两类分类器(不像决策树和随机森林)



  • 6. random_trees 随机森林

随机森林既可以解决回归问题,也可以解决分类问题。

随机森林可以通过收集很多树的子节点对各个类别投票,然后选择获得最多投票的类别作为判断结果。通过计算”森林“的所有子节点的值的平均值来解决回归问题。

随机森林建立时的基本子系统也是决策树。在建立决策树时会一直继续下去直到数据纯净。因此,尽管每个树都很好的学习了训练数据,但各个树之间仍有很大不同。我们把这些树放到一起求平均以消除这些不同(因此叫随机森林)。

当然,如果所有的树都相同,随机森林也没有很大作用。为了克服这点,随机森林通过在树的建立过程中,随机选择特征子集来使各个树不同。例如,一个目标识别树可以有很多可能的特征:颜色,质地,倾斜度等。树的每个节点可以从这些特征中随机的选择子集,来决定怎样更好地分裂数据。每个后来的节点都获得新的、随机选择的特征子集。

优点:

与boosting和决策树相比,随机森林可以使用更少的重要变量,获得最好的预测性能。即我们可以收缩特征集的大小,在不损失性能的前提下减少计算量和内存使用随机森林。



  • 7. neural_networks 神经网络

神经网络是对非线性可分数据的分类方法。

与输入直接相连的称为隐藏层( hidden layer),与输出直接相连的称为输出层(output layer)。

神经网络算法的一大特点就在于不知道隐藏层计算的东西的意义;另一个特点在于神经网络有比较多的局部最优值,可以通过多次随机设定初始值然后运行梯度下降算法获得最优值。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


训练集有多大?

如果你的训练集很小,高偏差/低方差的分类器(如朴素贝叶斯)比低偏差/高方差的分类器(如K近邻或Logistic回归)更有优势,因为后者容易过拟合。但是随着训练集的增大,高偏差的分类器并不能训练出非常准确的模型,所以低偏差/高方差的分类器会胜出(它们有更小的渐近误差)。

你也可以从生成模型与鉴别模型的区别来考虑它们。

某些分类器的优势

朴素贝叶斯(Naive Bayes, NB)

超级简单,就像做一些数数的工作。如果条件独立假设成立的话,NB将比鉴别模型(如Logistic回归)收敛的更快,所以你只需要少量的训练数据。即使条件独立假设不成立,NB在实际中仍然表现出惊人的好。如果你想做类似半监督学习,或者是既要模型简单又要性能好,NB值得尝试。

Logistic回归(Logistic Regression, LR)
LR有很多方法来对模型正则化。比起NB的条件独立性假设,LR不需要考虑样本是否是相关的。与决策树与支持向量机(SVM)不同,NB有很好的概率解释,且很容易利用新的训练数据来更新模型(使用在线梯度下降法)。如果你想要一些概率信息(如,为了更容易的调整分类阈值,得到分类的不确定性,得到置信区间),或者希望将来有更多数据时能方便的更新改进模型,LR是值得使用的。

决策树(Decision Tree, DT)
DT容易理解与解释(对某些人而言——不确定我是否也在他们其中)。DT是非参数的,所以你不需要担心野点(或离群点)和数据是否线性可分的问题(例如,DT可以轻松的处理这种情况:属于A类的样本的特征x取值往往非常小或者非常大,而属于B类的样本的特征x取值在中间范围)。DT的主要缺点是容易过拟合,这也正是随机森林(Random Forest, RF)(或者Boosted树)等集成学习算法被提出来的原因。此外,RF在很多分类问题中经常表现得最好(我个人相信一般比SVM稍好),且速度快可扩展,也不像SVM那样需要调整大量的参数,所以最近RF是一个非常流行的算法。

支持向量机(Support Vector Machine, SVM)
很高的分类正确率,对过拟合有很好的理论保证,选取合适的核函数,面对特征线性不可分的问题也可以表现得很好。SVM在维数通常很高的文本分类中非常的流行。由于较大的内存需求和繁琐的调参,我认为RF已经开始威胁其地位了。

回到LR与DT的问题(我更倾向是LR与RF的问题),做个简单的总结:两种方法都很快且可扩展。在正确率方面,RF比LR更优。但是LR可以在线更新且提供有用的概率信息。鉴于你在Square(不确定推断科学家是什么,应该不是有趣的化身),可能从事欺诈检测:如果你想快速的调整阈值来改变假阳性率与假阴性率,分类结果中包含概率信息将很有帮助。无论你选择什么算法,如果你的各类样本数量是不均衡的(在欺诈检测中经常发生),你需要重新采样各类数据或者调整你的误差度量方法来使各类更均衡。

但是。。。

更好的数据往往比更好的算法更重要,提取好的特征也需要很大的功夫。如果你的数据集非常大,那么分类算法的选择可能对最后的分类性能影响并不大(所以可以根据运行速度或者易用性来选择)。

如果你很在意分类的正确率,那么你得尝试多种分类器,根据交叉验证的结果来挑选性能最好的。或者,学习下Netflix Prize和Middle Earth, 使用某种集成的方法来组合多个分类器。

你可能感兴趣的:(机器学习,机器学习,算法,性能)