问题

常用的机器学习算法比较?

回答
好的,我们来聊聊机器学习里那些常见又好用的算法,争取说得透彻点,而且尽量让你们感觉像是在听老朋友唠嗑,而不是冰冷的机器报告。

机器学习的世界就像一个大厨房,里面有各种各样的工具,每种工具都有自己的特长,适合做不同的菜。我们今天就来点几道“硬菜”,看看它们各自的“口味”和“做法”。

1. 线性回归 (Linear Regression):最基础的“配平”专家

想象一下,你想预测一栋房子的价格,你发现面积越大,价格往往越高,而且这个关系好像挺直接的,像一条直线。线性回归就是干这个的。它试图找到一条直线(或者高维空间里的超平面),来最好地拟合你的数据点。

它像什么? 就像你在一张图上画一条最能穿过一堆散点的直线,让这些点到直线的“总距离”最小。
怎么工作的? 它会找一个“斜率”和一个“截距”,让你输入的变量(比如房屋面积)通过这个公式计算出的结果(预测价格)尽量接近真实的价格。
优点:
简单直观: 就像一元一次方程,容易理解,也容易实现。
计算效率高: 对于大数据集,训练速度很快。
可解释性强: 你能清楚地知道每个输入变量对输出结果有多大的影响(比如面积每增加10平方米,价格会大概涨多少)。
缺点:
处理非线性关系能力弱: 如果数据关系不是直线型的,它就“抓瞎”了。
容易受到异常值影响: 几个特别离谱的点,可能会把那条“直线”拽得很偏。
假设线性关系: 强行用线性去拟合非线性数据,结果会很糟糕。
适合做什么? 预测连续数值,比如股票价格、销售额、某个指标的数值。

2. 逻辑回归 (Logistic Regression):分类界的“二当家”

虽然名字里有“回归”,但逻辑回归其实是用来做“分类”的,尤其擅长处理“是”还是“否”、“男”还是“女”这种二分类问题。它怎么把一个连续的输出变成一个概率呢?它用了个“S”形曲线,叫做Sigmoid函数。

它像什么? 就像一个“投票器”,根据你输入的特征(比如客户年龄、购买记录)来判断你更倾向于哪一类,然后给出一个你属于某一类的概率。
怎么工作的? 它同样会找一组权重,但不是直接输出一个数值,而是把这个数值通过Sigmoid函数转换成一个0到1之间的概率。比如,概率大于0.5就判为“是”,小于0.5就判为“否”。
优点:
分类任务的基石: 非常适合二分类问题,结果是概率,也方便后续处理。
计算效率高: 和线性回归一样,训练和预测都很快。
可解释性较强: 权重的意义比较明确,能知道哪些特征对分类结果影响大。
缺点:
仅限于线性可分的数据: 如果数据的边界不是一条直线(或者超平面),它就显得力不从心。
对特征工程敏感: 需要你提前做好特征的提取和转换,让数据更容易被线性区分。
适合做什么? 垃圾邮件检测、客户流失预测、疾病诊断(良性/恶性)、信用评分(通过/不通过)。

3. 支持向量机 (Support Vector Machine, SVM):“找边界”的高手

SVM最核心的思想就是找到一个“最优的超平面”来分隔不同类别的数据。这个“最优”不仅仅是分开,还要让分隔的“间隔”最大化,这样分类器会更鲁棒。

