主要内容

选择特征对高维数据进行分类

这个例子展示了如何选择对高维数据进行分类的特征。更具体地说,它展示了如何进行序列特征选择,这是目前最流行的特征选择算法之一。它还展示了如何使用抵制和交叉验证来评估所选特性的性能。

减少特征的数量(维数)在统计学习中很重要。对于许多具有大量特征和有限观测值的数据集,如生物信息学数据,通常许多特征对产生期望的学习结果没有用处,有限的观测值可能导致学习算法对噪声过拟合。减少特征还可以节省存储和计算时间,增加可理解性。

减少特征主要有两种方法:特征选择和特征变换。特征选择算法从原始特征集中选择一个特征子集;特征变换方法将数据从原始的高维特征空间转化为降维的新空间。

加载数据

血清蛋白质组学诊断可用于区分有无疾病患者的观察结果。使用表面增强激光解吸和电离(SELDI)蛋白质谱生成谱图。这些特征是特定质量/电荷值下的离子强度水平。

本例使用WCX2蛋白阵列生成的高分辨率卵巢癌数据集。在一些预处理步骤之后,类似于Bioinformatics Toolbox™示例中所示的步骤原始质谱数据的预处理,数据集有两个变量奥林匹克广播服务公司grp.的奥林匹克广播服务公司变量由216个观测值和4000个特征组成。中的每个元素grp定义对应行所属的组奥林匹克广播服务公司属于。

负载ovariancancer;谁
名称大小字节类属性grp 216x1 25056 cell obs 216x4000 3456000 single

将数据划分为训练集和测试集

本例中使用的一些函数调用MATLAB®内置随机数生成函数。要复制本例中显示的结果,执行下面的命令将随机数生成器设置为已知状态。否则,你的结果可能会不同。

rng (8000“旋风”);

训练数据上的性能(再替换性能)并不是一个很好的模型在独立测试集上性能的估计。再替换性能通常过于乐观。要预测所选模型的性能,您需要评估它在未用于构建模型的另一个数据集上的性能。在这里,我们使用cvpartition将数据分为大小为160的训练集和大小为56的测试集。训练集和测试集的分组比例大致相同grp.我们使用训练数据选择特征,并判断所选特征在测试数据上的性能。这通常被称为拒绝验证。另一种简单且广泛使用的评估和选择模型的方法是交叉验证,稍后将在本例中说明。

holdoutCVP = cvpartition (grp),“坚持”56)
holdoutCVP = holdout交叉验证分区nummobservations: 216 NumTestSets: 1 TrainSize: 160 TestSize: 56
奥林匹克广播服务公司(dataTrain = holdoutCVP.training:);grpTrain = grp (holdoutCVP.training);

利用所有特征对数据进行分类的问题

如果不首先减少特征的数量,一些分类算法将在本例中使用的数据集上失败,因为特征的数量远远大于观测的数量。在本例中,我们使用二次判别分析(QDA)作为分类算法。如果我们使用所有的特征对数据应用QDA,如下所示,我们会得到一个误差,因为在每一组中没有足够的样本来估计协方差矩阵。

试一试yhat = classify(obs(test(holdoutCVP),:), dataTrain, grpTrain,“二次”);我显示(ME.message);结束
TRAINING中各组的协方差矩阵必须为正定。

使用简单的过滤方法选择功能

我们的目标是通过寻找一小组重要的特征来降低数据的维数,这些特征可以提供良好的分类性能。特征选择算法大致可以分为两类:过滤方法和包装方法。过滤方法依赖于数据的一般特征来评估和选择特征子集,而不涉及所选的学习算法(本例中的QDA)。Wrapper方法利用所选学习算法的性能来评估每个候选特征子集。Wrapper方法搜索更适合所选学习算法的特征,但如果学习算法运行时间较长,它们可能比过滤方法慢得多。“过滤器”和“包装器”的概念在John G. Kohavi R.(1997)中进行了描述。“特征子集选择的包装”,《人工智能》,第97卷,第1-2期,第272-324页。这个例子展示了一个过滤器方法的实例和一个包装器方法的实例。

过滤器通常被用作预处理步骤,因为它们简单和快速。生物信息学数据的一种广泛使用的过滤方法是对每个特征分别应用一个单变量标准,假设特征之间没有相互作用。

例如,我们可以应用t测试每个功能并进行比较p的绝对值t-统计),以衡量它在分组时的有效性。

dataTrainG1 = dataTrain (grp2idx (grpTrain) = = 1:);dataTrainG2 = dataTrain (grp2idx (grpTrain) = = 2,:);(h p, ci, stat) = ttest2 (dataTrainG1 dataTrainG2,“Vartype”,“不平等”);

