当前位置: 首页 > 科技观察

回归、分类和聚类:从三个方向剖析机器学习算法的优缺点

时间:2023-03-14 12:47:40 科技观察

在本教程中,作者对现代机器学习算法进行了简短的实践回顾。虽然类似的总结有很多,但没有一个能真正说明每个算法在实践中的好坏,而这正是这篇综述希望达到的目的。因此,本文试图根据实践中的经验来讨论每种算法的优缺点。机器之心在文末也给出了这些算法的具体实现细节。对机器学习算法进行分类并不是一件容易的事。总的来说有几种方式:生成和判别、参数和非参数、有监督和无监督等等。但是,就实践经验而言,这些都不是实战过程中最有效的分类算法方法。因为对于应用机器学习,开发人员通常会有一个最终目标,例如预测结果或对您的观察结果进行分类。因此,我们想介绍另一种基于机器学习任务的算法分类方法。1.天下没有免费的午餐定理在机器学习中,有一个定理叫做“天下没有免费的午餐”。简而言之,没有解决所有问题的单一算法,对于监督学习(即建模预测)尤其如此。例如,你不能说神经网络在任何时候都一定比决策树好,反之亦然。影响这一点的因素有很多,例如数据集的大小和结构。因此,当您使用固定数据测试集来评估性能并选择最合适的算法时,您应该针对您的问题尝试多种不同的算法。当然,你使用的算法必须适合你要解决的问题,这就带来了如何选择合适的机器学习任务的问题。打个比方,如果你需要打扫你的房子,你可能会使用真空吸尘器、扫帚或拖把,但你永远不会拿出铲子开始挖掘。2.机器学习任务本次梳理涵盖当前最常见的“三”机器学习任务:回归法分类法聚类法3.说明:本文的梳理不会涵盖特定领域的问题,比如自然语言处理。本文不会对每一个算法进行梳理。因为现有的算法太多了,新的算法层出不穷。但是,此列表将为读者提供每个任务的当前代表性算法的概述。1.回归法回归法是一种对数值连续随机变量进行预测和建模的监督学习算法。用例通常包括不断变化的案例,例如房价预测、股票走势或考试成绩。回归任务的特点是带有数字目标变量的标记数据集。也就是说,每个观察样本都有一个数值地面真值来监督算法。1.1线性回归(正则化)线性回归是回归任务最常用的算法之一。该算法的形式很简单,期望用一个超平面来拟合数据集(只有两个变量时为一条直线)。如果数据集中的变量之间存在线性关系,那么就会很好地拟合。在实践中,简单的线性回归通常被使用正则化的回归方法(LASSO、Ridge和Elastic-Net)所取代。正则化实际上是一种惩罚太多回归系数以降低过度拟合风险的技术。当然,我们仍然需要确定惩罚的强度来平衡欠拟合和过拟合的模型。优点:对线性回归的理解和解释非常直观,还可以通过正则化降低过拟合的风险。此外,线性模型很容易使用随机梯度下降和新数据更新模型权重。缺点:当变量处于非线性关系时,线性回归表现不佳。而且它不够灵活,无法捕获更复杂的模式,添加正确的交互项或使用多项式既困难又耗时。Python实现:http://scikit-learn.org/stable/modules/linear_model.htmlR实现:https://cran.r-project.org/web/packages/glmnet/index.html1.2回归树(集成法)回归树(决策树的一种)通过将数据集反复划分为不同的分支来实现分层学习。分割的准则是最大化每个分离的信息增益。这种分支结构允许回归树自然地学习非线性关系。诸如随机森林(RF)或梯度提升树(GBM)之类的集成方法结合了许多独立训练的树。该算法的主要思想是将多个弱学习算法组合成一个强学习算法,这里不具体展开。在实践中,RF通常容易表现良好,而GBM更难调优,但通常梯度提升树具有更高的性能上限。优点:决策树可以学习非线性关系,对异常值具有鲁棒性。集成学习在实践中表现非常出色,经常赢得许多经典(非深度学习)机器学习竞赛。缺点:不受约束,单棵树容易过拟合,因为单棵树可以保留分支(不剪枝)直到它记住训练数据。集成方法可以减轻这一缺点的影响。随机森林Python实现:http://scikit-learn.org/stable/modules/ensemble.html#random-forests随机森林R实现:https://cran.r-project.org/web/packages/randomForest/index.html梯度提升树Python实现:http://scikit-learn.org/stable/modules/ensemble.html#classification梯度提升树R实现:https://cran.r-project.org/web/packages/gbm/index.html1.3深度学习深度学习是指可以学习极其复杂模式的多层神经网络。该算法在输入层和输出层之间使用一个隐藏层来对数据的中间表示进行建模,这也是其他算法难以学习的。深度学习中还有其他几个重要的机制,例如卷积和丢弃,它们可以让算法有效地学习高维数据。然而,深度学习比其他算法需要更多的数据,因为它需要估计更大数量级的参数。优点:深度学习是目前某些领域最先进的技术,比如计算机视觉和语音识别。深度神经网络在图像、音频和文本等数据上表现良好,并且该算法也很容易使用反向传播算法对新数据更新模型参数。它们的架构(即层的数量和结构)可以适应各种问题,隐藏层也减少了算法对特征工程的依赖。缺点:深度学习算法一般不适合作为通用算法,因为它们需要大量的数据。事实上,深度学习在经典机器学习问题上的表现往往不如集成方法。此外,它在训练中是计算密集型的,因此这需要更有经验的人来调整参数(即设置架构和超参数)以减少训练时间。Python资源:https://keras.io/R资源:http://mxnet.io/1.4最近邻算法最近邻算法是“instance-based”的,也就是说它需要保留训练样本的每一次观察.最近邻算法通过搜索最相似的训练样本来预测新观察样本的值。但是该算法占用大量内存,对高维数据的处理效果不是很好,需要一个高效的距离函数来衡量和计算相似度。在实践中,基本上使用正则化回归或树集成方法是最好的选择。2.分类方法分类方法是一种用于建模或预测离散随机变量的监督学习算法。用例包括诸如电子邮件过滤、财务欺诈和预测员工流失等任务作为输出类别。许多回归算法都有对应的分类算法,分类算法通常适用于预测类别(或类别的概率)而不是连续值。2.1逻辑回归(正则化)逻辑回归是与线性回归相对应的一种分类方法,算法的基本概念来源于线性回归。Logistic回归通过Logistic函数(即Sigmoid函数)将预测映射到0到1的中间,所以预测值可以看作是某一类别的概率。该模型仍然是“线性的”,因此该算法只有在数据线性可分(即数据可以被超平面完全分离)的情况下才能表现良好。类似地,Logistic模型可以通过惩罚模型系数来正则化。优点:输出有很好的概率解释,也可以对算法进行正则化,避免过拟合。Logistic模型很容易使用随机梯度下降和新数据更新模型权重。缺点:逻辑回归在多重或非线性决策边界上表现不佳。Python实现:http://scikit-learn.org/stable/modules/linear_model.html#logistic-regressionR实现:https://cran.r-project.org/web/packages/glmnet/index.html2.2分类树(ensemblemethods)回归树对应的分类算法就是分类树。它们通常指的是决策树,或者更严格地称为“分类回归树(CART)”,也就是非常有名的CART算法。简单随机森林的优点:与回归方法一样,分类树的集成方法在实践中也表现非常好。它们通常非常健壮并且可扩展到异常数据。由于其层次结构,分类树的集成方法可以自然地模拟非线性决策边界。缺点:不受约束,单棵树容易过拟合,使用集成的方法可以削弱这种效果。随机森林Python实现:http://scikit-learn.org/stable/modules/ensemble.html#regression随机森林R实现:https://cran.r-project.org/web/packages/randomForest/index.html梯度提升树Python实现:http://scikit-learn.org/stable/modules/ensemble.html#classification梯度提升树R实现:https://cran.r-project.org/web/packages/gbm/index.html2.3深度学习深度学习也很容易适应分类问题。事实上,深度学习更多的应用于分类任务,比如图像分类。优点:深度学习非常适合对音频、文本和图像数据进行分类。缺点:与回归问题一样,深度神经网络需要大量数据进行训练,因此不是通用算法。Python资源:https://keras.io/R资源:http://mxnet.io/2.4支持向量机支持向量机(SVM)可以使用称为核函数的技巧扩展到非线性分类问题,而算法本质上是计算称为支持向量的两个观测值之间的距离。SVM算法寻找的决策边界就是最大化它与样本区间的边界,所以支持向量机也被称为大间距分类器。支持向量机中的核函数采用非线性变换,将非线性问题转化为线性问题。例如SVM利用线性核函数可以得到类似于逻辑回归的结果,但是支持向量机由于区间最大化而没有得到优化。更健壮。因此,在实际应用中,SVM的最大优势在于它可以使用非线性核函数对非线性决策边界进行建模。优点:SVM可以对非线性决策边界进行建模,有多种可选的核函数形式。SVM对过度拟合也非常稳健,尤其是在高维空间中。缺点:然而,SVM是一种内存密集型算法,由于选择正确核函数的重要性,难以调整并且不能扩展到更大的数据集。目前在工业界,随机森林往往优于支持向量机算法。Python实现:http://scikit-learn.org/stable/modules/svm.html#classificationR实现:https://cran.r-project.org/web/packages/kernlab/index.html2.5朴素贝叶斯朴素贝叶斯(NB)是一种基于贝叶斯定理和特征条件独立假设的分类方法。本质上,朴素贝叶斯模型是一个概率表,通过训练数据更新这个表中的概率。为了预测一个新的观测值,朴素贝叶斯算法就是根据样本的特征值,在概率表中找到概率最高的类别。之所以称为“简单”,是因为该算法的核心是特征条件独立的假设(每个特征是相互独立的),而这个假设在现实世界中基本是不现实的。优点:朴素贝叶斯在实践中表现出奇的好,尽管条件独立假设很难成立。该算法易于实现,并且可以随着数据集的更新而扩展。缺点:朴素贝叶斯经常被上面列出的分类算法所取代,因为它太简单了。Python实现:http://scikit-learn.org/stable/modules/naive_bayes.htmlR实现:https://cran.r-project.org/web/packages/naivebayes/index.html3.聚类一种无监督学习任务,其中算法根据数据的内部结构找到观察样本的自然组(即集群)。用例包括细分客户、聚类新闻、推荐文章等。因为聚类是一种无监督学习(即数据没有标记),通常使用数据可视化来评估结果。如果有“正确答案”(即训练集中预先标记的簇),那么分类算法可能更合适。3.1K均值聚类K均值聚类是一种通用算法,聚类的度量是基于样本点之间的几何距离(即坐标平面内的距离)。集群是围绕集群中心的一群人,集群呈球形,大小相近。聚类算法是我们推荐给初学者的算法,因为它不仅简单而且足够灵活,可以为大多数问题给出合理的结果。优点:K-means聚类是最好的聚类算法,因为它足够快,足够简单,而且如果你预处理数据和特征工程很好,它会非常灵活。缺点:算法需要指定簇数,K值的选择通常不太容易确定。此外,如果训练数据中的真实聚类不是球形的,则K-means聚类将产生一些较差的聚类。Python实现:http://scikit-learn.org/stable/modules/clustering.html#k-meansR实现:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html3.2AffinityPropagationClusteringAP聚类算法是一种比较新的聚类算法,它根据两个样本点之间的图距离来确定聚类。使用这种聚类方法的聚类具有更小且不相等的大小。优点:该算法不需要指定簇数(但需要指定“样本偏好”和“阻尼”等超参数)。缺点:AP聚类算法的主要缺点是训练速度比较慢,需要大量内存,很难扩展到大数据集。此外,该算法还假设底层集群是球形的。Python实现:http://scikit-learn.org/stable/modules/clustering.html#affinity-propagationR实现:https://cran.r-project.org/web/packages/apcluster/index.html3.3级别聚类(Hierarchical/Agglomerative)层次聚类是基于以下概念的一系列聚类算法:最初,一个数据点被用作一个集群对于每个集群,该过程基于相同的标准重复合并集群,直到只有一个是左集群,因此获得了集群的层次结构。优点:层次聚类的主要优点是不再需要假设簇是球形的。此外,它还可以扩展到大数据集。缺点:有点像K-means聚类,算法需要设置簇数(即算法完成后需要保留的层级)。Python实现:http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clusteringR实现:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/hclust.html3.4DBSCANDBSCAN是一种基于密度的算法,它将样本点的密集区域分组到一个簇中。最近还有一项名为HDBSCAN的开发,它允许不同密度的集群。优点:DBSCAN不需要假设球形簇,性能可扩展。此外,它不需要将每个点都分配给一个集群,这减少了集群中的离群数据。缺点:用户必须调整定义簇密度的两个超参数“epsilon”和“min_sample”。DBSCAN对这些超参数非常敏感。Python实现:http://scikit-learn.org/stable/modules/clustering.html#dbscanR实现:https://cran.r-project.org/web/packages/dbscan/index.html4.结论本文首先从回归问题、分类问题和聚类问题三个角度,初步了解了各个算法的优缺点,也基本了解了那些算法是什么。然而,上述每个算法都有更多的概念和细节没有展示。我们无法知道他们的损失函数是什么,训练目标是什么,权重更新策略是什么等等。因此,我们希望通过搜索机器之心之前的一些文章,为感兴趣的读者提供这些算法的具体细节。线性回归:初学者TensorFlow机器学习:如何实现线性回归?(练习题)DecisionTree(IntegratedMethod):FromScratch:ImplementingDecisionTreeAlgorithminPythonSupportVectorMachine:SupportVectorMachine详解(附学习资源)DeepLearning:深度神经网络全面概述:从基本概念到实际模型andhardware-basedclusteringalgorithms:机器理解大数据的秘密:聚类算法详解***,无论是基本概念还是具体算法,最重要的是实践。不去实践这些算法,你永远不会发现自己遗漏了什么,所以希望这篇文章能帮助读者去实践自己的算法。原文:https://elitedatascience.com/machine-learning-algorithms#regression【本文为机器之心专栏原创翻译,微信公众号“机器之心(id:almosthuman2014)”】点此查看作者更多好文章