机器学习算法优缺点总结

一、最近邻算法(KNN)

  1. 概述
      KNN将测试集的数据特征与训练集的数据进行特征比较,然后算法提取样本集中特征最近邻数据的分类标签,即KNN算法采用测量不同特征值之间的距离的方法进行分类。KNN的思路很简单,就是计算测试数据与类别中心的距离。KNN具有精度高、对异常值不敏感、无数据输入假定、简单有效的特点,但其缺点也很明显,计算复杂度太高。要分类一个数据,却要计算所有数据,这在大数据的环境下是很可怕的事情。而且,当类别存在范围重叠时,KNN分类的精度也不太高。所以,KNN比较适合小量数据且精度要求不高的数据。
      KNN有两个影响分类结果较大的函数,一个是数据归一化,一个是距离计算。如果数据不进行归一化,当多个特征的值域差别很大的时候,最终结果就会受到较大影响;第二个是距离计算。这应该算是KNN的核心了。目前用的最多的距离计算公式是欧几里得距离,也就是我们常用的向量距离计算方法。
      个人感觉,KNN最大的作用是可以随时间序列计算,即样本不能一次性获取只能随着时间一个一个得到的时候,KNN能发挥它的价值。至于其他的特点,它能做的,很多方法都能做;其他能做的它却做不了

    KNN 的主要过程如下:
    Step 1: 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等) ;
    Step 2: 对上面所有的距离值进行排序;
    Step 3: 选前 k 个最小距离的样本;
    Step 4: 根据这 k 个样本的标签进行投票,得到最后的分类类别;

      如何选择一个最佳的 K 值,这取决于数据。一般情况下,在分类时较大的 K 值能够减
    小噪声的影响。但会使类别之间的界限变得模糊。一个较好的 K 值可通过各种启发式技术
    来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使 K 近邻算法的准确性
    减小。
      近邻算法具有较强的一致性结果。 随着数据趋于无限, 算法保证错误率不会超过贝叶斯
    算法错误率的两倍。对于一些好的 K 值, K 近邻保证错误率不会超过贝叶斯理论误差率。

  2. 优点
    (1) 理论成熟,思想简单,既可以用来做分类也可以用来做回归;
    (2) 可用于非线性分类;
    (3) 训练时间复杂度为 O(n);
    (4) 对数据没有假设,准确度高,对 outlier 不敏感;
    (5) KNN 是一种在线技术,新数据可以直接加入数据集而不必进行重新训练

  3. 缺点
    (1) 对于样本容量大的数据集计算量比较大。
    (2) 样本不平衡时, 预测偏差比较大。 如: 某一类的样本比较少, 而其它类样本比较多。
    (3) KNN 每一次分类都会重新进行一次全局运算。
    (4) k 值大小的选择。
    (5) 需要大量的内存;

  4. 应用领域
    文本分类、模式识别、聚类分析,多分类领域

二、朴素贝叶斯

  1. 概述
      朴素贝叶斯属于生成式模型 (关于生成模型和判别式模型, 主要还是在于是否是要求联合分布),非常简单,你只是做了一堆计数。如果注有条件独立性假设(一个比较严格的条件),朴素贝叶斯分类器的收敛速度将快于判别模型,如逻辑回归,所以你只需要较少的训练数据即可。即使 NB 条件独立假设不成立, NB 分类器在实践中仍然表现的很出色。 它的主要缺点是它不能学习特征间的相互作用,用 mRMR 中 R 来讲, 就是特征冗余。 引用一个比较经典的例子, 比如, 虽然你喜欢 Brad Pitt和 Tom Cruise 的电影,但是它不能学习出你不喜欢他们在一起演的电影。

  2. 优点:
    (1) 朴素贝叶斯模型发源于古典数学理论, 有着坚实的数学基础, 以及稳定的分类效率;
    (2) 对小规模的数据表现很好,能个处理多分类任务;
    (3) 对缺失数据不太敏感,算法也比较简单,常用于文本分类;
    (4) 对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数, 并且对项目的训练和分类也仅仅是特征概率的数学运算而已;
    (5) 支持增量式运算。即可以实时的对新增的样本进行训练;
    (6) 朴素贝叶斯对结果解释容易理解。

  3. 缺点:
    (1) 需要计算先验概率;
    (2) 分类决策存在错误率;
    (3) 对输入数据的表达形式很敏感。
    (4) 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。

  4. 应用领域
    文本分类、欺诈检测中使用较多