它像什么? 想象你在两种颜色的点之间画一条线,SVM就是要找到那条离两种颜色点都最远的线,这样万一进来几个新点,它也能很稳地把它们归类。
怎么工作的? 它会找到一群“支持向量”,也就是最靠近决策边界的数据点,用它们来定义这个最优边界。当数据不好直接分开时,SVM还有一个“秘密武器”——核函数(Kernel Trick)。它可以把数据映射到更高维的空间,在那个空间里,原本线性不可分的数据就可能变得线性可分了,就像把一个二维平面上的点“抬”起来,在三维空间里就能用一个平面切开了。
优点:
在高维空间表现出色: 即使特征很多,也能找到好的分类器。
对异常值不太敏感: 由于它只关注支持向量,几个离群点对边界的影响相对较小。
泛化能力强: 找到的边界通常能很好地泛化到新数据。
缺点:
对大数据集训练慢: 尤其是核函数的使用,计算量会比较大。
参数选择困难: 核函数的选择和参数的调优需要经验。
结果可解释性较弱: 尤其是使用了复杂的核函数后,很难直观理解模型决策过程。
适合做什么? 图像识别、文本分类、生物信息学等需要处理高维复杂数据的任务。

4. 决策树 (Decision Tree):像“查问题”一样分类

决策树就像一个脑筋急转弯游戏,或者你去看医生,医生会问你一系列问题,然后根据你的回答一步步导向最终诊断。它通过不断地划分数据,直到每个分支都代表一个明确的类别。

它像什么? 一个倒过来的树,每个节点代表一个关于特征的判断(比如“年龄大于30岁?”),每个分支代表这个判断的答案(“是”或“否”),叶子节点就是最终的分类结果。
怎么工作的? 它会选择一个最佳的特征和划分点,把数据分成两组,然后对每一组重复这个过程,直到满足停止条件(比如数据已经纯净,或者达到最大深度)。
优点:
直观易懂,可视化好: 很容易向非技术人员解释决策过程。
不需要特征缩放: 对数据的尺度不敏感。
能处理数值型和类别型特征: 灵活度高。
缺点:
容易过拟合: 如果树长得太深,可能会把训练数据里的噪声也记下来,在新数据上表现不好。
不够稳定: 数据集发生微小变化,决策树的结构可能就完全不同。
划分边界是轴对齐的: 只能做“直上直下”的划分,对于斜线关系的处理效果不如SVM。
适合做什么? 很多分类和回归问题,尤其是需要解释性强的场景,比如用户行为分析、医疗诊断、风险评估。

5. 随机森林 (Random Forest):决策树的“加强连”

大家都知道单打独斗容易输,所以随机森林就把很多棵决策树“拉”在一起,形成一个“森林”。它通过“投票”的方式来做预测,这样整体的决策会更稳健。

它像什么? 就像一群专家一起讨论一个问题,每个人都有自己的意见(一棵决策树),最后少数服从多数,得出最终结论。
怎么工作的? 它主要有两个“随机”:
1. 样本随机: 每次训练一棵树时,是从原始数据集中“有放回”地抽取一部分样本(Bootstraping)。
2. 特征随机: 在构建每棵树的每个节点时,只考虑一部分随机选择的特征来进行分裂。
这样一来,每棵树的生成都会有很大的随机性,它们之间就不会高度相关,从而减小了过拟合的风险。
优点:
减少过拟合: 通过“集成”的方式,极大地提升了模型的泛化能力。
鲁棒性强: 对噪声和异常值不敏感。
能够处理高维数据: 效果通常不错。
能给出特征重要性: 可以知道哪些特征对预测最重要。
缺点:
模型复杂,可解释性降低: 很难像单棵决策树那样清晰地展示决策路径。
训练速度相对较慢: 因为需要训练多棵树。
适合做什么? 几乎是万金油,在各种分类和回归问题上表现都很好,是解决复杂问题的首选算法之一。

6. 梯度提升树 (Gradient Boosting Trees, GBDT / XGBoost / LightGBM):“追赶”最佳的“团队合作”

这是近年来非常流行的算法家族,它们的核心思想是“一个萝卜一个坑”,前一个模型预测错了,下一个模型就专门去学习前一个模型的“错误”,不断迭代优化,就像团队里总是有人在弥补前一个人的不足,直到达到最佳状态。

