加载数据
血清蛋白质组图谱诊断可用于区分患者和非患者的观测值。图谱是使用表面增强激光解吸电离 (SELDI) 蛋白质质谱法产生的。这些特征是特定质荷比下的离子强度水平。
此示例用到了使用 WCX2 蛋白质阵列生成的高分辨率卵巢癌数据集。经过一些预处理步骤(类似于 Bioinformatics Toolbox™ 示例预处理原始质谱数据中所示的步骤),数据集现在包含两个变量 obs 和 grp。obs 变量包含 216 个观测值,具有 4000 个特征。grp 中的每个元素定义 obs 的对应行所属的组。
load ovariancancer;
whos
Name Size Bytes Class Attributes
grp 216x1 25056 cell
obs 216x4000 3456000 single
将数据分成训练集和测试集
此示例中使用的一些函数调用 MATLAB® 内置随机数生成函数。要得到与此示例完全相同的结果,请执行以下命令,将随机数生成器设置为已知状态。否则,您的结果可能会有所不同。
rng(8000,'twister');
模型对训练数据的处理性能(再代入性能)并不能很好地反映模型对独立测试集的处理性能。再代入性能通常会过于乐观。要预测所选模型的性能,您需要使用另一个数据集(而不是用来构建模型的数据集)来评估模型性能。此处,我们使用 cvpartition 将数据分成大小为 160 的训练集和大小为 56 的测试集。训练集和测试集的组比例与 grp 中的组比例大致相同。我们使用训练数据选择特征,并使用测试数据判断所选特征的性能。这通常称为留出法验证。另一种简单但广泛使用的模型评估和选择方法是交叉验证,本示例稍后会进行说明。
holdoutCVP = cvpartition(grp,'holdout',56)
holdoutCVP =
Hold-out cross validation partition
NumObservations: 216
NumTestSets: 1
TrainSize: 160
TestSize: 56
dataTrain = obs(holdoutCVP.training,:);
grpTrain = grp(holdoutCVP.training);
使用全部特征对数据进行分类存在的问题
如果不先减少特征的数量,有些分类算法在处理本示例中使用的数据集时可能会失败,因为特征的数量远远大于观测值的数量。在本示例中,我们使用二次判别分析 (QDA) 作为分类算法。如果我们使用全部特征对数据应用 QDA,如下所示,我们将收到错误消息,因为每个组中没有足够的样本来估计协方差矩阵。
try
yhat = classify(obs(test(holdoutCVP),:), dataTrain, grpTrain,'quadratic');
catch ME
display(ME.message);
end
The covariance matrix of each group in TRAINING must be positive definite.
使用简单的筛选器方法选择特征
我们的目的是找出一小组能够实现良好分类性能的重要特征,从而减少数据的维度。特征选择算法可以大致分为两类:筛选器方法和封装器方法。筛选器方法依赖于数据的一般特性来评估和选择特征子集,而不涉及所选择的学习算法(此示例中为 QDA)。封装器方法利用所选学习算法的性能来评估每个候选特征子集。封装器方法会搜索更适合所选学习算法的特征,但如果学习算法需要很长时间运行,则封装器方法可能会比筛选器方法慢很多。有关“筛选器”和“封装器”的概念,请参阅以下文献&#x