天天看点

《R语言机器学习:实用案例分析》——2.3节算法家族

本节书摘来自华章社区《r语言机器学习:实用案例分析》一书中的第2章,第2.3节算法家族,作者[印度] 拉格哈夫·巴利(raghav bali)迪潘简·撒卡尔(dipanjan sarkar),更多章节内容可以访问云栖社区“华章社区”公众号查看

2.3 算法家族

在机器学习领域中有大量的算法,并且每年都有越来越多的算法被设计出来。在这个领域中有大量的研究,因此算法列表在不断地增加。并且,算法的使用越多,算法的改进也就越多。机器学习是一个工业和学术共同发展的领域。

但是,正如蜘蛛侠被告知的“力量越大责任越大”一样,你应该也能理解掌握机器学习带来的责任。面对如此之多可用的算法,有必要了解它们是什么,适用于何种情况。在起初或许会感到无所适从和困惑,但是把这些算法进行分类是有帮助的。

机器学习算法可以通过多种方式进行分类。最普遍的方式是将它们分为有监督学习算法和无监督学习算法。

2.3.1 有监督学习算法

有监督学习算法是在一个称为训练数据集的预定义的数据集上进行训练的算法。训练数据集通常是由一个输入元素和一个预期输出元素或信号构成的一个二元组。一般情况下,输入元素是一个向量。有监督学习算法应用训练数据集来生成期望的函数。然后将这样生成(或推断出)的函数用于正确地映射新数据(更好的术语是测试数据)。

一个已经学习好的算法能够以合理的方式确定未知数据的输出。这将带来泛化和过度拟合的概念。

简而言之,泛化是指一个算法以正确的方式,把基于(有限的)训练数据得到的期望函数推广到处理未知数据。过度拟合恰好是与泛化相反的概念,是指算法推断函数使得它准确地映射到训练集(包括噪声)。当该算法学习得到的函数用来检验新的/未知的数据时,这可能会导致巨大的误差。

泛化和过度拟合都是围绕输入数据集中的随机误差或噪声而言的。虽然泛化尝试最小化噪声的影响,但过度拟合却通过拟合噪声产生相反的效果。

应用有监督学习算法来解决的问题可以划分为下列步骤:

1)准备训练集:数据准备是所有机器学习算法的最重要步骤。由于有监督学习算法使用带标签的输入数据集(对于给定的输入有相应的输出数据集),因此这一步就变得更加重要。这个数据集通常由专业人员或通过测量来给出标签。

2)准备模型:模型是输入数据集和学习到的模式(learnt pattern)的一种表示方式。模型的表示方式受许多因素影响,例如输入特征和学习算法本身。推导得到的函数的准确性也依赖于如何形成这种表示形式。

3)选择算法:基于待解决问题和输入信息,选择算法并解决问题。

4)测试与调整:将算法反复运行输入数据并调整参数以获得预期的输出。然后在测试数据集上测试该算法,以评估算法的性能并测量误差。

在有监督学习算法下,有两个主要的子类别:

1)基于回归的机器学习算法:这是一类帮助我们回答定量问题的学习算法,例如有多少?有多大?它们的输出一般是连续值。更正式地说,这些算法基于训练数据和构建的模型来预测未知的/新的数据的输出值。在这种类型的算法中,输出值都是连续的。线性回归、多元回归、回归树等都是有监督回归算法。

2)基于分类的机器学习算法:这是一类帮助我们回答客观问题或“是–或–否”预测问题的学习算法。例如,某个组成部分是否存在错误?某个肿瘤是否会导致癌症?更正式地说,这些算法基于训练数据和构建的模型来预测未知的/新的数据的分类标签。支持向量机(support vector machine,svm)、决策树、随机森林等是几个经常使用的有监督分类

算法。

让我们详细地了解有监督学习算法。

2.3.1.1 线性回归

正如之前所介绍的,回归帮助我们解决定量问题。回归来源于统计学领域。研究人员使用线性关系来预测给定输入值x的输出值y。这个线性关系称作线性回归或回归线。

在数学上,线性回归表示为:

y = b0 + b1x

这里,b0是截距(直线与y轴的交点);b1是直线的斜率(y随x的变化量)。

上式与直线的表达式十分类似,因此它命名为线性回归。

