r - 在 `r` 的 `caret` 包中训练测试拆分

标签 r r-caret

我开始熟悉 rcaret包,但是,来自其他编程语言,它彻底让我感到困惑。

我现在想做的是一个相当简单的机器学习工作流程,它是:

  • 拿一个训练集,在我的例子中是 iris 数据集
  • 将其拆分为训练和测试集(80-20 拆分)
  • k来自 120 ,训练k训练集上的最近邻分类器
  • 在测试集上测试

  • 我了解如何做第一部分,因为 iris已经加载。然后,第二部分通过调用完成
    a <- createDataPartition(iris$Species, list=FALSE)
    training <- iris[a,]
    test <- iris[-a,]
    

    现在,我也知道我可以通过调用来训练模型
    library(caret)
    knnFit <- train()
    knnFit <- train(Species~., data=training, method="knn")
    

    但是,这将导致 r已经对参数 k 进行了一些优化.当然,我可以限制k的值。该方法应该尝试,类似
    knnFit <- train(Species~., data=training, method="knn", tuneGrid=data.frame(k=1:20))
    

    这工作得很好,但它仍然不完全符合我的要求。此代码现在可以为每个 k :
  • test 中获取引导样本.
  • 评估 k 的性能-nn 方法使用给定的样本

  • 我想要它做什么:
  • 每个k , 训练模型 在我之前构建的同一列火车上
  • 在我之前构建的同一测试集上评估性能**。

  • 所以我需要类似的东西
    knnFit <- train(Species~., training_data=training, test_data=test, method="knn", tuneGrid=data.frame(k=1:20))
    

    但这当然行不通。

    我知道我应该对 trainControl 做些什么参数,但我看到它可能的方法是:
    "boot", "boot632", "cv", "repeatedcv", "LOOCV", "LGOCV", "none"
    

    这些似乎都没有做我想要的。

    最佳答案

    如果我正确理解了问题,这可以在使用 LGOCV(Leave-group-out-CV = 重复训练/测试拆分)并设置训练百分比 p = 0.8 的插入符号内完成。并将训练/测试的重复拆分为 number = 1如果您真的只想要一个模型适合每个 k这是在测试集上测试的。设置 number > 1 将在 number 上反复评估模型性能不同的训练/测试分组。

    data(iris)
    library(caret)
    set.seed(123)
    mod <- train(Species ~ ., data = iris, method = "knn", 
                 tuneGrid = expand.grid(k=1:20),
                 trControl = trainControl(method = "LGOCV", p = 0.8, number = 1,
                                          savePredictions = T))
    

    不同模型在测试集上所做的所有预测都在 mod$pred 中。如果 savePredictions = T .备注 rowIndex :这些是已经被采样到测试集中的行。这些对于 k 的所有不同值都是相等的,所以每次都使用相同的训练/测试集。
    > head(mod$pred)
        pred    obs rowIndex k  Resample
    1 setosa setosa        5 1 Resample1
    2 setosa setosa        6 1 Resample1
    3 setosa setosa       10 1 Resample1
    4 setosa setosa       12 1 Resample1
    5 setosa setosa       16 1 Resample1
    6 setosa setosa       17 1 Resample1
    > tail(mod$pred)
             pred       obs rowIndex  k  Resample
    595 virginica virginica      130 20 Resample1
    596 virginica virginica      131 20 Resample1
    597 virginica virginica      135 20 Resample1
    598 virginica virginica      137 20 Resample1
    599 virginica virginica      145 20 Resample1
    600 virginica virginica      148 20 Resample1 
    

    除非需要某种嵌套的验证程序,否则无需在插入符号之外手动构建训练/测试集。您还可以为 k 的不同值绘制验证曲线。来自 plot(mod) .

    关于r - 在 `r` 的 `caret` 包中训练测试拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35718350/

    相关文章:

    sql - 将查询作为变量传递给 Rmarkdown sql block

    r - 如何 'unlist' data.table 中的一列

    r - 计算一段时间内的返回

    r - 使用 stargazer 从插入符导出 glm 训练拟合摘要?

    r - "best tune"和 "Resampling results across tuning parameters"插入符 R 包不一致

    r - 使用插入符号和data.table创建数据分区

    r - 如何使 PCA 矢量箭头加粗(更宽)?

    R read.spss 导入 SPSS .por 文件时出错 - "Bad character in time"

    r - random Forest() 和插入符号 randomForest 的不同结果(方法 = "rf")

    r - "response"用地球 (MARS) 和 R 中的插入符号进行预测