三、决策树(Decision Tree )

  1. 概述
      决策树是最简单,也是曾经最常用的分类方法了。决策树基于树理论实现数据分类,个人感觉就是数据结构中的B+树。决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。决策树计算复杂度不高、输出结果易于理解、对中间值缺失不敏感、可以处理不相关特征数据。其比KNN好的是可以了解数据的内在含义。但其缺点是容易产生过度匹配的问题,且构建很耗时。决策树还有一个问题就是,如果不绘制树结构,分类细节很难明白。所以,生成决策树,然后再绘制决策树,最后再分类,才能更好的了解数据的分类过程。
      决策树的核心树的分裂。到底该选择什么来决定树的分叉是决策树构建的基础。最好的方法是利用信息熵实现。熵这个概念很头疼,很容易让人迷糊,简单来说就是信息的复杂程度。信息越多,熵越高。所以决策树的核心是通过计算信息熵划分数据集。
      决策树中很重要的一点就是选择一个属性进行分枝, 因此要注意一下信息增益的计算公式,并深入理解它。信息熵的计算公式中的 n 代表有 n 个分类类别(比如假设是 2 类问题,那么 n=2)。分别计算这 2 类样本在总样本中出现的概率 p1和 p2,这样就可以计算出未选中属性分枝前的信息熵。现在选中一个属性 xi用来进行分枝,此时分枝规则是:如xi=v的话,将样本分到树的一个分支;如果不相等则进入另一个分支。很显然,分支中的样本很有可能包括 2个类别,分别计算这 2 个分支的熵 H1 和 H2,计算出分枝后的总信息熵 H’ =p1H1+p2 H2,则此时的信息增益 ΔH = H - H ’ 。以信息增益为原则,把所有的属性都测试一边,选择一个使
    增益最大的属性作为本次分枝属性。

  2. 优点:
    (1) 易于理解和解释,可以可视化分析,容易提取出规则。
    (2)在相对短的时间内 能够对大型数据源做出可行且效果良好的结果。
    (3) 可以同时处理标称型和数值型数据。
    (4) 比较适合处理有缺失属性的样本;
    (6) 测试数据集时,运行速度比较快。
    (7) 能够处理不相关的特征;
    (8) 它可以毫无压力地处理特征间的交互关系并且是非参数化的, 因此你不必担心异常值或者数据是否线性可分
    (9) 决策树可以很好的扩展到大型数据库中,同时它的大小独立于数据库大小。

  3. 缺点
    (1) 对缺失数据处理比较困难。
    (2) 容易出现过拟合问题 , 但这也就是诸如随机森林 RF(或提升树 boosted tree) 之类的集成方法的切入点。 另外, 随机森林经常是很多分类问题的赢家 (通常比支持向量机好上那么一丁点) ,它训练快速并且可调,同时你无须担心要像支持向量机那样调一大堆参数,所以在以前都一直很受欢迎。
    (3) 忽略数据集中属性的相互关联。
    (4) ID3 算法计算信息增益时结果偏向数值比较多的特征(随机森林可以很大程度上减少过拟合) ;
    (5) 不支持在线学习,于是在新样本到来后,决策树需要全部重建。
    改进措施
    (1) 对决策树进行剪枝。可以采用交叉验证法和加入正则化的方法。
    (2) 使用基于决策树的 Combination 算法,如 Bagging 算法, Random Forest 算法,可以解决过拟合的问题

  4. 应用领域
    企业管理实践,企业投资决策,由于决策树很好的分析能力,在决策过程应用较多。