它像什么? 就像一支训练有素的接力队,每个人都在努力跑好自己的那段,并且吸取前面队友的经验教训。GBDT家族的模型,尤其是XGBoost和LightGBM,就像是升级版的接力队员,跑得更快,协调得更好。
怎么工作的? 它们是“集成学习”的代表,构建一系列弱学习器(通常是浅层的决策树),每个新的弱学习器都会根据前面所有弱学习器的误差来调整,目标是最小化整体的损失函数。XGBoost和LightGBM在此基础上做了很多优化,比如正则化、并行计算、更快的节点分裂算法等。
优点:
预测精度高: 在许多比赛和实际应用中,GBDT家族通常能获得最好的结果。
处理非线性关系能力强: 能够捕捉数据中复杂的模式。
可以处理缺失值: XGBoost等算法内置了处理缺失值的机制。
XGBoost/LightGBM 速度快且效率高: 优化后的版本可以处理大规模数据。
缺点:
对参数敏感: 需要仔细调参才能达到最佳效果。
可解释性较差: 像随机森林一样,多棵树的叠加使得解释变得困难。
容易过拟合: 如果不加控制,也可能变得过拟合,但通过正则化可以缓解。
适合做什么? 几乎所有你能想到的预测问题,特别是那些对精度要求极高的场景,比如金融风控、推荐系统、广告点击率预测、搜索排序等。

7. K近邻算法 (KNearest Neighbors, KNN):“物以类聚,人以群分”的简单主义

KNN算法非常直观,它的想法是“近朱者赤,近墨者黑”。对于一个新的数据点,它会找到离它最近的K个邻居,然后根据这K个邻居的“身份”(类别),来决定新数据点的身份。

它像什么? 就像你去到一个新社区,想知道这个社区的风格,就看看你周围的邻居,大部分邻居是什么样,你很可能也是什么样。
怎么工作的? 找一个新的数据点,计算它到训练集中所有数据点的“距离”,找出距离最小的K个点,然后根据这K个点中占多数的类别,将新数据点归为那一类。
优点:
简单易懂,易于实现: 算法逻辑非常直观。
对数据分布没有假设: 不需要假定数据是某种特定分布。
训练阶段开销小: 训练时只是把数据存起来。
缺点:
预测阶段开销大: 需要计算新数据点到所有训练数据的距离,在大数据集上速度很慢。
对高维数据不敏感: 高维空间中,“距离”的概念会变得模糊(维度灾难)。
需要选择合适的K值: K值的选择会显著影响结果。
对异常值敏感: 几个离谱的邻居可能会影响最终判断。
适合做什么? 推荐系统、图像识别(如识别手写数字)、客户细分。

总结一下:

想快又想知道原因? 线性回归、逻辑回归。
数据复杂,想找个“万能”的,且不太在意解释性? 随机森林、梯度提升树家族 (XGBoost, LightGBM)。
数据不是线性可分的,但又想获得好的分类效果? SVM(尤其配合核函数)。
喜欢简单直观,能解释每一步? 决策树。
数据点之间距离很重要,且对训练速度要求不高? KNN。

机器学习算法的选择,就像你在厨房里选工具一样,要看你要做什么菜(解决什么问题),食材(数据)有什么特点,以及你希望这道菜(模型)有什么样的“口感”(性能、解释性、效率)。没有哪一个算法是万能的,关键在于理解它们的优缺点,并根据具体场景进行选择和调整。

希望这次的“唠嗑”让你对这些算法有了更深入的了解!

网友意见

user avatar

授人以鱼不如授人以渔,这篇文章会介绍如何通过“统计学检验”来对比机器学习算法性能。掌握了这个方法后,我们就不需要再人云亦云,而可以自己分析算法性能。

首先结论如下,在对比两个算法多个数据集上的表现时:

  • 如果样本配对(paired)且符合正态分布,优先使用配对t检测(paired t test)。
  • 如果样本不符合正态分布,但符合配对,使用Wilcoxon Signed Ranks test。
  • 如果样本既不符合正态分布,也不符合配对,甚至样本量都不一样大,可以尝试Mann Whitney U test。值得注意的是,MW是用来处理独立测量(independent measures)数据,要分情况讨论,后文会深入分析。