为了得到一个大致的概念,根据每个特征,这两个组是如何分离的,我们绘制的经验累积分布函数(CDF)p值:

ecdf (p);包含(“P值”);ylabel (“提供价值”

大约有35%的功能p-值接近零,超过50%的特性具有p-值小于0.05,表示在原有的5000个特征中,具有较强辨别能力的特征超过2500个。我们可以根据它们的不同对这些特征进行分类p的绝对值t-statistic),并从排序列表中选择一些功能。然而,通常很难决定需要多少特征,除非一个人有一些领域知识,或者可以考虑的特征的最大数量已经根据外部约束预先决定。

一个快速确定所需特征数量的方法是将测试集上的MCE(误分类误差,即误分类观测数除以观测数)作为特征数量的函数绘制出来。由于训练集中只有160个观察值,所以应用QDA的最大特征数量有限,否则每组中可能没有足够的样本来估计协方差矩阵。实际上,对于本例中使用的数据,holdout分区和两组的大小表明,应用QDA的最大允许特性数量约为70个。现在我们计算5到70之间不同数量的特征的MCE,并显示MCE图作为特征数量的函数。为了合理估计所选模型的性能,使用160个训练样本拟合QDA模型并计算56个测试观测值(下图蓝色圆形标记)的MCE是很重要的。为了说明为什么再替代误差不是一个很好的测试误差估计,我们还使用红色三角形标记显示了再替代MCE。

