常见数据挖掘算法分析

  • 概述

    • 一般认为,数据挖掘领域所使用的方法均属于机器学习算法、深度学习算法和数据挖掘算法
    • 一般认为,数据挖掘领域的问题主要有分类、回归、聚类、推荐、图像识别、预测
    • 一般认为,数据挖掘领域所牵扯到的底层知识有“概率论”、“数论”、“统计学”、“线性代数”、“数字图像处理”、“机器学习理论基础”、“高等数学”。当然,你也不一定很清楚原理,事实上很多数据挖掘师会用算法,但未必解释的清楚自己用的算法。
  • 挖掘思路

    • 一般来说,当我们遇到一个问题,完成了数据探索和数据预处理(其实你就已经完成了70%的工作),接下来的任务就是挖掘建模。
    • 通常明确问题类型之后,我们首先选择普遍认同的算法,如SVM(支持向量机)、GBDT(梯度提升树)、Adaboost(这个玩机器学习的都知道是什么)等,当然也有很多现在热门的深度算法可供选择,神经网络会是个不错的方法。
    • 当然,如果你说,我想找一个最好的方法,这是不可能的。挖掘建模,没有最好的模型只有最合适的模型,例如很多标准化特征值的单标签问题选择K-近邻算法会是个很高效的选择(尽管K-近邻只是机器学习的一个入门算法,但是存在就是合理)。
    • 如果一个问题很吃精度,那么交叉验证各个认为可能合适的算法应该是个不错的选择,当然要保证每个算法参数合适得到最优解
    • 但是,很多时候,问题往往不是很需求精度,这时候一个相对“比较好”的算法就足够了,那么如何判断一个算法是否达到我的需求呢,这就要求你必须知道每个算法的优缺点,这就是我接下来想说的东西。
  • 常用算法及其优缺点

    • 首先,在机器学习算法中有两个常见问题:
      • 欠拟合。这是由于模型过于简单产生了估计不准确形成偏差(bias)。
      • 过拟合。这是由于模型太过复杂而带来的更大的变化空间和不确定性形成方差(variance)。
        • 定义
          • 所谓过拟合(Overfit),是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据。此时我们就叫这个假设出现了overfit的现象。
        • 产生原因
          • 出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。
        • 解决方法
          • 增大数据量。
          • 减少feature个数(人工定义留多少个feature或者算法选取这些feature)。
          • 正则化(留下所有的feature,但对于部分feature定义其parameter非常小)。
          • 交叉验证。
      • 对于小训练集,高偏差&低方差的分类器(eg.朴素贝叶斯)要比低偏差&高方差的分类器(eg.KNN)的优势大,因为后者会过拟合。但是随着训练集的增大,模型数据的预测能力就越强,偏差就会越低,此时低偏差&高方差分类器就表现出其优势,此时高偏差&低方差分类器已经不足以提供准确的模型了。
    • 朴素贝叶斯(NB)
      • 模型类别
        • 分类模型
      • 生成式模型,也就是说需要计算特征和类型的联合概率分布,它很简单,因为你不过是在计数而已。(我在之前的博客介绍过)它有一个独立性假设,假设特征之间独立分布,这就导致其收敛速度快于一般的判别模型,所以只需要少量训练集数据。即使这个独立假设不成立,它还是有巨大功效。是由于独立假设,直接忽略特征之间的相互作用,无法利用特征冗余。
      • 优点
        • 发源于数论,分类效率稳定。
        • 小规模数据表现极好,能处理多分类任务,适合增量式训练。
        • 对缺失数据不敏感,算法简单,常用于文本分类(典型的是垃圾邮件过滤)。
      • 缺点
        • 需要计算先验概率。
        • 对输入数据形式敏感。
        • 分类决策存在错误率。
    • 逻辑回归(Logistic Regression)
      • 模型类别
        • 分类模型
      • 判别式模型,一个分类模型。同时不需要像朴素贝叶斯那样考虑特征是否相关,有很多正则化的方法(L0,L1,L2)。与决策树和SVM相比还能得到一个不错的概率解释,甚至可以轻松地利用新数据来更新模型(在使用在线梯度下降算法时)。如果需要一个概率架构(例如,简单地调节分类阈值,指明不确定性,或者是获得置信区间),或者需要将在以后的业务中将更多的训练数据快速地整合到模型中去,那么毫无疑问,选择逻辑回归。
      • 优点
        • 实现简单,广泛使用于工业问题中。
        • 分类时计算量非常小,速度很快,存储资源低。
        • 便利地观测样本概率分数。
        • 对逻辑回归而言,多重共线性不是问题,它可以结合L2正则化来解决该问题。
      • 缺点
        • 当特征空间很大时,逻辑回归性能较差。
        • 易欠拟合,准确度不高。
        • 不能很好处理大量多类特征或变量。
        • 只能处理二分类问题。
        • 对于非线性特征,需要进行转换(毕竟是一个线性回归模型)。
    • 最近邻算法(KNN)
      • 模型类别
        • 分类模型
        • 回归模型
        • 一个通俗易懂的分类方法,求出每一个测试样本和训练样本之间的距离(根据欧式距离或者曼哈顿距离等),选取与测试样本距离最近的k个训练样本数据,进行投票得到最后的分类结果。如何选择一个合适的k值,这取决于数据集。一般来说,选择较大的k值能够减小噪声的影响,但会使得类别之间的界限变得模糊。一个较好的k值可以通过各种启发式技术获取,如交叉验证。噪声和非相关性特征的存在会使得k近邻算法的准确性减小。KNN具有较强的一致性结果,随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍,对于一些好的k值,KNN保证错误率不会超过贝叶斯理论误差率。
        • 优点
          • 理论成熟,思想简单,既可以做分类又可以做回归。
          • 可用于非线性分类。
          • 训练时间复杂度仅为O(n)。
          • 对数据没有假设,准确度高,对离群值不敏感(outlier)。
        • 缺点
          • 计算量大。
          • 样本不平衡问题(即有些类别的样本数量多,有些类别的样本数量少)。
          • 需要大量内存。
    • 线性回归(Linear Regression)
      • 模型类别
        • 回归模型
      • 用于回归,不同于逻辑回归用于分类。其基本思想是用梯度下降法对最小二乘法形式的误差函数进行优化,当然也可以用正规方程组(normalequation)直接求得参数的解。具体有LR(线性回归)和LWLR(局部加权线性回归)两种计算式,公式在我专门回归的博客中叙述,其中LWLR是一种非参数模型,因为每次进行回归计算都要遍历训练样本至少一次。
      • 优点
        • 实现简单,计算简单。
      • 缺点
        • 无法拟合非线性数据。
    • 决策树
      • 模型类别
        • 分类模型
        • 回归模型
      • 利用特征值的选择区间建立的一个树形结构。决策树学习一般三个步骤:特征选择、决策树的生成和决策树的修剪。关于决策树有很多经典算法(ID3,C4.5,CART)。它易于解释。它可以毫无压力地处理特征间的交互关系并且是非参数化的,不必担心异常值或者数据是否线性可分(举个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)。它的缺点之一就是不支持在线学习,于是在新样本到来后,决策树需要全部重建。另一个缺点就是容易出现过拟合,但这也就是诸如随机森林RF(或提升树boostedtree)之类的集成方法的切入点。另外,随机森林经常是很多分类问题的赢家,它训练快速并且可调,同时你无须担心要像支持向量机那样调一大堆参数,所以在以前都一直很受欢迎。
      • 优点
        • 计算简单,易于理解,可解释性强。
        • 比较适合处理有缺失属性的样本。
        • 能够处理不相关特征。
        • 在短时间内能对大数据源做出可行且效果良好的结果。
      • 缺点
        • 容易发生过拟合(随机森林有效减少过拟合)。
        • 忽略数据之间的相关性。
        • 对于那些各类别样本数量不一致的数据,在决策树当中,信息增益的结果偏向于那些具有更多数值的特征(只要是使用了信息增益,都有这个缺点,如RF)
    • Adaboost
      • 模型类别
        • 分类模型
      • Adaboost是一种加和模型,每个模型都是基于上一次模型的错误率来建立的,过分关注分错的样本,而对正确分类的样本减少关注度,逐次迭代之后,可以得到一个相对较好的模型。其核心是通过训练集得到不同的弱分类器,集合起来,构成强分类器。是一种典型的boosting算法。
      • 优点
        • 是一种有很高精度的分类器。
        • 可以使用各种方法构建子分类器,Adaboost算法提供的是框架。
        • 当使用简单分类器时,计算出的结果是可以理解的,并且弱分类器的构造极其简单。
        • 简单,不用做特征筛选。
        • 不容易发生过拟合。
      • 缺点
        • 对离群值比较敏感。
    • 支持向量机(SVM)
      • 模型类别
        • 判别模型
        • 分类模型
        • 回归模型
      • 高准确率,为避免过拟合提供了很好的理论保证,而且就算数据在原特征空间线性不可分,只要给个合适的核函数,它就能运行得很好。在超高维的文本分类问题中特别受欢迎。可惜内存消耗大,难以解释,运行和调参也有些烦人,而随机森林却刚好避开了这些缺点,相对而言更加实用。
      • 优点
        • 可以解决高维问题,即大型特征空间。
        • 能够处理非线性特征的相互作用。
        • 无需依赖整个数据。
        • 可以提高泛化能力。
      • 缺点
        • 当观测样本很多时,效率并不是很高。
        • 对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数。
        • 对缺失数据敏感。
        • 对于核的选择也是有技巧的(libsvm中自带了四种核函数:线性核、多项式核、RBF以及sigmoid核):
          • 第一,如果样本数量小于特征数,那么就没必要选择非线性核,简单的使用线性核就可以了;
          • 第二,如果样本数量大于特征数目,这时可以使用非线性核,将样本映射到更高维度,一般可以得到更好的结果;
          • 第三,如果样本数目和特征数目相等,该情况可以使用非线性核,原理和第二种一样。
          • 对于第一种情况,也可以先对数据进行降维,然后使用非线性核,这也是一种方法。
    • 人工神经网络
      • 模型类别
        • 使用范围广
      • 具体叙述,可以查看我专门关于人工神经网络博客。
      • 优点
        • 分类的准确度高。
        • 并行分布处理能力强,分布存储及学习能力强。
        • 对噪声神经有较强的鲁棒性和容错能力,能充分逼近复杂的非线性关系。
        • 具备联想记忆的功能。
      • 缺点
        • 神经网络需要大量的参数,如网络拓扑结构、权值和阈值的初始值。
        • 不能观察之间的学习过程,输出结果难以解释,会影响到结果的可信度和可接受程度。
        • 学习时间过长,甚至可能达不到学习的目的。
    • K-Means聚类
      • 模型类别
        • 聚类模型
      • 无监督学习算法,在没有训练集的条件下将特征接近的归为一类。
      • 优点
        • 算法简单,容易实现。
        • 对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法通常局部收敛。
        • 算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。
      • 缺点
        • 对数据类型要求较高,适合数值型数据。
        • 可能收敛到局部最小值,在大规模数据上收敛较慢。
        • K值比较难以选取。
        • 对初值的簇心值敏感,对于不同的初始值,可能会导致不同的聚类结果。
        • 不适合于发现非凸面形状的簇,或者大小差别很大的簇。
        • 对于”噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。
  • 几个常见算法对比

    • 简述几种常用算法的对比,具体算法的选择需要根据数据集情况和算法优缺点自行判断选择。
    • 朴素贝叶斯与逻辑回归对比
      • 相同点
        • 都是对条件概率建模,对求得的不同类的分类结果有很好的解释性,而不像SVM和神经网络解释性不高。
      • 不同点
        • 在有相关性特征的数据上的学习,逻辑回归好一些。逻辑回归不会在特征是否相关上有局限性,它总是能找到一个最优的参数。
        • 朴素贝叶斯的好处是不需要优化参数,它可以直接得到一个计数表来计算需要的最终结果。然而,逻辑回归需要学习这样一个参数,然后去预测。
        • 朴素贝叶斯在小规模数据集上的表现很好,随着数据的增多,特征维度的增加,逻辑回归的效果更好,这是因为朴素贝叶斯是生成式模型,在有先验的情况下模型能够把数据训练的更好,而逻辑回归属于判别式模型,目标驱动化,不去建模联合概率,通过训练数据直接预测输出,因此在数据足够多的情况下能够得到更好一些的效果。
    • 逻辑回归与SVM的对比
      • 不同点
        • LR采用log损失,SVM采用Hinge损失。
        • LR对异常值敏感,SVM对异常值不敏感。
        • 在训练集较小时,SVM较适用,而LR需要较多的样本。
        • LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。
        • 对非线性问题的处理方式不同,LR主要靠特征构造,必须组合交叉特征,特征离散化。SVM也可以这样,还可以通过kernel。
    • GBDT与随机森林的对比
      • 相同点
        • 都是由多棵树组成。
        • 最终的结果都是由多棵树一起决定。
      • 不同点
        • 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成。
        • 组成随机森林的树可以并行生成;而GBDT只能是串行生成。
        • 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来。
    • bagging与boosting的对比
      • 不同点
        • 二者的主要区别是 取样方式不同 。bagging采用 均匀取样 ,而Boosting根据错误率来取样,因此boosting的分类精度要优于Bagging。bagging的训练集的选择是随机的,各轮训练集之间相互独立,而boostlng的各轮训练集的选择与前面各轮的学习结果有关;bagging的各个预测函数没有权重,而boosting是有权重的;bagging的各个预测函数可以并行生成,而boosting的各个预测函数只能顺序生成。对于象神经网络这样极为耗时的学习方法。bagging可通过并行训练节省大量时间开销。
        • bagging和boosting都可以有效地提高分类的准确性。在大多数数据集中,boosting的准确性比bagging高。在有些数据集中,boosting会引起退化---过拟合(Overfit)。
        • Boosting思想的一种改进型AdaBoost方法在邮件过滤、文本分类方面都有很好的性能。
        • Gradient boosting(又叫Mart, Treenet):Boosting是一种思想,Gradient Boosting是一种实现Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。
  • 一般算法选择思路

    • 首当其冲应该选择的就是逻辑回归,如果它的效果不怎么样,那么可以将它的结果作为基准来参考,在基础上与其他算法进行比较;
    • 然后试试决策树(随机森林)看看是否可以大幅度提升你的模型性能。即便最后你并没有把它当做为最终模型,你也可以使用随机森林来移除噪声变量,做特征选择;
        - 如果特征的数量和观测样本特别多,那么当资源和时间充足时(这个前提很重要),使用SVM不失为一种选择。
        通常情况下:[GBDT>=SVM>=RF>=Adaboost>=Others],现在深度学习很热门,很多领域都用到,它是以神经网络为基础的。
        - 算法固然重要,但好的数据却要优于好的算法,设计优良特征是大有裨益的。假如你有一个超大数据集,那么无论你使用哪种算法可能对分类性能都没太大影响(此时就可以根据速度和易用性来进行抉择)。
  • 补充说明


人生不是轨道,而是无边的旷野。