现在,我们应该如何为输入值确定拟合直线,以便它能够很好地预测未知的数据呢?对此,我们需要一个误差度量。有许多误差度量方法,最普遍使用的是最小二乘法(least squares method)。

在我们定义最小二乘法之前,我们首先需要了解术语残差(residual)。残差就是y值与拟合值的偏差。其数学形式为:

残差i = yi-?i

这里,?i是y的拟合值。

最小二乘法表示当残差平方和是最小的时得到的拟合数据的最优模型。

数学形式为:

《R语言机器学习:实用案例分析》——2.3节算法家族

我们使用微积分最小化残差平方和,并得到相应的系数。

既然我们已经了解了线性回归,那么让我们来看一个线性回归的实际案例。

假设我们有关于学校学生的身高和体重的数据。数据科学家试图考虑这些孩子的身高与体重之间是否有相关性。正式地,能根据给定的孩子身高(height)预测他们的体重(weight)吗?

为了拟合一个线性回归模型,第一步是了解数据,观察两个变量(体重和身高)之间是否存在相关性。由于在这个案例中,我们只处理两个维度,所以使用散点图可视化数据能够帮助我们快速理解数据。这也将帮助我们确定变量之间是否存在线性关系。

首先,让我们准备数据,并使用散点图可视化数据,同时给出相关系数。

《R语言机器学习:实用案例分析》——2.3节算法家族
《R语言机器学习:实用案例分析》——2.3节算法家族
《R语言机器学习:实用案例分析》——2.3节算法家族

散点图与回归计算的回归直线

因此,我们已经看到了如何确定两变量之间的关系,并使用几行代码进行预测。但是我们还没有完成全部内容。在决定是否使用线性回归前,读者必须了解以下两点。

当且仅当满足以下条件时线性回归才能根据给定的输入来预测输出值:

散点图呈现线性模式。

输入变量与输出之间存在强相关性(大于0.5或小于-0.5)。

当以上两个条件只满足其中一个时,将导致错误的预测或完全无效的模型。例如,如果我们只检查了相关性并发现具有强相关性,而跳过绘制散点图的步骤,那么当数据本身有曲线形状,而你试图拟合一条直线时(记住曲线数据也能呈现强相关性,因此将导致错误),它将导致无效的预测。

重要的是记住相关性并不说明具有因果关系。简单来说,两个变量的相关性不一定说明其中一个变量是另一个变量的原因。可能的情况是,由于第三个变量,即混淆变量(cofounding variable),导致这两个变量之间的因果关系是间接相关的。用来描述这个问题最常见的例子是鞋子尺码和阅读能力之间的关系。从调查数据(如果存在的话!)来看,更高的阅读能力与更大的鞋子尺码相关,但是很明显这并不意味着大脚导致良好的阅读能力。或许更令人感兴趣的是,年轻孩子有着小脚,还没有教会他们如何阅读。这种情况下,两个变量都与年龄有更准确的相关性。

在我们之前使用的体重和身高的例子中,现在你应该已经得到了类似的结论。是的,先前的例子也会得到类似的谬误,但是我们使用那个例子只是作为一个简单的回归分析的示例。留意各种案例,尝试建立不存在这种伪因果关系的模型。

在金融领域中可以找到线性回归的应用,例如在投资中用回归模型对风险进行量化。在经济学中像趋势线分析等,回归分析也有广泛的应用。

除了线性回归,还有逻辑回归、逐步回归、多元自适应样条回归(mars)等大量有监督回归学习算法。

2.3.1.2 k近邻(knn)

k近邻或knn算法不管在实现上,还是在易于理解方面都是最简单的算法之一。它们是另一种帮助我们对数据进行分类的有监督学习算法。

knn可以简单地用柏拉图(plato)的名言“类似的和类似的聚合在一起”来描述,即相似的事物可能有相似的特征。knn就使用这个概念,基于一个数据点和它附近点的相似度来给出这个点的标签。

正式地,knn可以描述为:把未标记(或未知类别)数据点分类为与它最相似的已标记数据点(或训练样本)的类别的过程。

knn是一种有监督学习算法。因此,它从已经分类的数据样本所构成的训练数据集开始。然后,选择测试数据集中的每一个数据点,基于一个选定的相似性度度量,确定其k个最邻近点(这里k是预先指定的)。然后将数据点赋予这k个最邻近点中的大多数点所属的那个类别。

