-- 测试数据和代码见文末客服二维码
在上一次教程中,我们介绍了把观测值凝聚成子组的常见聚类方法。其中包括了常见聚类分析的一般步骤以及层次聚类和划分聚类的常见方法。而机器学习领域中也包含许多可用于分类的方法,如逻辑回归、决策树、随机森林、支持向量机(SVM)等。本次教程的内容则主要介绍决策树、随机森林、支持向量机这三部分内容,它们都属于有监督机器学习领域。有监督机器学习基于一组包含预测变量值和输出变量值的样本单元,将全部数据分为一个训练集和一个验证集,其中训练集用于建立预测模型,验证集用于测试模型的准确性。这个过程中对训练集和验证集的划分尤其重要,因为任何分类技术都会最大化给定数据的预测效果。用训练集建立模型并测试模型会使得模型的有效性被过分夸大,而用单独的验证集来测试基于训练集得到的模型则可使得估计更准确、更切合实际。得到一个有效的预测模型后,就可以预测那些只知道预测变量值的样本单元对应的输出值了。
开始之前,先确保你的R中已经安装了必备的R包(通过e1071包构造支持向量机,通过R包rpart、rpart.plot 和party来实现决策树模型及其可视化,通过randomForest包拟合随机森林)。
同时,本次教程中的示例数据(例子来源于UCI机器学习数据库中的威斯康星州乳腺癌数据。数据分析的目的是根据细胞组织细针抽吸活检所反映的特征,来判断被检者是否患有乳腺癌)的下载已经包含在代码中,并随机划分了训练集和测试集(两个数据集的样本数之比为7:3)。(详细过程见代码,对三种方法采用相同的数据集,因此可以直接比较各个方法的结果。)
支持向量机(SVM)
支持向量机(Support vector machine, SVM)是一类可用于分类和回归的有监督机器学习模型。SVM旨在在多维空间中找到一个能将全部样本单元分成两类的最优平面,这一平面应使两类中距离最近的点的间距(margin)尽可能大,在间距边界上的点被称为支持向量(support vector,它们决定间距),分割的超平面位于间距的中间。(容易想象的是当变量数为2时,曲面是一条直线;当变量数为3时,曲面是一个平面。)SVM可以通过R中kernlab包的函数ksvm()和e1071包中的函数svm()实现。函数ksvm()功能更强大,但函数svm()相对更简单。下面我们用函数svm()对示例数据进行了建立SVM模型。最终结果如图1所示。从结果来看,SVM的预测准确率还不错。
图1,SVM模型在测试集上的表现。
函数svm()默认通过径向基函数(Radial Basis Function,RBF)将样本单元投射到高维空间。在用带RBF核的SVM拟合样本时,两个参数可能影响最终结果:gamma和成本(cost)。函数svm()默认设置gamma为预测变量个数的倒数,成本参数为1。不过gamma与成本参数的不同组合可能生成更有效的模型。在建模时,我们可以尝试变动参数值建立不同的模型。利用函数tune.svm()实现这一过程,根据图2中的结果,我们应该选择gamma=0.01,cost=1的组合进行建模。
图2,函数tune.svm()的结果。
在改变参数之后,重新建模,我们发现这次的结果稍好于默认参数的建模结果。(如图3)
图3,改变参数之后的模型表现。
一般来说,为SVM模型选取调和参数通常可以得到更好的结果。由于SVM适用面比较广,它目前是很流行的一种模型。SVM也可以应用于变量数远多于样本单元数的问题,而这类问题在生物医药行业很常见。另外SVM的一大缺点是分类准则比较难以理解和表述(和随机森林类似),SVM从本质上来说是一个黑盒子。SVM在对大量样本建模时不如随机森林,但只要建立了一个成功的模型,在对新样本分类时就没有问题了。
决策树
决策树是数据挖掘领域中的常用模型。其基本思想是对预测变量进行二元分离,从而构造一棵可用于预测新样本单元所属类别的树。下面简单介绍两类决策树:经典决策树和条件推断树。
经典决策树以一个二元输出变量(与示例数据中的变量class对应)和一组预测变量(对应其它变量)为基础。R中的rpart包支持函数rpart()构造决策树,函数prune()对决策树进行剪枝。函数rpart()返回的cptable值中包括不同大小的树对应的预测误差,因此可用于辅助设定最终的树的大小(如图4)。同时也可以用函数plotcp()画出交叉验证误差与复杂度参数的关系图, 从图像来看,应选择虚线下最左侧cp值对应的树(如图5)。
图4,函数rpart()返回的cptable值。
图5,交叉验证误差与复杂度参数的关系图。
综合来说,我们应该选择分割数为4的树(五个节点,此时cp=0.01),从而prune(dtree, cp=0.01)可得到一个理想大小的树。最终的决策树如图6所示。
图6,经典决策树示意图。
最终,可以得到对测试集的预测准确率为94%。
条件推断树与经典决策树类似,但变量和分割的选取是基于显著性检验的,而不是纯净度或同质性一类的度量。条件推断树可由party包中的函数ctree()获得。对于条件推断树来说,剪枝不是必需的,其生成过程相对更自动化一些。另 外,party包也提供了许多图像参数。图7展示了一棵条件推断树(具体见代码)。而条件决策树对测试集的预测结果准确率和经典决策树的很类似,大家可以自己参考代码计算一下。
图7,条件决策树示意图。
当然,经典决策树也可以画出这样的示意图,如图8所示,这需要partykit包的帮助(见代码)。
图8,经典决策树示意图。
随机森林
随机森林(random forest)是一种组成式的有监督学习方法。在随机森林中,我们同时生成多个预测模型,并将模型的结果汇总以提升分类准确率。随机森林的算法涉及对样本单元和变量进行抽样,从而生成大量决策树。对每个样本单元来说,所有决策树依次对其进行分类。所有决策树预测类别中的众数类别即为随机森林所预测的这一样本单元的类别。randomForest包中的函数randomForest()可用于生成随机森林。函数默认生成500棵树,并且默认在每个节点处抽取sqrt(M)个变量,最小节点为1。在本次示例中,预测准确率可以达到约96%(如图9)。
图9,随机森林预测结果。
随机森林可度量变量重要性,通过设置参数information=TRUE得到,并通过importance() 函数输出。本例中,sizeUniformity是最重要的变量,mitosis是最不重要的变量(具体见代码)。在上面的例子中,randomForest包根据传统决策树生成随机森林,而party包中的函数cforest()则可基于条件推断树生成随机森林(当预测变量间高度相关时,基于条件推断树的随机森林可能效果更好)。相较于其他分类方法,随机森林的分类准确率通常更高。另外,随机森林算法可处理大规模问题(即多样本单元、多变量),可处理训练集中有大量缺失值的数据,也可应对变量远多于样本单元的数据。最后,随机森林的一个明显缺点是分类方法(此例中相当于500棵决策树)较难理解和表达。而且,我们需要存储整个随机森林以对新样本单元分类。
模型比较
在已经接触了包括逻辑回归以及上述的三种分类方法之后,不可避免的一个问题出现了:在实际数据分析中,应该选择哪种分类器或者说哪种分类方法是最准确的呢?这就涉及一个分类器的敏感度(sensitivity)、特异性(sensitivity)、正例命中率(positive predictive power)和负例命中率(negative predictive power)。在代码中,我们给出了一个自定义的计算这些统计量的函数performance()。
图10,函数performance()对SVM的结果。
在这个示例数据集中,这些分类器(传统决策树、条件推断树、随机森林和支持向量机(如图10)) 都表现得相当不错。不过在现实中并不总是这样。因此在实际分析中,推荐大家先尝试一些相对简单的方法(如逻辑回归、决策树)和一些复杂的、黑箱式的方法(如随机森林、支持向量机)。如果与简单的方法相比,复杂方法在预测效果方面并没有显著提升,则我们一般会选择较简单的方法。