最全面最实用的机器学习算法的优缺点
2017-06-10 THU数据学校
本文篇幅4600字,建议阅读6分钟
本文结合使用场景和实践经验,详细分析了各种算法在实践中的优缺点。
本文的目的是对当前的机器学习算法进行一个实用而简明的总结。虽然人们做了大量的盘点,但从来没有给出每种算法的真正优劣。在这里,我们将根据自己的实践经验对此进行详细讨论。
机器学习算法的分类一直很棘手。常见的分类标准有:生成/判别、参数/非参数、监督/非监督等等。
例如,Scikit-Learn根据算法的学习机制对算法进行分类,得到的分类如下:
广义线性模型
支持向量机
最近的邻居
决策树分析
神经网络
……
但是,根据我们的经验,这并不是最实用的分类方法。这是因为在使用机器学习的时候,你不会这样想:“我今天要训练一个支持向量机!”
相反,你通常会考虑最终目标,比如预测某个结果,或者对观察到的结果进行分类。
因此,我们想根据您的任务目标对机器学习算法进行分类。
天下没有免费的午餐
在机器学习领域,一个基本定理是“天下没有免费的午餐”。换句话说,没有一种算法可以完美地解决所有问题,尤其是对于监督学习。
比如你不能说神经网络在任何情况下都比决策树有优势,反之亦然。它们受到许多因素的影响,例如数据集的大小或结构。
因此,在用给定的测试集评估性能和选择算法时,应该根据具体问题采用不同的算法。
当然,选择的算法必须适合自己的问题,这就需要选择正确的机器学习任务。以此类推,如果你需要打扫房子,你可以用吸尘器、扫帚或拖把,但千万不要拿出铲子去挖地。
机器学习的任务
在这里,我们将首先讨论当前“三大”最常见的机器学习任务:
回归
分类
聚类
数据降维的两个问题:
特征选择
特征提取
在下面的文章中,我们还将讨论密度估计和异常检测的任务。
注意:本文将不讨论具体的细分领域,如自然语言处理。
本文不会涵盖每一个具体的算法。毕竟现在的算法数不胜数,新算法层出不穷。尽管如此,本文仍然可以为每个任务给出最具代表性的算法。
1.返回
回归是一种用于连续数值变量预测和建模的监督学习算法。用例包括对房地产价格、股票价格趋势或学生成绩的预测。
回归任务的特征是带有数字目标变量的标记数据集。换句话说,用于监督算法的每个观察样本都有一个数值真值。
线性回归
1.1线性回归
线性回归是回归任务中最常用的算法。它最简单的形式是用一个连续的超平面来拟合数据集。如果数据集中的变量之间存在线性关系,则拟合度相当高。
在实践中,简单的线性回归通常被其正则化形式所取代。正则化是一种惩罚技术,以避免太多回归系数的过度拟合。同时,惩罚力度需要平衡。
优点:线性回归的理解和解释非常直观,正则化可以避免过拟合。此外,线性模型可以通过随机梯度下降轻松更新数据模型。
缺点:线性回归在处理非线性关系时非常糟糕,对于识别复杂模式不够灵活。添加正确的交互项或多项式是极其困难和耗时的。
实现:
python-http://scikit-learn.org/stable/modules/linear_model.html
https://cran.r-project.org/web/packages/glmnet/index.html河
1.2回归树
回归树,又称为决策树,通过将数据集重复划分为不同的分支,使每次分离的信息增益最大化,使回归树能够自然地学习非线性关系。
集成方法,如随机森林或梯度提升树,可以组合许多独立训练树的预测。这里就不细说机制了,但实际上随机森林一般性能都很出色,而梯度提升树很难调整参数,但往往有更高的性能极限。
优点:决策树可以学习非线性关系,对离群点有很强的鲁棒性。集成学习在实践中表现良好,经常赢得经典机器学习比赛。
缺点:因为没有约束,单棵树容易过拟合,因为单棵树可以保留分支,直到记住训练数据。不够,积分法可以削弱这个缺点。
实现:随机森林
python-http://sci kit-learn . org/stable/modules/ensemble . html # random-forests
r-https://cran . r-project . org/web/packages/randomForest/index . html
实现:梯度提升树
python-http://scikitlearn . org/stable/modules/ensemble . html #分类
https://cran.r-project.org/web/packages/gbm/index.html河
1.3深度学习
深度学习是指能够学习极其复杂模式的多层神经网络。他们使用输入层和输出层之间的隐藏层来建模数据的中间表示,这是其他算法很难做到的。
深度学习还有几个重要的机制,比如卷积、泄漏等。,这使得该算法能够有效地学习高维数据。然而,与其他算法相比,深度学习需要更多的数据进行训练,因为模型需要估计更大数量级的参数。
优点:深度学习是特定领域最先进的技术,如计算机视觉、语音识别等。深度神经网络在图像、音频和文本数据上表现良好,并且易于通过反向传播算法更新数据模型。它们的体系结构可以应用于各种问题,而隐藏层也可以减少算法对特征工程的依赖。
缺点:深度学习算法往往不适合通用,因为需要大量数据。事实上,对于经典的机器学习问题,深度学习的性能并不比集成方法好。此外,由于训练需要密集的计算,他们需要更多的专业知识来调整参数。
实现:
python-https://keras.io/
http://mxnet.io/河
1.4荣誉奖:最近邻算法
最近邻算法是“基于案例”的,也就是说需要保留每一个训练观察值。最近邻算法通过搜索最相似的训练样本来预测新样本的观测值。
是一种内存密集型算法,处理高维数据效果不理想。同时,它需要一个有效的距离函数来计算相似度。在实践中,通常使用正则化回归或树积分方法是更好的选择。
2.分类
分类是一种用于建模和预测分类变量的监督学习算法。用例包括员工流动预测、邮件过滤、财务欺诈等。
如你所见,很多回归算法都有其对应的分类形式,分类算法往往适合预测类别,而不是数值。
逻辑回归
2.1逻辑回归
逻辑回归是与线性回归相对应的分类方法,基本概念来源于线性回归。Logistic回归通过逻辑函数将预测映射到0到1的区间,所以预测值可以看作是某个类别的概率。
模型仍然是线性的,算法只有在数据是线性可分的情况下才会表现良好。逻辑回归也可以惩罚正则化的模型系数。
优点:输出结果会有很好的概率解释,算法可以通过正则化避免过拟合。逻辑模型可以通过随机梯度下降轻松更新数据模型。
缺点:当面对多元或非线性决策边界时,逻辑回归的性能较差。
实现:
python-http://sci kit-learn . org/stable/modules/linear _ model . html # logistic-welfare
https://cran.r-project.org/web/packages/glmnet/index.html河
2.2分类树
回归树对应的分类算法是分类树。通常都是指决策树,比较严谨的表述是“CART”,这是一种非常著名的CART算法。
优点:分类树的集成方法和回归方法一样,在实践中也表现得非常好。它们在处理异常数据时是健壮的和可扩展的。分类树的集成方法由于其层次结构,可以自然地对非线性决策边界进行建模。
缺点:无约束,单树容易过拟合,积分法可以削弱这种影响。
实现:随机森林
python-http://sci kit-learn . org/stable/modules/ensemble . html #回归
r-https://cran . r-project . org/web/packages/randomForest/index . html
实现:梯度提升树
python-http://scikitlearn . org/stable/modules/ensemble . html #分类
https://cran.r-project.org/web/packages/gbm/index.html河
2.3深度学习
深度学习也容易适应分类问题。其实深度学习更多的应用于分类任务,比如图像分类。
优点:深度学习非常适合音频、文本、图像数据的分类。
缺点:和回归法一样,深度神经网络需要大量的数据进行训练,所以不是通用算法。
实现:
python-https://keras.io/
http://mxnet.io/河
2.4支持向量机
支持向量机使用一种称为核函数的技术将非线性问题转化为线性问题,其本质是计算两个观测数据之间的距离。支持向量机算法寻找的是一个能够最大化样本区间的决策边界,因此也被称为大距离分类器。
例如,使用线性核函数的支持向量机类似于逻辑回归,但是更健壮。因此,在实践中,支持向量机最大的用途就是利用非线性核函数来建模非线性决策边界。
优点:支持向量可以建模非线性决策边界,可选的核函数很多。面对过拟合,支持向量机具有很强的鲁棒性,尤其是在高维空。
缺点:但是支持向量机是一种内存密集型算法,选择正确的核函数需要相当的J技巧,不适合大数据集。在目前的行业应用中,随机森林的性能往往优于支持向量机。
实现:
python-http://sci kit-learn . org/stable/modules/SVM . html #分类
https://cran.r-project.org/web/packages/kernlab/index.html河
2.5朴素贝叶斯
朴素贝叶斯是一种基于条件概率和计数的简单算法。它的本质是一个概率表,其中的概率是通过训练数据更新的。预测新观测值的过程是根据样本的特征值在概率表中找到最可能的类别。
之所以称之为“简单性”,是因为它的核心假设是特征条件独立,这在现实中几乎是站不住脚的。
优点:即使条件独立性的假设很难成立,但朴素贝叶斯算法在实践中可以表现良好。该算法易于实现,可以用数据集进行更新。
缺点:朴素贝叶斯算法太简单,很容易被上面的分类算法取代。
实现:
python-http://scikit-learn.org/stable/modules/naive_bayes.html
r-htps://cran . r-project . org/web/packages/幼稚贝叶斯/index.html
3.群聚
聚类是一种基于数据内部结构的无监督学习任务,用来寻找样本自然群。用例包括用户画像、电子商务商品聚类、社交网络分析等。
因为聚类属于无监督学习,不会输出“正确答案”,在评价结果时往往会用到数据可视化。如果你需要“正确答案”,即训练集中有预标注的聚类,那么分类算法更合适。
k均值
平均值为3.1 K
K-means是一种基于样本点间几何距离来度量聚类的通用算法。因为团簇围绕着团簇的中心,所以结果会接近球形,大小也差不多。
之所以向初学者推荐这种算法,是因为它不仅足够简单,而且足够灵活,可以为大多数问题给出合理的结果。
优点:K-means是最流行的聚类算法,因为它足够快和简单。如果你的预处理数据和特征工程是有效的,它将有惊人的灵活性。
缺点:算法需要指定簇的个数,k值的选择通常没那么容易确定。另外,如果训练数据中的真实聚类不是球形的,那么K-means聚类会得到一些较差的聚类。
实现:
python-http://sci kit-learn . org/stable/modules/clustering . html # k-means
R-https://stat . ethz . ch/R-manual/R-dev/library/stats/html/kmeans . html
3.2仿射传播
仿射传播是一种相对较新的聚类算法,它基于两个样本点之间的图距离来确定聚类,结果往往较小且大小不同。
优点:仿射传播不需要指明聚类数,但需要指定“样本偏好”、“阻尼”等超参数。
缺点:仿射传播的主要缺点是训练速度慢,需要大量内存,很难扩展到大数据集。此外,该算法还假设潜在聚类靠近球体。
实现:
python-http://scikit-learn . org/stable/modules/clustering . html # affinity-propagation
r-https://cran . r-project . org/web/packages/AP cluster/index . html
3.3分层/层级
分层聚类,也称为分层聚类,基于以下概念:
1)每个簇从一个数据点开始;
2)每个集群可以基于相同的标准进行合并;
3)重复这个过程,直到只剩下一个簇,从而得到簇的层次结构。
优点:层次聚类的主要优点是不再假设聚类是球形的。此外,它可以很容易地扩展到大型数据集。
缺点:类似于K-means,算法需要选择聚类数,即算法完成后要保留的级别。
实现:
python-http://scikitlearn . org/stable/modules/clustering . html # hierarchy-clustering
R-https://stat . ethz . ch/R-manual/R-dev/library/stats/html/h clist . html
3.4 DBSCAN
DBSCAN是一种基于密度的聚类算法,对样本点的密集区域进行聚类;最新的发展是HDBSCAN,它允许集群的密度是可变的。
优点:DBSCAN不需要假设球形簇,性能可以扩展。此外,它不需要将每个点分配给簇,这降低了簇的噪声。
缺点:用户必须调整超参数“ε”和“最小样本”来定义聚类密度。DBSCAN对此非常敏感。
实现:
python-http://sci kit-learn . org/stable/modules/clustering . html # db scan
https://cran.r-project.org/web/packages/dbscan/index.html河
维度灾难
在机器学习领域,“维数”通常是指一个数据集中特征的个数。
当特征数量极大时,训练一个有效的模型将需要非常高的算法。这就是所谓的“维数灾难”,特别是对于依赖距离计算的聚类算法。
对于“空间灾难”,一位Quora用户给出了一个很好的类比:
假设有一条100码的直线,你在这条直线的某处丢了一枚硬币。找硬币不难。你只要沿着这条线走。最多2分钟。
然后,假设有一个长100码宽的正方形,你把硬币放在正方形的某个地方。现在不容易找到。就像并排在两个足球场上找针一样。可能需要几天时间。
甄,假设是一个长、宽、高各100码的立方体,就像在一个30层楼高的大球场里找针一样...
随着维数的增加,空之间的搜索变得越来越困难。
Quora链接:
https://www . quora . com/什么是维度的诅咒/回答/Kevin-Lacker
这就需要数据降维方法:特征选择和特征提取。
4.特征选择
特征选择是从数据集中过滤掉不相关或冗余的特征。特征选择和特征提取的关键区别在于特征选择是从原始特征集中选择一个子特征集,而专名提取是在原始特征集的基础上重构一些全新的特征。
需要注意的是,一些有监督的机器学习算法已经有了固有的特征选择机制,比如正则回归和随机森林。通常我们建议先试试这些算法,如果能匹配你的问题的话。这个我们已经介绍过了。
作为一项独立的任务,特征选择可以是无监督的,也可以是有监督的。如果有必要,也可以合理整合各种方法。
4.1方差阈值
方差阈值会丢弃观测值变化不大的观测样本的特征。这样的特征价值不大。
例如,如果你有一个公共卫生数据,其中96%的人是35岁的男性,去掉“年龄”和“性别”的特征不会丢失重要信息。
由于方差阈值取决于特征值的大小,所以您应该首先归一化特征值。
优点:使用方差阈值对数据降维只需要非常可靠的直觉:特征值变化不大的特征不会带来任何有用的信息。在建模的早期阶段,这是一种相对安全的降低数据维数的方法。
缺点:如果你正在解决的问题不需要数据降维,即使使用方差阈值效果也不大。另外,你需要手动设置和调整方差阈值,这是相当技术性的。我们建议从保守的门槛开始。
实现:
python-http://sci kit-learn . org/stable/modules/generated/sklearn . feature _ selection。VarianceThreshold.html
r-https://www . rdocumentation . org/packages/caret/versions/6.0-76/topics/Nearzerovar
4.2相关阈值
相关性阈值会去除那些高度相关的特征。它们提供了多余的信息。
比如你有一个房产数据,其中两个特征分别是“房屋面积”和“房屋面积”,那么你可以去掉其中任意一个。
问题是,你应该删除哪个功能?首先,您应该计算所有特征对的相关系数。然后,如果一个特征对的相关系数大于设定的阈值,可以去掉平均绝对相关系数较大的那一个。
优点:使用相关阈值也需要可靠的直觉:相似特征提供冗余信息。对于一些相关性特征较强的数据集,一些算法不具有鲁棒性,因此去除它们可以提高整个模型的性能。).
缺点:同样,你还是要手动设置和调整相关阈值,这也是一个比较棘手和复杂的过程。另外,如果你把门槛设得太低,你会失去一些有用的信息。在任何时候,我们都倾向于使用那些内置特征选择的算法。对于没有内置特征提取的算法,主成分分析是一个很好的选择。
实现:
python-https://gist . github . com/swar chal/881976176 aae b21 E8 E8 df 486903 e 99 D6
r-https://www . rdocumentation . org/packages/caret/versions/6.0-73/topics/FindCorrelation
4.3遗传算法
遗传算法是可用于不同任务的一大类算法的总称。受进化生物学和自然选择的启发,他们将变异和交叉结合起来,在解空之间进行高效的遍历搜索。这里有一个很棒的介绍:“遗传算法背后原理介绍”。
在机器学习领域,遗传算法有两个主要用途。
首先,它用于优化,如寻找神经网络的最佳权重。
其次,用于监督特征提取。在这个用例中,“基因”代表一个单一的特征,“有机体”代表一个候选特征集。“物种种群”中的每一个生物都会根据其适应性进行评分,就像对测试数据集进行模型性能测试一样。最适合环境的生物将生存、繁殖和迭代,直到它们收敛到最优解。
优点:当穷举搜索不可行时,对高维数据集使用遗传算法会相当有效。当你的算法需要对数据进行预处理但没有内置的特征选择机制,而你又必须保留原有的特征时,遗传算法就成为你的最佳选择。在需要透明和可解释的解决方案的业务环境中,这种情况时有发生。
缺点:遗传算法给你的解决方案的实现带来了更高的复杂度,大多数情况下都是不必要的麻烦。如果可能的话,主成分分析或者其他内置的特征选择算法会更高效简洁。
实现:
python-https://pypi.python.org/pypi/deap
r-https://cran . r-project . org/web/packages/GA/vignies/GA . html
4.4荣誉奖:逐步搜索
逐步搜索是一种基于顺序搜索的监督特征选择算法。它有两种形式:正向搜索和反向搜索。
对于向前的逐步搜索,您永远不会从任何功能开始。然后,从候选特征集中选择一个特征来训练模型;然后,保存最佳模型性能对应的特征;再往下,您不断向训练模型的特征集添加特征,一次添加一个特征,直到模型的性能不再提高。
反向逐步搜索过程是一样的,只是顺序相反:所有特征都用来训练模型,然后一次去掉一个特征,直到模型性能急剧下降。
我们提到这个算法纯粹是出于一些历史原因。虽然很多教科书把逐步搜索算法看作是一种有效的方法,但是它的性能始终不如正则化等其他有监督的方法。分步搜索有很多明显的缺陷,最致命的是它是一种贪婪算法,无法面对未来变化的影响。我们不推荐这个算法。
5.特征抽出
特征提取用于创建一个新的更小的特征集,但它仍然可以保留最有用的信息。值得一提的是,特征选择是用来保留原特征集的一部分,而特征提取是用来创建新的特征集。
和特征选择一样,一些算法已经有了特征提取机制。最好的情况是深度学习,可以通过每一个隐藏的神经层,提取出越来越多能够代表原始数据的有用特征。我们已经在“深度学习”部分给出了相关解释。
特征提取作为一项独立的任务,可以是无监督的,也可以是有监督的。
5.1主成分分析
主成分分析是一种无监督算法,用于创建原始特征的线性组合。新创建的特征彼此正交,即它们不相关。具体来说,这些新功能是根据它们自身的变化程度来安排的。第一个主成分代表数据集中变化最剧烈的特征,第二个主成分代表变化程度第二的特征,依此类推。
因此,您可以通过限制主成分的数量来降低数据的维数。例如,您只能使用能够使累计可解释方差达到90%的主成分数。
在使用主成分分析之前,您需要对数据进行规范化。否则,原始数据中特征值最大的特征将支配您新创建的主成分特征。
优点:主成分分析是一种多用途技术,具有很好的实用效果。部署起来既快又简单,也就是说,无论是否使用主成分分析,都可以轻松测试算法的性能。此外,还有几种主成分分析的变体和扩展来解决具体问题。
缺点:新创建的主要组件是不可解释的,因此在某些情况下,很难在新特性和实际应用场景之间建立联系。此外,您仍然需要手动设置和调整累积可解释方差的阈值。
实现:
python-http://sci kit-learn . org/stable/modules/generated/sklearn . declaration . PCA . html
R-https://stat . ethz . ch/R-manual/R-dev/library/stats/html/pr comp . html
5.2线性判别分析
线性判别分析不是隐式的狄利克雷分布,它也用于构造原始特征集的线性组合。然而,与主成分分析不同,线性判别分析不会最大化可解释的方差,而是最大化类别之间的分离程度。
因此,线性判别分析是一种有监督的学习方法,必须使用有标签的数据集。那么,线性判别分析和主成分分析哪个方法更好呢?要看具体情况,“没有免费午餐”的原则在这里也适用。
线性判别分析也取决于特征值的大小,你也需要先对特征值进行归一化。
优点:线性判别分析是一种监督学习,通过这种方式获得的特征可以提高模型的性能。此外,线性判别分析还有一些变种,可以用来解决具体问题。
缺点:像主成分分析一样,新创建的特征是不可解释的。此外,您还需要手动设置和调整要保留的特征数量。线性判别分析需要有标记的数据,所以它使它更有基础。
实现:
python-http://sci kit-learn . org/stable/modules/generated/sklearn . discriminal _ analysis。linear discriminator analysis . html # sk learn . discriminator _ analysis。线性判别分析
R-https://stat . ethz . ch/R-manual/R-dev/library/MASS/html/LDA . html
5.3自编码机器
自编码器是一种人工神经网络,用于重构原始输入。例如,图像自编码器被训练来重新表征原始数据,而不是区分图片中的小猫和小狗。
但是有用吗?这里的关键是在隐藏层构建比输入层和输出层更少的神经元。这样隐藏层就学会了如何用较少的特征来表示原始图像。
由于输入图像被用作目标输出,自编码器被视为无监督学习。可以直接使用,也可以按顺序堆叠。
优点:自编码是人工神经网络的一种,这意味着它们可以在某些特定类型的数据上表现出色,如图像和语音数据。
缺点:自编码是人工神经网络。也就是说,他们的优化需要更多的数据进行训练。它们不能用作通用的数据降维算法。
1.《算法的特征 最全最实用的机器学习算法优缺点分析》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《算法的特征 最全最实用的机器学习算法优缺点分析》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1678227.html