[~, featureIdxSortbyP] = (p, 2);对特征进行排序testMCE = 0(1、14);resubMCE = 0(1、14);nfs = 5:5:70;classf = @ (xtrain、ytrain xtest、欧美)...总和(~ strcmp(欧美、分类(xtest、xtrain ytrain,“二次”)));resubCVP = cvpartition(长度(grp),“resubstitution”
resubCVP = Resubstitution (no partition of data) nummobservations: 216 NumTestSets: 1 TrainSize: 216 TestSize: 216
i = 1:14 fs = featureIdxSortbyP(1:nfs(i));testMCE (i) = crossval (classf突发交换(:,fs), grp,“分区”holdoutCVP).../ holdoutCVP.TestSize;resubMCE (i) = crossval (classf突发交换(:,fs), grp,“分区”, resubCVP) /...resubCVP.TestSize;结束情节(nfs、testMCE“o”nfs resubMCE,“r ^”);包含(特征的数量);ylabel (“乎”);传奇({"测试集上的MCE "“Resubstitution MCE”},“位置”,“西北”);标题(“简单过滤器特征选择方法”);

为了方便起见,classf定义为匿名函数。它对给定的训练集进行QDA拟合,并返回给定测试集的误分类样本数。如果你正在开发自己的分类算法,你可能想把它放在一个单独的文件中,如下所示:

% function err = classf(xtrain,ytrain,xtest,ytest)% yfit = classify(xtest,xtrain,ytrain,'二次');% err = sum(~strcmp(ytest,yfit));

再替代MCE过于乐观。当使用更多功能时,它会持续下降,当使用超过60个功能时,它会降为零。但是,如果测试误差增大,而重代误差仍在减小,则可能发生过拟合。这种简单的滤波特征选择方法在使用15个特征时得到测试集上最小的MCE。图中显示,当使用20个或更多特征时,就开始出现过拟合。测试集中最小的MCE为12.5%:

testMCE (3)
ans = 0.1250

以下是实现最低MCE的前15个功能:

featureIdxSortbyP (1:15)
ans =1×152814 2813 2721 2720 2452 2645 2644 2642 2650 2643 2731 2638 2730 2637 2398

应用序列特征选择

上述特征选择算法没有考虑特征之间的交互作用;此外,从列表中根据个体排名选择的特征也可能包含冗余信息,导致不需要所有特征。例如,第一个选择的特征(列2814)和第二个选择的特征(列2813)之间的线性相关系数接近0.95。

相关系数(dataTrain (:, featureIdxSortbyP (1)), dataTrain (:, featureIdxSortbyP (2)))
ans =0.9447

这种简单的特征选择过程由于速度快,常被用作预处理步骤。更高级的特征选择算法提高了性能。序列特征选择是应用最广泛的技术之一。它通过依次添加(前向搜索)或删除(后向搜索)来选择特征子集,直到满足某些停止条件。

在本例中,我们以包装器的方式使用前向顺序特征选择来查找重要特征。更具体地说,由于分类的典型目标是最小化MCE,特征选择过程使用学习算法QDA的MCE对每个候选特征子集执行顺序搜索,作为该子集的性能指标。训练集用于选择特征并拟合QDA模型,测试集用于评价最终选择的特征的性能。在特征选择过程中,为了评估和比较每个候选特征子集的性能,我们对训练集应用分层10倍交叉验证。稍后我们将说明为什么对训练集应用交叉验证是重要的。

首先,我们为训练集生成一个10倍的分层分区:

tenfoldCVP = cvpartition (grpTrain,“kfold”, 10)
tenfoldCVP = K-fold交叉验证分区nummobations: 160 NumTestSets: 10 TrainSize: 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144

然后我们使用前一节的过滤结果作为预处理步骤来选择特征。例如,我们在这里选择了150个功能:

fs1 = featureIdxSortbyP (1:15);

我们对这150个特征应用前向序列特征选择。这个函数sequentialfs提供一种简单的方法(默认选项)来决定需要多少特性。当找到交叉验证MCE的第一个局部最小值时,它停止。

fsLocal = sequentialfs (classf dataTrain (:, fs1) grpTrain,“简历”, tenfoldCVP);

所选功能如下:

fs1 (fsLocal)
ans =1×32337 864 3288

为了用这三个特征来评价所选模型的性能,我们计算了56个测试样本的MCE。

testMCELocal = crossval (classf突发交换(:,fs1 (fsLocal)), grp,“分区”,...holdoutCVP) / holdoutCVP。TestSize
testMCELocal = 0.0714

在只选择三个特征的情况下,使用简单滤波器特征选择方法得到的MCE仅略高于最小MCE的一半。

算法可能已经提前停止了。有时,通过在合理的特征数量范围内寻找交叉验证MCE的最小值,可以实现较小的MCE。例如,我们绘制了交叉验证MCE的图,将其作为多达50个特征的特征数量的函数。

[fsCVfor50, historyCV] = sequentialfs (classf dataTrain (:, fs1) grpTrain,...“简历”tenfoldCVP,“Nf”, 50);情节(historyCV。暴击,“o”);包含(特征的数量);ylabel (“简历多国评价”);标题(“具有交叉验证的前向序列特征选择”);

交叉验证MCE在使用10个特征时达到最小值,在10个特征到35个特征的范围内保持平稳。此外,当使用超过35个特征时,曲线会上升,这意味着会出现过拟合。

拥有较少的功能通常是更好的选择,所以我们在此挑选10个功能:

: fsCVfor10 = fs1 (historyCV.In(10日))
fsCVfor10 =1×102814 2721 2720 2452 2650 2731 2337 2658 864 3288

为了按顺序显示这10个特性,我们在序列前向过程中找到它们第一次为真的行historyCV输出:

[orderlist,ignore] =查找([historyCV.In(1,:);diff (historyCV.In (1:10 ,:) )]' );fs1 (orderlist)
ans =1×102337 864 3288 2721 2814 2658 2452 2731 2650 2720

为了评估这10个特性,我们计算它们在测试集上的QDA的MCE。我们得到目前为止最小的MCE值:

testMCECVfor10 = crossval (classf突发交换(:,fsCVfor10)、grp,“分区”,...holdoutCVP) / holdoutCVP。TestSize
testMCECVfor10 = 0.0357

将训练集上的再替换MCE值(即在特征选择过程中不执行交叉验证)作为特征数量的函数来查看是很有趣的:

[fsResubfor50, historyResub] = sequentialfs (classf dataTrain (:, fs1),...grpTrain,“简历”,“resubstitution”,“Nf”, 50);情节(1:50,historyCV。暴击,“波”、1:50 historyResub。暴击,“r ^”);包含(特征的数量);ylabel (“乎”);传奇({“10倍的简历多国评价”“Resubstitution MCE”},“位置”,“不”);

再次强调,重新替代MCE值在这里过于乐观。大多数都小于交叉验证的MCE值,当使用16个特征时,再替换MCE值为零。我们可以在测试集上计算这16个特性的MCE值,看看它们的实际性能:

: fsResubfor16 = fs1 (historyResub.In (16));testMCEResubfor16 = crossval (classf突发交换(:,fsResubfor16)、grp,“分区”,...holdoutCVP) / holdoutCVP。TestSize
testMCEResubfor16 = 0.0714

testMCEResubfor16,这16个特征(在特征选择过程中通过重新替换选择)在测试集中的性能大约是for的两倍testMCECVfor10, 10个特征(在特征选择过程中通过10倍交叉验证选择)在测试集上的性能。这再次表明,在评价和选择特征时,再替代误差通常不是一个好的性能估计。我们可能希望避免使用重新替换错误,不仅在最后的评估步骤中,而且在特征选择过程中。

另请参阅

相关的话题