四、逻辑斯蒂回归( Logistic Regression )

  1. 概述
      该方法计算代价不高,易于理解和实现,而且大部分时间用于训练,训练完成后分类很快;但它容易欠拟合,分类精度也不高。主要原因就是Logistic主要是线性拟合,但现实中很多事物都不满足线性的。即便有二次拟合、三次拟合等曲线拟合,也只能满足小部分数据,而无法适应绝大多数数据,所以回归方法本身就具有局限性。
      Logistic回归其实是基于一种曲线的,“线”这种连续的表示方法有一个很大的问题,就是在表示跳变数据时会产生“阶跃”的现象,说白了就是很难表示数据的突然转折。所以用Logistic回归必须使用一个称为“海维塞德阶跃函数”的Sigmoid函数来表示跳变。通过Sigmoid就可以得到分类的结果。
      为了优化Logistic回归参数,需要使用一种“梯度上升法”的优化方法。该方法的核心是,只要沿着函数的梯度方向搜寻,就可以找到函数的最佳参数。但该方法在每次更新回归系数时都需要遍历整个数据集,对于大数据效果还不理想。所以还需要一个“随机梯度上升算法”对其进行改进。该方法一次仅用一个样本点来更新回归系数,所以效率要高得多。
      属于判别式模型,有很多正则化模型的方法( L0, L1, L2, etc),而且你不必像在用朴素贝叶斯那样担心你的特征是否相关。与决策树与 SVM 机相比,你还会得到一个不错的概率解释,你甚至可以轻松地利用新数据来更新模型(使用在线梯度下降算法, online gradient descent)。如果你需要一个概率架构(比如,简单地调节分类阈值,指明不确定性,或者是要获得置信区间) ,或者你希望以后将更多的训练数据快速整合到模型中去,那么使用它吧。

  在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:
  0. 离散特征的增加和减少都很容易,易于模型的快速迭代;
  1. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  2. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  3. 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
  4. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  5. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
  6. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。
  李沐曾经说过:模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。就看是喜欢折腾特征还是折腾模型了。通常来说,前者容易,而且可以n个人一起并行做,有成功经验;后者目前看很赞,能走多远还须拭目以待。

  1. 优点:
    (1) 实现简单,广泛的应用于工业问题上;
    (2) 分类时计算量非常小,速度很快,存储资源低;
    (3) 便利的观测样本概率分数;
    (4) 对逻辑回归而言,多重共线性并不是问题,它可以结合 L2 正则化来解决该问题;

  2. 缺点:
    (1) 特征空间很大时,逻辑回归的性能不是很好;
    (2) 容易欠拟合,分类精度不高。
    (3) 不能很好地处理大量多类特征或变量;
    (4) 只能处理两分类问题 (在此基础上衍生出来的 softmax 可以用于多分类) , 且必须线性可分(对于非线性特征,需要进行转换)

  3. 应用领域
    用于二分类领域,可以得出概率值,适用于根据分类概率排名的领域,如搜索排名等。Logistic 回归的扩展 softmax 可以应用于多分类领域,如手写字识别等。