在对比多个算法多个数据集上的表现时:

  • 如果样本符合ANOVA(repeated measure)的假设(如正态、等方差),优先使用ANOVA。
  • 如果样本不符合ANOVA的假设,使用Friedman test配合Nemenyi test做post-hoc。
  • 如果样本量不一样,或因为特定原因不能使用Friedman-Nemenyi,可以尝试Kruskal Wallis配合Dunn's test。值得注意的是,这种方法是用来处理独立测量数据,要分情况讨论。

文章结构如下:(1-2) 算法对比的原因及陷阱 (3-4) 如何对比两个算法 (5-6)如何对比多个算法 (7)如何根据数据特性选择对比方法 (8)工具库介绍。


1. 为什么需要对比算法性能?

统计学家George Box说过:“All models are wrong, but some are useful”(所有模型都是错误,只不过其中一部分是有价值的)。通俗来说,任何算法都有局限性,所以不存在“通用最优算法”,只有在特定情境下某种算法可能是渐进最优的

因此,评估算法性能并选择最优算法是非常重要的。不幸的是,统计学评估还没有在机器学习领域普及,很多评估往往是在一个数据上的简单分析,因此证明效果有限。

2. 评估算法中的陷阱

首先我们常说的是要选择一个正确的评估标准,常见的有:准确率(accuracy)、召回率(recall)、精准率(precision)、ROC、Precision-Recall Curve、F1等。

选择评估标准取决于目的和数据集特性。在较为平衡的数据集上(各类数据近似相等的情况下),这些评估标准性能差别不大。而在数据严重倾斜的情况下,选择不适合的评估标准,如准确率,就会导致看起来很好,但实际无意义的结果。举个例子,假设某稀有血型的比例(2%),模型只需要预测全部样本为“非稀有血型”,那么准确率就高达98%,但毫无意义。在这种情况下,选择ROC或者精准率可能就更加适当。这方面的知识比较容易理解,很多科普书都有介绍,我们就不赘述了。

其次我们要正确理解测量方法,常见的有

  • 独立测量(independent measures):不同样本的观测对象是独立的,不存在关联
  • 重复测量(repeated measures):样本中使用的观测对象是相同的,仅仅是独立变量在上面的作用结果不同
  • 以及成对测量(matched pair):不同样本中采用不同的观测对象,但尽量使得样本间的观测对象成对相似

举个例子,我们想要分析刷知乎时间(每天3小时 vs. 每天10小时)对于大学生成绩的影响。如果我们使用相同的20个学生,观察他们每天3小时和10小时的区别,那就是重复测量。如果我们选择40个学生,分成两组每组20人,再分别观察那就是独立测量。如果我们先找20个学生,再找20个和他们非常相似的大学生,并配对观察,就是成对相似。

我们发现,当错误的理解测量方式时,就无法使用正确的统计学手段进行分析

在这篇文章中我们默认:评估不同算法在多个相同数据集上的表现属于重复测量,而特例将会在第七部分讨论。同时,本文介绍的方法可以用于对比任何评估标准,如准确度、精准度等,本文中默认讨论准确度。

3. 两种算法间的比较:不恰当方法

图1展示了两种决策树方法(C4.5,C4.5+m)在14个数据集上的准确率。那么该如何对比两种算法呢?先说几种错误(不恰当)的方法:

不恰当方法1:求每个算法在所有数据集上的均值,并比较大小。错误原因:我们对于算法在不同数据集上错误的期望不是相同的,因此求平均没有意义。换句话说,数据不符合相称性(commensurate)。

