使用 R 进行数据训练,其中数据预处理为 PCA 组件?

data training with R where data preprocessed into PCA components?

我想训练 knn 使用 caret::train 对数字进行分类(经典问题),在训练前使用 PCA 对特征进行分类。

control = trainControl(method = "repeatedcv",
                       number = 10,
                       repeats = 5,
                       p = 0.9)

knnFit = train(x = trainingDigit,
               y = label,
               metric = "Accuracy",
               method = "knn",
               trControl = control,
               preProcess = "pca")

我不明白如何表示我的训练数据导致错误:

Error in sample.int(length(x), size, replace, prob) : cannot take a sample larger than the population when 'replace = FALSE'

我的训练数据表示如下(Rdata file):

List of 10
 $ : num [1:400, 1:324] 0.934 0.979 0.877 0.853 0.945 ...
 $ : num [1:400, 1:324] 0.807 0.98 0.803 0.978 0.969 ...
 $ : num [1:400, 1:324] 0.745 0.883 0.776 0.825 0.922 ...
 $ : num [1:400, 1:324] 0.892 0.817 0.835 0.84 0.842 ...
 $ : num [1:400, 1:324] 0.752 0.859 0.881 0.884 0.855 ...
 $ : num [1:400, 1:324] 0.798 0.969 0.925 0.921 0.873 ...
 $ : num [1:400, 1:324] 0.964 0.93 0.97 0.857 0.926 ...
 $ : num [1:400, 1:324] 0.922 0.939 0.958 0.946 0.867 ...
 $ : num [1:400, 1:324] 0.969 0.947 0.916 0.861 0.86 ...
 $ : num [1:400, 1:324] 0.922 0.933 0.978 0.968 0.971 ...

标签如下(.Rdata file):

List of 10
 $ : num [1:400] 0 0 0 0 0 0 0 0 0 0 ...
 $ : num [1:400] 1 1 1 1 1 1 1 1 1 1 ...
 $ : num [1:400] 2 2 2 2 2 2 2 2 2 2 ...
 $ : num [1:400] 3 3 3 3 3 3 3 3 3 3 ...
 $ : num [1:400] 4 4 4 4 4 4 4 4 4 4 ...
 $ : num [1:400] 5 5 5 5 5 5 5 5 5 5 ...
 $ : num [1:400] 6 6 6 6 6 6 6 6 6 6 ...
 $ : num [1:400] 7 7 7 7 7 7 7 7 7 7 ...
 $ : num [1:400] 8 8 8 8 8 8 8 8 8 8 ...
 $ : num [1:400] 9 9 9 9 9 9 9 9 9 9 ...

问题在于您对数据的表示。在开始训练之前试试这个:

label <- factor(c(label, recursive = TRUE))
trainingDigit <- data.frame(do.call(rbind, trainingDigit))

您需要将数据整理成 data.frame 或 data.frame 格式,其中一列代表您的不同结果,其他列是每个结果的特征。

另外,如果你想做分类,而不是回归,你的结果需要是 factor

为了清楚起见,我尝试 运行 训练代码如下,效果很好。

library(caret)
load("data.RData")
load("testClass_new.RData")

label <- factor(c(label, recursive = TRUE))
trainingDigit <- data.frame(do.call(rbind, trainingDigit))

control <- trainControl(method = "repeatedcv",
                        number = 10,
                        repeats = 5,
                        p = 0.9)

knnFit <- train(x = trainingDigit,
                y = label,
                metric = "Accuracy",
                method = "knn",
                trControl = control,
                preProcess = "pca")