主要内容

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

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

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

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

加载数据

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

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

负载卵巢癌;谁
名称大小字节类属性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-Values小于0.05,这意味着在原始的5000个功能中有超过2500个功能,具有很强的辨别力。一个人可以根据他们的p- 值(或绝对值t- 静态)并从排序列表中选择一些功能。然而,通常难以确定需要多少特征,除非有一些域知识或可以考虑的最大特征的最大特征,则基于外部约束预先决定。

确定所需功能的数量的一种快速方法是在测试集上绘制MCE(错误分类误差,即除以观察次数的错误分类观察数)作为功能数量的函数。由于训练集中只有160个观察,因此应用QDA的最大特征是有限的,否则,每个组中可能没有足够的样本来估计协方差矩阵。实际上,对于在此示例中使用的数据,两个组的熔断分区和大小指示用于应用QDA的最大允许的功能数量约为70.现在我们计算MCE在5到70之间的各种特征数量并显示作为特征数量的函数绘制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 (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).../楼控佐.Testsize;Resubmce(i)= Crossval(Classf,Obs(:,FS),GRP,“分区”,重新提交)/...resubCVP.TestSize;结束情节(nfs、testMCE“o”nfs resubMCE,“r ^”);包含(特征的数量);ylabel ('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×15.2814 281221 2643 2637 2398 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个特征应用前向序列特征选择。这个函数序列提供一种简单的方法(默认选项)来决定需要多少功能。它在找到第一个局部最小值的交叉验证MCE时停止。

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

所选功能如下:

fs1 (fsLocal)
ans =1×32337 864 3288

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

testMCELocal = crossval (classf突发交换(:,fs1 (fsLocal)), grp,“分区”...holdoutcvp)/ roltutourcvp.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,Obs(:,fscvfor10),grp,“分区”...holdoutcvp)/ roltutourcvp.testsize.
testMCECVfor10 = 0.0357

看看训练集上的重生MCE值(即,在不执行特征选择过程中的交叉验证)的函数是有趣的,因为功能的功能:

[fsResubfor50, historyResub] = sequentialfs (classf dataTrain (:, fs1),...grpTrain,“简历”'重新提交'“Nf”, 50);情节(1:50,historyCV。暴击,“波”,1:50,historyresub.crit,“r ^”);包含(特征的数量);ylabel ('MCE');传奇({'10 -fold cv mce'“Resubstitution MCE”},'位置'“不”);

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

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

testMCEResubfor16,在测试集上,这16个功能的性能(在特征选择过程中由ResubStiture选择)的性能约为双倍testMCECVfor10,在测试集上的10个功能的性能(在特征选择过程中选择了10倍交叉验证)。它再次表明重新提交误差通常不是对评估和选择特征的良好性能估计。我们可能希望避免使用重新提交错误,而不仅在最终评估步骤中,而且在功能选择过程中也是如此。

另请参阅

相关的话题