不恰当方法2进行配对样本t检测(Paired t test)。显然,t test是统计学方法,可以用来查看两种方法在每个数据上的平均差值是否不等于0。但这个方法不合适原因有几点:

  • 和平均一样,不同数据集上的错误不符合相称性
  • t-test要求样本符合正态分布,显然我们无法保证不同数据集上的准确率符合正态分布
  • t-test对样本的大小有一定的要求,一般最低需要>30个样本。在这个例子中我们只有14个,且大部分情况下我们没有30个数据来做实验。
  • 因为缺乏相称性,统计结果易受到异常值影响(outliers)

不恰当方法3:符号检验(sign test)是一种无参数(non-parametric)的检验,优点是对于样本分布没有要求,不要求正态性。比较方法很简单,就是在每个数据集上看哪个算法更好,之后统计每个算法占优的数据集总数。以这个例子为例,C4.5在2个数据集上最优,2个平手,10个最差。如果我们对这个结果计算置信区间,发现p<0.05需要至少在11个数据集上表现最优。因此这个方法的缺点有:

  • 符号检验是一种非常弱的检验方法,仅对比优劣损失了大量信息,失去了定量信息(quantitative),比如 和 的意义是一样的。正因为如此,临界值(critical value)一般都需要很大,比如这个例子中的 的临界值是11(图2)。
  • 另一个问题是,因为缺乏定量信息,很多时候很难确定“优胜”是否来自随机性。举个例子,0.99<0.991是否真的代表算法A更好?一种看法是需要定义一个阈值,仅当差别大于阈值才能说明更好。然而这种看法的问题在于,假设算法A在1000个数据集上都以“微弱优势”胜过了B,那么我们是否需要怀疑显著性?因此,根本问题还是,符号检验需要大样本量才能得出显著性

4. 两种算法间的比较:推荐方法

考虑到通用性,我们需要使用非参数检验。换句话说,我们需要保证对样本的分布不做任何假设,这样更加通用。

方法1:Wilcoxon Signed Ranks Test(WS )配对t检验的无参数版本,同样是分析成对数据的差值是否等于0,只不过是通过排名(rank)而已。换个角度看,我们也可以理解为符号检验的定量版本。优点如下:

  • 无参数,不要求样本符合正态分布
  • 符合数据相称性,虽然是定性的(与配对t检验相比)
  • 有一定的定量特性,即较大的差别对于最终结果影响更大(与符号检验相比)

方法2(详见第七部分):Mann Whitney U test(MW)和WS一样,都是无参数的且研究排名的检验方法。MW有以下特性:

  • 可以用来检测不同的大小的样本,举例A算法在8个数据集上的表现 vs B算法在10个数据集上的表现。
  • 不存在配对性要求,参看上一点
  • 对比的是两个样本的分布,因此不同数据集的错误应该符合特定分布,可能不满足相称性
  • 对于测量方法的假设是:独立测量,这与我们的实际情况不符

换句话说,MW是当样本量不同时才建议勉强一试,因为不符合独立测量的假设。不同数据集的错误(准确率)不一定符合特定分布,很可能不符合相称性,但在特定情况下有用,详见第七部分。

总结:如果样本配对且符合正态分布,优先使用配对t检测。如果样本不符合正态分布,但符合配对,使用WS。如果样本既不符合正态分布,也不符合配对,可以尝试MW。

5. 多种算法间的比较:不恰当的方法

图4提供了四种算法(C4.5,C4.5+m,C4.5+cf,C4.5+m+cf)在14个数据集上的准确率。

不恰当方法1:一种看法是,我们是否可以把两个算法的对比推广到多个算法上。假设有k个算法,我们是否可以对它们进行两两比较,经过 次计算得到一个矩阵。这个是经典的多元假设检验问题,这种穷举法一般都假设了不同对比之间的独立性,一般都不符合现实,需要进行校正,因此就不赘述了。