knn背后的玄机是相似性度量。有许多种不同的相似度量可以供我们使用。而选择哪一种方法取决于问题的复杂度、数据的类型等。欧几里得距离(euclidean distance)是最常用的一种距离度量。欧几里得距离是指两点之间的最短直接距离,其数学表达式如下所示:

欧几里得距离(p, q)=

曼哈顿距离(manhattan distance)、余弦距离(cosine distance)和闵可夫斯基距离(minkowski distance)是其他一些可以用来寻找最邻近点的距离度量。

《R语言机器学习:实用案例分析》——2.3节算法家族

knn算法中的另一个参数是邻近点中的数值k。k的值决定了knn模型对于测试数据的泛化的好坏程度。训练数据的过度拟合和欠拟合之间的平衡依赖于k的值。稍微思考一下,便能很容易理解,一个大的k的值将最小化噪声数据导致的变化,但同时也将低估了数据中细小但却十分重要的模式。这种问题称为偏差–变化权衡(bias-variance tradeoff)。

尽管k的最优值很难确定,但一般选择位于1和训练样本总数之间的一个值。一个常见的方法是使k的值等于训练实例个数的平方根,通常为3到10。虽然常见的实践,但k的值依赖于学习概念的复杂度和训练实例的个数。

knn算法的下一步是数据准备。输入向量中使用的特征应当在类似的范围内。这样做的理由是,距离公式依赖于特征是如何测量的。例如,如果与其他特征相比,某个特征有大的值域,则距离度量将由该特征的测量值决定。将特征的取值范围缩放为一个相似范围的方法称为标准化(normalization)。与距离度量一样,有许多种标准化的方法可供使用。其中一种方法是min-max标准化(min-max normalization),其数学公式如下所示:

《R语言机器学习:实用案例分析》——2.3节算法家族

在我们通过案例理解knn之前,让我们列出执行knn算法的步骤:

1)收集和探索数据:我们需要收集与学习的概念相关的数据。我们还需要探索数据,了解不同的特征,知道各个特征的取值范围,确定类别标签。

2)标准化数据:正如先前讨论的,knn依赖于距离度量,这使得通过标准化数据来剔除计算中的任何不一致性或偏差变得十分重要。

3)生成训练数据集和测试数据集:由于学习一个概念并把准备的模型以可接受的程度泛化到未知数据是十分重要的,所以我们需要准备训练数据集和测试数据集。测试数据集尽管已经有了类别标签,但它用来确定把模型学习到的概念一般化的准确性和能力。一种普遍的做法是将输入数据中的2/3作为训练数据集,1/3作为测试数据集。同样重要的是,这两个数据集应当是所有类别标签和数据点的良好混合,即这两个数据集应当是所有数据的有代表性的子集。

4)训练模型:既然我们已经准备好了,那么我们可以使用训练数据集、测试数据集、标签和k的值来训练我们的模型,并给出测试数据集中数据点的标签。

5)评估模型:最后的步骤是评估学习到的模式。在这一步中,我们通过将算法预测得到的测试数据集的类别标签与它们已知的标签比较来决定算法的好坏。通常我们会准备一个混淆矩阵。

现在,让我们看一看knn的实例。我们将要处理的问题是基于给定的特征,将不同类别的花进行分类。对于这个特殊的例子,我们将使用鸢尾属植物(iris)数据集。这个数据集内置于r的默认安装中。

(1)收集和探索数据

第一步是收集和探索数据。让我们首先获取数据。

为了检查你的系统中是否已经有了所需要的数据集,输入数据集名称:

《R语言机器学习:实用案例分析》——2.3节算法家族
《R语言机器学习:实用案例分析》——2.3节算法家族
《R语言机器学习:实用案例分析》——2.3节算法家族

上图清晰地说明了,iris数据集中的鸢尾花setosa(iris-setosa)的花瓣宽度和花瓣长度有很高的相关性,而其他两种鸢尾花的花瓣宽度和花瓣长度的相关性要小一些。

再次尝试可视化萼片的宽度和长度,并观察它们之间是否有相关性。

(2)标准化数据

