带有 Kernlab 的内核 PCA 和结肠癌数据集的分类

Posted

技术标签:

【中文标题】带有 Kernlab 的内核 PCA 和结肠癌数据集的分类【英文标题】:kernel PCA with Kernlab and classification of Colon--cancer dataset 【发布时间】:2015-05-22 14:04:50 【问题描述】:

我需要在colon-­‐cancer 数据集上执行内核 PCA:

然后

我需要使用 PCA 数据绘制主成分数量与分类准确度的关系。

对于第一部分,我在 R 中使用kernlab 如下(假设特征数为 2,然后我将其从 2 到 100 变化)

kpc <- kpca(~.,data=data[,-1],kernel="rbfdot",kpar=list(sigma=0.2),features=2)

我很难理解如何使用这个 PCA 数据进行分类(我可以使用任何分类器,例如 SVM)

编辑:我的问题是如何将 PCA 的输出输入分类器

数据看起来像这样(清理后的数据)

未清理的原始数据如下所示

【问题讨论】:

PCA 不是一种分类,而是一种降维算法(例如,您从 20 个特征开始,应用 PCA,最终得到 5 个近似原始特征空间的特征)。您仍然需要将 PCA 的输出输入分类器(例如 SVM/RandomForest/KNearest)。 感谢@Matt 明确我的问题 我不知道如何将 PCA 的输出输入到分类器中,我的意思是如何获得 PCA 的输出 免责声明,我不是 R 方面的专家,但根据文档,您可以使用 predict 方法来转换看不见的数据。然后,您应该使用所述转换后的数据并将其输入 SVM。 【参考方案1】:

我将在这里向您展示如何使用kernlab 包的kpca 函数的小示例:

我检查了结肠癌文件,但需要进行一些清理才能使用它,因此我将使用随机数据集向您展示如何:

假设如下数据集:

y <- rep(c(-1,1), c(50,50))
x1 <- runif(100)
x2 <- runif(100)
x3 <- runif(100)
x4 <- runif(100)
x5 <- runif(100)
df <- data.frame(y,x1,x2,x3,x4,x5)

> df
     y          x1          x2          x3         x4          x5
1   -1 0.125841208 0.040543611 0.317198114 0.40923767 0.635434021
2   -1 0.113818719 0.308030825 0.708251147 0.69739496 0.839856000
3   -1 0.744765204 0.221210582 0.002220568 0.62921565 0.907277935
4   -1 0.649595597 0.866739474 0.609516644 0.40818013 0.395951297
5   -1 0.967379006 0.926688915 0.847379556 0.77867315 0.250867680
6   -1 0.895060293 0.813189446 0.329970821 0.01106764 0.123018797
7   -1 0.192447416 0.043720717 0.170960540 0.03058768 0.173198036
8   -1 0.085086619 0.645383728 0.706830885 0.51856286 0.134086770
9   -1 0.561070374 0.134457795 0.181368729 0.04557505 0.938145228

为了运行pca,您需要执行以下操作:

kpc <- kpca(~.,data=data[,-1],kernel="rbfdot",kpar=list(sigma=0.2),features=4)

这与您使用它的方式相同。但是,我需要指出 features 参数是 主要组件 的数量,而不是 y 变量中的类数量。也许您已经知道这一点,但是拥有 2000 个变量并且只产生 2 个主成分可能不是您想要的。您需要通过检查特征值仔细选择此数字。在您的情况下,我可能会选择 100 个主成分,并根据最高特征值选择前 n 个主成分。让我们在运行之前的代码后在我的随机示例中看到这一点:

为了查看特征值:

> kpc@eig 
    Comp.1     Comp.2     Comp.3     Comp.4 
0.03756975 0.02706410 0.02609828 0.02284068 

在我的例子中,所有组件的特征值都非常低,因为我的数据是随机的。在你的情况下,我认为你会得到更好的。您需要选择 n 个具有最高值的组件。零值表明该分量不能解释任何方差。 (只是为了演示,我将在下面的 svm 中使用所有这些)。

为了访问主要组件,即 PCA 输出,您可以这样做:

> kpc@pcv
                [,1]        [,2]         [,3]        [,4]
  [1,] -0.1220123051  1.01290883 -0.935265092  0.37279158
  [2,]  0.0420830469  0.77483019 -0.009222970  1.14304032
  [3,] -0.7060568260  0.31153129 -0.555538694 -0.71496666
  [4,]  0.3583160509 -0.82113573  0.237544936 -0.15526000
  [5,]  0.1158956953 -0.92673486  1.352983423 -0.27695507
  [6,]  0.2109994978 -1.21905573 -0.453469345 -0.94749503
  [7,]  0.0833758766  0.63951377 -1.348618472 -0.26070127
  [8,]  0.8197838629  0.34794455  0.215414610  0.32763442
  [9,] -0.5611750477 -0.03961808 -1.490553198  0.14986663
  ...
  ...

这将返回一个 4 列的矩阵,即作为 PCA 输出的特征参数的数量,即主成分。 kerlab 使用 S4 方法调度系统,这就是您在 kpc@pcv 使用 @ 的原因。

然后您需要使用上述矩阵以下列方式输入 svm:

svmmatrix <- kpc@pcv
library(e1071)
svm(svmmatrix, as.factor(y))

Call:
svm.default(x = svmmatrix, y = as.factor(y))

Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.25 

Number of Support Vectors:  95

就是这样!我在互联网上找到了一个关于 pca 的非常好的解释,可以在 here 找到,以防您或其他阅读本文的人想了解更多信息。

【讨论】:

以上是关于带有 Kernlab 的内核 PCA 和结肠癌数据集的分类的主要内容,如果未能解决你的问题,请参考以下文章

R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用

在kernlab中的SVM训练之外的内核矩阵计算

如何在kernlab包的ksvm中自定义内核函数?

kernlab中的rbfKernel方程与标准不同?

决定内核 PCA 中内核参数的类型

帮助在 R 中对 kernlab 的 SVM 使用 predict()?