不恰当方法2Repeated measures ANOVA是经典的统计学方法,用来进行多样本间的比较是,可以看做是t检验的多元推广。ANOVA不适合对比算法表现的原因如下:

  • 对样本分布有正态假设,然而不同数据集上的准确度往往不符合这个假设
  • 不同的样本有相同的总体方差(population variance)

不幸的是,我们想要对比的算法表现不符合这个情况,因此ANOVA不适合。

6. 多种算法间的比较:推荐的方法

我们需要找到一种方法同时解决第5部分中提到的问题,这个方法需要:

  • 非参数,不对数据的分布做出假设
  • 不需要,或者尽量不依赖,或者可以自动修正两两对比所带来的误差

Demšar [1]推荐了非参数的多元假设检验Friedman test。Friedman也是一种建立在排名(rank)上的检验,它假设所有样本的排序均值相等。具体来讲,我们首先给不同算法在每个数据集上排序,并最终计算算法A在所有数据集上排名的均值。如果所有算法都没有性能差别,那么它们的性能的平均排名应该是相等的,这样我们就可以选择特定的置信区间来判断差异是否显著了。

假设我们通过Friedman test发现有统计学显著(p<0.05),那么我们还需要继续做事后分析(post-hoc)。换句话说,Friedman test只能告诉我们算法间是否有显著差异,而不能告诉我们到底是哪些算法间有性能差异。想要定位具体的差异算法,还需要进行post-hoc分析。

Friedman test一般配套的post-hoc是Nemenyi test,Nemenyi test可以指出两两之间是否存在显著差异。我们一般还会对Nemenyi的结果可视化,比如下图。

另一个值得提的是,即使Friedman证明算法性能有显著不同,Nemenyi不一定会说明到底是哪些算法间不同,原因是Nemenyi比Friedman要弱(weak),实在不行可以对必须分析的算法成对分析。

方法2(详见第七部分):和两两对比一样,在多个样本对比时也有一些特定情况导致我们不能使用Friedman-Nemenyi。另一个或许可以值得一试的无参数方法是Kruskal Wallis test搭配Dunn's test(作为post-hoc)。 这种方法的特点是:

  • 可以用来检验不同的大小的样本,举例A算法在8个数据集上的表现 vs B算法在10个数据集上的表现 vs C算法在20个数据集上的表现。
  • 对于测量方法的假设是:独立测量,这与我们的实际情况不符。

7. 再看重复测量和独立测量

我们在第二部分分析了重复测量与独立测量,而且假设机器学习性能的对比应该是建立在“重复测量”上的,也就是说所有的算法都在相同的数据集上进行评估

在这种假设下,我们推荐了无参数的:Wilcoxon对两个算法进行比较, Friedman-Nemenyi对多个算法进行对比。

然而,“重复测量”的假设不一定为真。举个例子,如果我们只有一个数据,并从数据中采样(sample)得到了很多相关的测试集1, 2,3...n,并用于测试不同的算法。

  • 算法A:测试集1,2
  • 算法B:测试集3, 4,5,6
  • 算法N...

在这种情况下,我们就可以用Mann Whitney U test对比两种算法,Kruskal-Dunn对比多种算法。而且值得注意的是,这种情况常见于人工合成的数据,比如从高斯分布中采样得到数据。因此,要特别分析数据的测量方式,再决定如何评估。

8. 工具库与实现

我们知道R上面有所有这些检验,着重谈谈Python上的工具库。幸运的是,上文提到所有检验方法在Python上都有工具库

Scipy Statistical functions :Wilcoxon,Friedman,Mann Whitney

scikit-posthocs:Nemenyi,Dunn's test


文章的配图来自于[1] 以及我的一篇paper [2],接收后会补上reference。文章的思路和脉络基于[1],建议阅读。[2]主要着力于特定情况,当重复测量失效时的检验。

[1] Demšar, J., 2006. Statistical comparisons of classifiers over multiple data sets. Journal of Machine learning research, 7(Jan), pp.1-30.

[2] To complete.

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有