下一步是标准化数据,从而使所有特征的取值都在相同的范围内。正如在上面数据探索步骤中所看到的,所有鸢尾花的属性值都或多或少在一个可比较的范围内。但是,为了这个例子,我们还是编写一个min-max标准化函数:

《R语言机器学习:实用案例分析》——2.3节算法家族

(3)生成训练数据集和测试数据集

既然我们已经将数据标准化,那么下面将其分为训练数据集和测试数据集。我们将遵循通常的2/3为训练数据集、1/3为测试数据集的规则。正如之前所说的,这两个数据集都应该是完整数据的代表子集,因此我们需要选择合适的样本。我们将使用r中的sample()函数准备样本。

《R语言机器学习:实用案例分析》——2.3节算法家族

(4)从数据中学习和训练模型

一旦我们准备好了训练数据集和测试数据集,我们就可以进入下一步,应用knn对数据中学习。在r的添加包class中实现了knn在算法。knn函数使用以下输入参数:

train:包含训练数据的数据框。

test:包含测试数据的数据框。

class:包含类别标签的向量,也叫作因子向量(factor vector)。

k:k邻近点中k的值。

对于我们当前的例子,我们假设k的值为3。奇数通常有利于打破并列情况。knn的运行如下所示:

《R语言机器学习:实用案例分析》——2.3节算法家族
《R语言机器学习:实用案例分析》——2.3节算法家族

从之前的输出我们可以发现,模型除了将一个virginica个案错误地标记为versicolor外,其他测试数据集中的点都被正确地标记。这也使我们可以推断出,选择k = 3的效果已经足够好了。我们鼓励读者尝试应用不同的k值,用同样的案例进行计算,观察结果之间的差异。

knn是一个简单但是强大的算法,它没有假设底层的数据分布,因此可以用在特征与类别之间的关系是复杂的或者难以理解的情况下。

该算法的缺点是,由于knn需要大量的存储空间来处理数据,所以它是一个资源密集型算法。由于算法依赖于距离度量,并且缺失数据需要进一步处理,所以这些对于该算法来说是额外的负担。

即使有这些限制,但knn还是大量应用在实际生活中,例如文本挖掘、预测心脏病、预测癌症等。同时,knn还在金融和农业领域有广泛应用。

在最普遍和广泛使用的有监督分类算法中,还包括决策树、随机森林和支持向量机等。

2.3.2 无监督学习算法

无监督学习算法指的是能够自己学习概念的算法。既然我们已经熟悉了有监督学习的概念,那么让我们来了解一下无监督学习。

有监督学习需要带标签的训练数据集,而无监督学习则不同,它的任务是寻找没有任何标签的训练数据集中的关系和模式。这些算法通过处理输入数据,挖掘规律、检测模式、汇总和分组数据点,来帮助推导出有意义的洞察力并为用户描述数据。在无监督学习算法中,没有训练数据集和测试数据集的概念。相反,正如之前所说,输入数据在这里用于分析以便找出模式和关系。

与有监督学习类似,无监督学习算法也可以分为两类:

基于关联规则的机器学习算法:这些算法通过挖掘输入数据来识别模式和规律。这些规律可以解释数据集中变量之间的有趣关系,描述数据中出现的频繁项集和模式。这些规律可以帮助任何企业或组织从庞大的数据库中发现有用的信息。最常见的算法包括apriori和fp-growth。

基于聚类的机器学习算法:与有监督学习中的分类算法类似,聚类算法的主要目的是,只使用输入数据中的特征而不使用任何外部信息,将输入数据点聚集或分组成不同的类或类别。与分类算法不同,在聚类之前,输出标签是未知的。一些常见的聚类算法包括k均值、k中心点和层次聚类等。

下面让我们看看一些无监督学习算法。

2.3.2.1 apriori算法

该算法由agarwal和srikant自1993年提出后就迅速风靡全世界。它用来处理交易数据,每一个交易都是一组项目集合或项集。简而言之,这个算法识别数据集中至少含有c个交易的项目子集。

正式地,设┬为项目合,d为交易集合,每一个交易t都是┬的一个子集。应用数学表达式,则为:

如果交易集合d中%c的交易既包含x也包含y,则称规则x→y在交易集d中以置信度c成立。如果d中%s的交易包含x∪y,则称关联规则x→y具有支持度s。因此,给定一个交易集d,识别关联规则的任务就是生成所有置信度和支持度大于用户定义的minsup(最小支持度阈值)和mincon(最小置信度阈值)的规则。

