机器学习算法的分类是棘手的,有几种合理的分类,他们可以分为生成/识别,参数/非参数,监督/无监督等。
例如,Scikit-Learn的文档页面通过学习机制对算法进行分组。这产生类别如:1,广义线性模型,2,支持向量机,3,最近邻居法,4,决策树,5,神经网络,等等…
但是,从我们的经验来看,这并不总是算法分组最为实用的方法。那是因为对于应用机器学习,你通常不会想,“今天我要训练一个支持向量机!”相反,你心里通常有一个最终目标,如利用它来预测结果或分类观察。
图片来源于网络
所以在机器学习中,有一种叫做“没有免费的午餐”的定理。简而言之,它的意思就是说没有任何一种算法可以完美地解决每个问题,这对于监督式学习(即预测性建模)尤其重要。
例如,你不能说神经网络总是比决策树好,反之亦然。有很多因素在起作用,比如数据集的大小和结构。因此,您应该为您的问题尝试许多不同的算法,同时使用数据的“测试集”来评估性能并选择优胜者。
当然,你尝试的算法必须适合你的问题,这就是选择正确的机器学习算法的重要性之所在。打个比方,如果你需要清理你的房子,你可以使用真空吸尘器,扫帚或拖把,但是你不会拿出一把铲子然后开始挖掘。
因此,我们想要介绍另一种分类算法的方法,即通过机器学习所负责的任务来分类。
回归是一种用于建模和预测连续数值变量的监督学习任务。例如预测房地产价格,股价变动或学生考试分数。
回归任务的特征是具有数字目标变量的标记数据集。换句话说,对于每个可用于监督算法的观察结果,您都有一些“基于事实”的数值。
线性回归是回归任务中最常用的算法之一。它最简单的形式是试图将一个直的超平面整合到你的数据集中(即当你只有两个变量的时候,你只能得到一条直线)。正如您可能猜到的那样,当数据集的变量之间存在线性关系时,它的效果是非常好的。
实际上,简单的线性回归经常被正则化的同类算法(LASSO,Ridge和Elastic-Net)所忽略。正则化是一种惩罚大系数的技术,以避免过度拟合,它应该调整其惩罚的力度。
优点:线性回归可以直观地理解和解释,并且可以正则化以避免过度拟合。另外,使用随机梯度下降的新数据可以很容易地更新线性模型。
缺点:当存在非线性关系时,线性回归表现不佳。它们本身并不具有足够的灵活性来捕捉更为复杂的模式,对于添加正确的交互作用项或者多项式来说可能会非常棘手和耗时。
实现:Python/ R
回归树(决策树的一种)是通过将数据集反复分割成单独的分支来实现分层化学习,从而最大化每个分割信息的增益效果。这种分支结构允许回归树自然地学习非线性关系。
随机森林(RF)和梯度增强树(GBM)等集成方法结合了许多单独树的特性。我们不会在这里介绍他们的基本机制,但是在实践中,随机森林通常表现地非常好,而梯度增强树则很难调整,但是后者往往会有更高的性能上限。
优点:回归树可以学习非线性关系,并且对异常值相当敏锐。在实践中,回归树也表现地非常出色,赢得了许多经典(即非深度学习)的机器学习比赛。
缺点:无约束的单个树很容易过拟合,因为它们可以保持分支直到它们记住了所有的训练数据。但是,这个问题可以通过使用集成的方式来缓解。
实现:随机森林 - Python / R,梯度增强树 - Python / R
深度学习是指能学习极其复杂模式的多层神经网络。他们使用输入和输出之间的“隐藏层”来模拟其他算法难以学习的数据中介码。
他们有几个重要的机制,如卷积和丢弃,使他们能够有效地从高维数据中学习。然而,与其他算法相比,深度学习仍然需要更多的数据来训练,因为这些模型需要更多的参数来实现其更准确的推测。
优点:深度学习是在诸如计算机视觉和语音识别等领域内,目前可以被利用的最先进的方法。深度神经网络在图像,音频和文本数据上表现地非常出色,可以轻松地使用成批量的传播方法来更新数据。它的体系结构(即层的数量和结构)可以适应许多类型的问题,并且它们的隐藏层减少了对特征工程的需要。
缺点:深度学习算法不适合作为通用算法,因为它们需要大量的数据。事实上,对于传统的机器学习问题,它们的表现通常逊色于决策树。另外,它们需要密集型的计算训练,而且需要更多的专业知识来做调试(即设置架构和超参数)。
实现:Python/ R
最近邻居算法是“基于实例的”,这意味着它会保存每个训练观察的结果。然后,通过搜索最相似的训练观察值并汇集结果,来预测新的观测值。
这些算法是内存密集型的,对于高维度数据的表现不佳,并且需要有意义的距离函数来计算相似度。在实践中,训练正则化回归或决策树可能会更节省你的时间。
分类是建模和预测分类变量的监督学习任务。例如预测员工的流失,垃圾邮件,财务欺诈或者学生信件等级。
如你所见,许多回归算法都有分类对应。这种算法适用于预测类(或类概率)而不是实数类。
逻辑回归是线性回归的分类对应。它预测被映射到介于0和1之间的逻辑函数,这意味着预测可以被解释为类概率。
模型本身仍然是“线性的”,所以当你的类是线性可分的(即它们可以被一个单一的决策表面分开)时候,逻辑回归算法十分有效。 逻辑回归也可以通过具有可调惩罚强度的系数来实现正则化。
优点:数据的输出有一个很好的概率解释,算法可以正则化以避免过度拟合。 逻辑回归可以使用随机梯度下降的方法使得新数据的更新变得更为轻松。
缺点:当存在多个或非线性的决策边界时,逻辑回归往往表现不佳。它不够灵活,无法自然地捕捉到更复杂的关系。
实现:Python/ R
分类树是回归树的分类对应算法。它们俩被统称为“决策树”,或者被称为“分类和回归树(CART)”。
优点:与回归树一样,集成分类树在实践中的表现也很好。它们对于异常值的控制是可靠的和可扩展的,并且由于它们的层次结构,能够自然地对非线性决策边界进行建模。
缺点:不受约束的单个树容易过度拟合,但是这可以通过集成方法来缓解。
实现:随机森林 - Python / R,梯度增强树 - Python / R
延续其一贯的趋势,深度学习也很容易适应分类问题。实际上,深度学习往往是分类中比较常用的方法,比如在图像分类中。
优点:在分类音频,文本和图像数据时,深度学习表现地非常出色。
缺点:与回归一样,深度神经网络需要大量的数据进行训练,所以它不被视为通用算法。
实现:Python的/ R
支持向量机(SVM)使用称为核心(kernels)的机制,它计算两个观察对象之间的距离。随后支持向量机算法找到一个决策边界,最大化不同类别的最近成员之间的距离。
例如,具有线性内核的支持向量机类似于逻辑回归。因此,在实践中,支持向量机的好处通常来自于使用非线性的内核来建模一种非线性的决策边界。
优点:支持向量机可以模拟非线性决策边界,并有许多内核可供选择。它们对于过度拟合的控制力也相当强大,特别是在高维空间。
缺点:然而,支持向量机是难以调整的内存密集型算法,而且很依赖于选择正确的核心,并且不能很好地扩展到较大的数据集里。目前在行业中,随机森林通常优于支持向量机。
实现:Python/ R
朴素贝叶斯(NB)是一个基于条件概率和计数的非常简单的算法。从本质上讲,你的模型实际上是一个概率表,通过你的训练数据得到更新。为了预测一个新的观察结果,您只需根据其“特征值”,在“概率表”中查找该类的概率。
它被称为“朴素的”,是因为它条件独立的核心假设(即所有输入特征是相互独立的),这在现实世界中很少成立。
优点:即使条件独立性假设很少成立,但朴素贝叶斯模型在实践中表现得非常出色,特别是它十分简单。而且很容易实现,并可以和数据集同步扩展。
缺点:由于其简单化的原因,朴素贝叶斯模型经常被经过适当训练的其他模型和之前已经列出的算法吊打。
实现:Python/ R
聚类是一种无监督的学习任务,用于基于数据集中的固有结构来发现自然的观测分组(即聚类)。例子包括客户细分,电子商务中的类似项目分组以及社交网络分析。
因为聚类是无监督的(即没有“正确答案”),所以通常使用可视化的数据来评估结果。如果有“正确的答案”(即你的训练集中有预标记的聚类),那么选择分类算法通常更合适。
K-Means算法是一种通用算法,它根据点之间的几何距离(即坐标平面上的距离)进行聚类。这些集群围绕着质心分组,使它们成为球形,并具有相似的大小。
对于初学者来说,这是我们推荐的一种算法,因为它很简单,而且足够灵活,可以为大多数问题获得合理的结果。
优点:K-Means算法是最流行的聚类算法,因为如果您想预处理数据或者编译有用的功能,它是一种快速,简单和拥有令人惊讶的灵活性的一种算法。
缺点:用户必须指定簇的数目,这并不总是很容易的。另外,如果数据中真实的底层聚类不是球状的,那么K-Means算法将产生错误的聚类。
实现:Python/ R
近邻传播是一种相对较新的聚类技术,可以根据点之间的图距进行聚类。集群倾向于变得更小和具有不均匀的大小。
优点:用户不需要指定簇的数量(但是需要指定“样本偏好”和“阻尼”超参数)。
缺点:近邻传播的主要缺点是速度很慢,占用内存很大,难以扩展到较大的数据集。另外,它也需要假设真正的底层集群是球状的。
实现:Python/ R
分层聚类,又名聚集聚类,是基于相同思想的一套算法:(1)从它自己的聚类中的每个点开始。 (2)对于每个簇,根据一些标准将其与另一个簇合并。 (3)重复,直到只剩下一个群集,并留下一个簇的层次结构。
优点:分层聚类的主要优点是不会假设球体是球状的。另外,它可以很好地扩展到更大的数据集里。
缺点:就像K-Means算法一样,用户必须选择聚类的数量(即在算法完成之后要保留的层次级别)。
实现:Python/ R
DBSCAN是一种基于密度的算法,可以为密集的点区域生成集群。还有一个最近的新发展被称为HDBSCAN,允许产生密度不同的集群。
优点:DBSCAN不假设集群为球状,其性能也是可扩展的。另外,它不需要将每个点都分配给一个簇,从而减少簇的噪声(这可能是一个弱点,取决于你的用的地方)。
缺点:用户必须调用超参数“epsilon”和“min_samples”,它们定义了簇的密度。 DBSCAN对这些超参数非常敏感。
实现:Python/ R