主要内容

选择高维数据分类的特性

此示例演示如何选择用于对高维数据进行分类的特征。更具体地说,它展示了如何执行顺序特征选择,这是最流行的特征选择算法之一。它还展示了如何使用保留和交叉验证来评估所选特性的性能。

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

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

加载数据

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

本例使用了使用WCX2蛋白阵列生成的高分辨率卵巢癌数据集。经过一些预处理步骤,类似于生物信息学工具箱™示例中所示的步骤原质谱数据预处理(生物信息学工具箱),该数据集有两个变量奥林匹克广播服务公司而且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交叉验证分区NumObservations: 216 NumTestSets: 1 TrainSize: 160 TestSize: 56
dataTrain = obs(holdoutcvv .training,:);grpTrain = grp(holdoutcvv .training);

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

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

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

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

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

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

例如,我们可以应用t-测试每个特性并进行比较p的绝对值t-statistics),作为区分组的有效性的衡量标准。

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

为了得到两组被每个特征分离得有多好,我们绘制了经验累积分布函数(CDF)p值:

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

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

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

[~,featureIdxSortbyP] = sort(p,2);%对特征进行排序testMCE = 0 (1,14);resubMCE = 0 (1,14);NFS = 5:5:70;Classf = @(xtrain,ytrain,xtest,ytest)...总和(~ strcmp(欧美、分类(xtest、xtrain ytrain,“二次”)));resubCVP = cvpartition(length(grp),“resubstitution”
resubCVP = Resubstitution(无分区数据)NumObservations: 216 NumTestSets: 1 TrainSize: 216 TestSize: 216
i = 1:14 fs = featureIdxSortbyP(1:nfs(i));testMCE(i) = crossval(classf,obs(:,fs),grp,“分区”holdoutCVP).../ holdoutCVP.TestSize;resubMCE(i) = crossval(classf,obs(:,fs),grp,“分区”, resubCVP) /...resubCVP.TestSize;结束情节(nfs、testMCE“o”nfs resubMCE,“r ^”);包含(“功能数量”);ylabel (“乎”);传奇({“测试台上的MCE”“Resubstitution MCE”},“位置”“西北”);标题(“简单滤镜特征选择方法”);

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

%函数err = classf(xtrain,ytrain,xtest,ytest)% yfit = class (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交叉验证分区NumObservations: 160 NumTestSets: 10 TrainSize: 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 TestSize: 16 16 16 16 16 16 16 16 16 16 16 16 16

然后,我们使用上一节的筛选结果作为选择特征的预处理步骤。例如,我们在这里选择了150个特性:

fs1 = featureIdxSortbyP(1:150);

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

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

所选特征如下:

fs1 (fsLocal)
ans =1×32337864 3288

为了评估具有这三个特征的选定模型的性能,我们计算了56个测试样本的MCE。

testmclocalal = crossval(classf,obs(:,fs1(fsLocal)),grp,“分区”...holdoutCVP) / holdoutCVP。TestSize
testmclocalal = 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] = 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,“分区”...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倍CV MCE”“Resubstitution MCE”},“位置”“不”);

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

fsResubfor16 = fs1(historyresubin . (16,:));testMCEResubfor16 = crossval(classf,obs(:,fsResubfor16),grp,“分区”...holdoutCVP) / holdoutCVP。TestSize
testMCEResubfor16 = 0.0714

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

另请参阅

相关的话题