广泛地讲,该算法包括两个步骤,第一步识别一个频数超过预定阈值的项目(itemset)。这个项集称为频繁项集(frequent itemset)。第二步从识别出的频繁项集中生成满足最小置信度和最小支持度的关联规则。

这两个步骤都可以用如下伪代码更好地解释:

《R语言机器学习:实用案例分析》——2.3节算法家族
《R语言机器学习:实用案例分析》——2.3节算法家族

apriori算法使用adult数据集作为输入,识别交易数据中的规则和模式。通过观察汇总数据(summary),我们可以看到,该算法成功地识别了84条分别满足50%最小支持度和80%最小置信度的规则。既然我们已经识别了这些规则,规则的具体信息如下:

《R语言机器学习:实用案例分析》——2.3节算法家族

关联规则以x→y的形式表示,其中x是先导(lhs或left-hand side),y是后继(rhs或right-hand side)。上图还显示了相应的置信度和支持度。根据输出我们推断,如果人们全职工作,那么他们面临资本损失的可能几乎不存在(置信度为95.8%)。另一条规则帮助我们推断出,为私人雇主工作的人同样几乎不会面临资本损失。像这样的规则可以为社会福利、经济改革等方面制定政策或计划时提供帮助。

除了apriori之外,还有一些其他的关联规则挖掘算法,例如fp growth、eclat和多年来已用于各种应用的其他的算法。

2.3.2.2 k均值算法

在无监督聚类算法中,最简单和最广泛应用的算法是k均值算法。正如我们之前所看到的,无监督学习算法在处理输入数据时,不需要任何先验标签或训练就可以得到数据蕴含的模式和关系。尤其是,聚类算法帮助我们对数据点进行聚类或分割。

根据定义,聚类是指将对象进行分类的任务,它使每类中的元素与其他类中的元素相比更相似。k均值以无监督方式完成同样的任务。

在数学上,给定n个观测值{x1, x2,…, xn}构成的一个集合,其中每一个观察值都是一个d维向量,该算法尝试通过最小化目标函数将n个观察值分成k(≤n)个类。

与其他算法一样,k均值算法可以有不同的目标函数。为了简单起见,我们将使用最常见的目标函数,它称作类内平方和(with-in cluster sum of squares,wcss)函数。

由n个观测值构成的集合:{x1, x2,…, xn}

类的集合s:s ={s1, s2, …, sn}

目标是最小化类内平方和:

《R语言机器学习:实用案例分析》——2.3节算法家族

这里的μi类si的均值点。

该算法遵循一个简单的两步迭代过程,第一步称为分配步骤,第二步是更新步骤。

通过设置k个类的均值进行初始化:m1, m2,…, mk。

循环以下步骤直到均值不再改变或均值的变动小于一个给定的阈值:

分配步骤:将每一个观测值分配到类内平方和最小的一个类中,即将观测值分配到类均值最接近观测值的类中。

更新步骤:从i等于1到k,根据类中的所有观测值来更新每一个均值mi。

该算法有许多不同的初始化方法。最常用的方法是forgy和随机划分法。我鼓励你阅读更多的相关内容。同时,除了输入数据集外,该算法还需要k的值,即聚类需要形成的类的个数。最优的k值依赖于许多不同的因素,通常根据应用的情况来决定。

让我们看一看该算法的实际应用。

我们将使用前面knn算法使用过的iris数据集。在knn算法中我们已经对鸢尾花的类别添加了标签,并且尝试对测试数据集中的数据点进行学习和分类到正确的种类。

通过k均值算法,我们的目的是获得同样的数据分类,但是这一次我们不需要任何带标签的训练数据集(或监督)。

《R语言机器学习:实用案例分析》——2.3节算法家族

k均值算法在计算机图形的颜色量化等领域中有广泛的应用。它与许多其他的算法结合,用于自然语言的处理、计算机视觉等方面。

k均值算法有许多不同的变化版本(r自身提供了3种不同的版本)。除了k均值算法外,还有一些其他的无监督聚类算法,例如k中心点和层次聚类等。

《R语言机器学习:实用案例分析》——2.3节算法家族

继续阅读