五、 SVM 支持向量机

  1. 概述
      SVM也叫支持向量机,其把数据映射到多维空间中以点的形式存在,然后找到能够分类的最优超平面,最后根据这个平面来分类。SVM能对训练集之外的数据做很好的预测、泛化错误率低、计算开销小、结果易解释,但其对参数调节和核函数的参数过于敏感。个人感觉SVM是二分类的最好的方法,但也仅限于二分类。如果要使用SVM进行多分类,也是在向量空间中实现多次二分类。
      SVM有一个核心函数SMO,也就是序列最小最优化算法。SMO基本是最快的二次规划优化算法,其核心就是找到最优参数α,计算超平面后进行分类。SMO方法可以将大优化问题分解为多个小优化问题求解,大大简化求解过程。某些条件下,把原始的约束问题通过拉格朗日函数转化为无约束问题,如果原始问题求解棘手,在满足KKT的条件下用求解对偶问题来代替求解原始问题,使得问题求解更加容易。 SVM还有一个重要函数是核函数。核函数的主要作用是将数据从低位空间映射到高维空间。详细的内容我就不说了,因为内容实在太多了。总之,核函数可以很好的解决数据的非线性问题,而无需考虑映射过程。
      高准确率,为避免过拟合提供了很好的理论保证, 而且就算数据在原特征空间线性不可分, 只要给个合适的核函数, 它就能运行得很好。 在动辄超高维的文本分类问题中特别受欢迎。可惜内存消耗大,难以解释,运行和调参也有些烦人,而随机森林却刚好避开了这些缺点,比较实用。

  2. 优点
    (1) 可以解决高维问题,即大型特征空间;
    (2) 能够处理非线性特征的相互作用;
    (3) 解决小样本下机器学习问题。
    (4) 无需依赖整个数据;
    (5) 泛化能力比较强。

  3. 缺点
    (1) 当观测样本很多时,效率并不是很高 (大样本反而不合适 )
    (2) 对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数;
    (3) 对缺失数据敏感;
      对于核的选择也是有技巧的( libsvm 中自带了四种核函数:线性核、多项式核、 RBF 以及 sigmoid 核):第一,如果样本数量小于特征数,没必要选择非线性核,使用线性核就可以;第二,如果样本数量大于特征数目,这时可以使用非线性核,将样本映射到更高维度,一般可以得到更好的结果;第三,如果样本数目和特征数目相等,该情况可以使用非线性核,原理和第二种一样。对于第一种情况,也可以先对数据进行降维,然后使用非线性核,这也是一种方法。

  4. SVM 应用领域
    文本分类、图像识别、主要二分类领域

六、 Adaboost

  1. 概述
      Adaboost 是一种加和模型, 每个模型都是基于上一次模型的错误率来建立的, 过分关注
    分错的样本, 而对正确分类的样本减少关注度, 逐次迭代之后, 可以得到一个相对较好的模
    型。是一种典型的 boosting 算法。

  2. 优点
    (1) 具有很高精度
    (2) 简单,不用做特征筛选。
    (3) 很好的利用了弱分类器进行级联,可以将不同的分类算法作为弱分类器, Adaboost
    算法提供的是框架 ;
    (4) 当使用简单分类器时, 计算出的结果是可以理解的, 并且弱分类器的构造极其简单 ;
    (5) 不容易发生 overfitting 。
    (6) 相对于 bagging 算法和 Random Forest 算法, AdaBoost 充分考虑的每个分类器的权
    重。

  3. 缺点:
    对 outlier 比较敏感
    AdaBoost 迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。
    数据不平衡导致分类精度下降。
    训练比较耗时,每次重新选择当前分类器最好切分点。

  4. 应用领域
    模式识别、计算机视觉领域,用于二分类和多分类场景

七、K-Means聚类

  1. 概述
    k-means算法是一种典型的基于距离的算法,它以距离作为评价相似度的指标。两个对象的距离越近,则相似度也就越大。
    其算法步骤如下:
    1.随机选取K个聚类中心点。基于这k个中心点计算每个对象到中心点的距离,并将对象划分成其离最短的那个中心点的那一个类别,也就是第一轮迭代就根据选取的中心点将对象划分成了k类。
    2.对每一个类重新计算中心点,也就是中心点根据上一轮迭代的类别进行重算,得到新的k个中心点。
    3.基于新的中心点,开始新的聚类迭代,重新计算每个对象离中心点的距离,并划分成最短距离的中心点所对应的类别。
    4.重复第2和第3步,直到新的中心点与原来的中心点相等或者小于指定的阈值。

  2. 特点
    1、k值必须给定
    进行k-means算法时,必须指定聚类数量。但是有时候我们并不知道应该聚成多少个类,而是希望算法可以给出一个合理的聚类数量,往往一开始k值很难预先估计并给定。
    2、随机的k个中心点影响结果
    在k-means算法中,一开始的k个中心点是随机选定的,在后面的迭代中再进行重算,直到收敛。但是根据算法的步骤不难看出,这样一来最后所生成的结果往往很大程度上取决于一开始K个中心点的位置。这样一来,也就意味着结果具备很大的随机性,每次计算结果都会因为初始随机选择的中心质点不一样而导致结果不一样。
    3.计算性能
    该算法需要不断的对对象进行分类调整,不断的计算调整后新的聚类中心点,因此当数据量非常大时,算法的时间开销是非常大的。
    关于K-Means聚类的文章,链接:机器学习算法-K-means聚类。关于K-Means的推导,里面有着很强大的EM思想。

  3. 优点
    算法简单,容易实现 ;
    对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常 k << n ,这个算法通常局部收敛。
    算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。

  4. 缺点
    对数据类型要求较高,适合数值型数据;
    可能收敛到局部最小值,在大规模数据上收敛较慢
    K值比较难以选取;
    对初值的簇心值敏感,对于不同的初始值,可能会导致不同的聚类结果;
    不适合于发现非凸面形状的簇,或者大小差别很大的簇。
    对于”噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。

