主要内容

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

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

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

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

加载数据

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

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

负载卵巢癌;谁
名称大小字节类属性grp 216x1 25056单元obs 216x4000 3456000单个

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

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

rng(8000,“龙卷风”);

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

保持架CVP=CVP分区(grp,“坚持”56)
holdoutCVP=持有交叉验证分区numobervations:216 numtestset:1 TrainSize:160 TestSize:56
dataTrain=obs(保持CVP.training,:);grpTrain=grp(保持CVP.training);

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

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

试一试yhat=分类(obs(测试(保持CVP))、数据列、grpTrain、,“二次”);我显示(ME.message);结束
训练中各组的协方差矩阵必须是正定的。

使用简单的过滤器方法选择要素

我们的目标是通过寻找一小组重要的特征来降低数据的维数,这些特征可以提供良好的分类性能。特征选择算法大致可以分为两类:过滤方法和包装方法。过滤方法依赖于数据的一般特征来评估和选择特征子集,而不涉及所选的学习算法(本例中的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);xlabel(“P值”); 伊拉贝尔(“提供价值”)

大约有35%的功能P-值接近零,超过50%的特性具有P-值小于0.05,这意味着原始5000个特征中有2500个以上的特征具有很强的辨别力。可以根据它们的大小对这些特征进行排序P-值(或T-统计)并从排序列表中选择一些特征。但是,通常很难确定需要多少特征,除非一个人有一些领域知识,或者可以考虑的最大特征数是基于外部约束预先指定的。

确定所需特征数量的一种快速方法是绘制MCE(误分类错误,即误分类观察数除以观察数)作为特征数量的函数在测试集上。由于训练集中只有160个观察值,应用QDA的最大特征数量是有限的,否则,每组中可能没有足够的样本来估计协方差矩阵。实际上,对于本例中使用的数据,保持分区和大小f两组规定应用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),“重新替代”)
resubCVP=Resubstitution(无数据分区)NumObservations:216 numtestset:1列车大小:216测试大小:216
i=1:14 fs=featureIdxSortbyP(1:nfs(i));testMCE(i)=crossval(classf,obs(:,fs),grp,“分割”,持守者(CVP).../保持量CVP.TestSize;结果(i)=交叉值(类别F,obs(:,fs),grp,“分割”,resubCVP)/...resubCVP.TestSize;结束情节(nfs、testMCE“o”,nfs,resubMCE,“r ^”);xlabel(特征的数量); 伊拉贝尔(“MCE”); 传奇({“测试集上的MCE”“Resubstitution MCE”},“位置”,“西北”);标题(“简单过滤器特征选择方法”);

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

% function err = classf(xtrain,ytrain,xtest,ytest)%yfit=分类(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=特性idxsortbyp(1:150);

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

fsLocal=顺序FS(类别F,数据列(:,fs1),grpTrain,“cv”,tenfoldCVP);

所选功能如下:

fs1 (fsLocal)
ans =1×32337 864 3288

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

testMCELocal = crossval (classf突发交换(:,fs1 (fsLocal)), grp,“分割”,...保持架CVP)/保持架CVP.TestSize
testMCELocal=0.0714

由于只选择了三个特征,使用简单滤波器特征选择方法,MCE仅为最小MCE的一半多一点。

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

[fsCVfor50,historyCV]=顺序FS(类F,数据列(:,fs1),grpTrain,...“cv”,tenfoldCVP,“Nf”图(historyCV.Crit,“o”);xlabel(特征的数量); 伊拉贝尔(“CV MCE”);标题(“带交叉验证的正向顺序特征选择”);

当使用10个特征时,交叉验证MCE达到最小值,并且该曲线在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]=find([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,obs(:,fsCVfor10),grp,“分割”,...保持架CVP)/保持架CVP.TestSize
testMCECVfor10 = 0.0357

有趣的是,观察训练集(即,在特征选择过程中不执行交叉验证)上的再替代MCE值的曲线图,作为特征数量的函数:

[fsResubfor50,historyResub]=顺序FS(类F,数据列(:,fs1),...grpTrain,“cv”,“重新替代”,“Nf”, 50);情节(1:50,historyCV。暴击,“波”,1:50,历史研究结果暴击,“r ^”);xlabel(特征的数量); 伊拉贝尔(“MCE”); 传奇({“10倍CV MCE”“Resubstitution MCE”},“位置”,“不”);

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

fsResubfor16=fs1(historyResub.In(16,:);testMCEResubfor16=crossval(classf,obs(:,fsResubfor16),grp,“分割”,...保持架CVP)/保持架CVP.TestSize
TestMCr16=0.0714

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

另见

相关的话题