八、随机森林数算法

  1. 概述
    随机森林是一个用随机方式建立的,包含多个决策树的分类器。其输出的类别是由各个树输出的类别的众数而定。
    随机性主要体现在两个方面:(1)训练每棵树时,从全部训练样本(样本数为N)中选取一个可能有重复的大小同样为 N的数据集进行训练(即bootstrap取样);(2)在每个节点,随机选取所有特征的一个子集,用来计算最佳分割方式

    算法步骤如下:
    a).假设我们设定训练集中的样本个数为N,然后通过有放回的重复多次抽样来获得这N个样本, 这样的抽样结果将作为我们生成决策树的训练集;
    b).如果有M个输入变量,每个节点都将随机选择 m ( m < M ) 个特定的变量,然后运用这m个变量来确定最佳的分裂点。在决策树的生成过程中,m的值是保持不变的;
    c).一直到不能够再分裂为止,每棵决策树都最大可能地进行生长而不进行剪枝;
    d).按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
    e).通过对所有的决策树进行加总来预测新的数据(在分类时采用多数投票,在回归时采用平均)。

  2. 优点
    a)正如上文所述,随机森林算法能解决分类与回归两种类型的问题,并在这两个方面都有相当好的估计表现;
    b)它能够处理很高维度(feature很多)的数据,并且不用做特征选择,随机森林对于高维数据集的处理能力令人兴奋,它可以处理成千上万的输入变量,并确定最重要的变量,因此被认为是一个不错的降维方法。此外,该模型能够输出变量的重要性程度,这是一个非常便利的功能。
    c)如果有很大一部分的特征遗失,仍可以维持准确度。在对缺失数据进行估计时,随机森林是一个十分有效的方法。就算存在大量的数据缺失,随机森林也能较好地保持精确性;
    d)对于不平衡的数据集来说,它可以平衡误差。即当存在分类不平衡的情况时,随机森林能够提供平衡数据集误差的有效方法;
    e)模型的上述性能可以被扩展运用到未标记的数据集中,用于引导无监督聚类、数据透视和异常检测;
    f)在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强
    g)训练速度快,容易做成并行化方法

  3. 缺点
    a)随机森林在解决回归问题时并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续型的输出。当进行回归时,随机森林不能够作出超越训练集数据范围的预测,这可能导致在对某些还有特定噪声的数据进行建模时出现过度拟合。
    b)对于许多统计建模者来说,随机森林给人的感觉像是一个黑盒子——你几乎无法控制模型内部的运行,只能在不同的参数和随机种子之间进行尝试。
    c)随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟
    d)对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

  4. 几个注意的点
    a) 随机森林有2个参数需要人为控制,一个是森林中树的数量,一般建议取很大。另一个是m的大小,推荐m的值为M的均方根。
    b)随机森林:之前的两个随机采样(行和列)的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。【单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。

决策树中C4.5算法

C4.5算法的核心思想是ID3算法,是ID3算法的改进:
用信息增益率来选择属性,克服了用信息增益来选择属性时变相选择取值多的属性的不足;
在树的构造过程中进行剪枝;
能处理非离散化数据;
能处理不完整数据。
优点:

产生的分类规则易于理解,准确率高。
缺点:
在构造过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效;
C4.5算法只适合于能够驻留内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。

猜你喜欢

转载自blog.csdn.net/qq_26598445/article/details/80866938