【问题标题】:StepLDA without Cross Validation没有交叉验证的 StepLDA
【发布时间】:2016-06-23 17:36:33
【问题描述】:

我想根据训练误差选择变量。 出于这个原因,我将 trainControl 中的方法设置为“无”。但是,如果我两次运行下面的函数,我会得到两个不同的错误(正确率)。 在这个示例中,差异不值得一提。即便如此,我也完全没有预料到会有什么不同。

有人知道这种差异来自哪里吗?

library(caret)

c_1 <- trainControl(method = "none")

maxvar     <-(4) 
direction <-"forward"
tune_1     <-data.frame(maxvar,direction)

train(Species~., data=iris, method = "stepLDA", trControl=c_1, tuneGrid=tune_1)->tr

第一个

`stepwise classification', using 10-fold cross-validated correctness rate of method lda'.
150 observations of 4 variables in 3 classes; direction: forward
stop criterion: assemble 4 best variables.
correctness rate: 0.96;  in: "Petal.Width";  variables (1): Petal.Width 
correctness rate: 0.96667;  in: "Sepal.Width";  variables (2): Petal.Width, Sepal.Width 
correctness rate: 0.97333;  in: "Petal.Length";  variables (3): Petal.Width, Sepal.Width, Petal.Length 
correctness rate: 0.98;  in: "Sepal.Length";  variables (4): Petal.Width, Sepal.Width, Petal.Length, Sepal.Length 

 hr.elapsed min.elapsed sec.elapsed 
       0.00        0.00        0.28 

第二次

> train(Species~., data=iris, method = "stepLDA", trControl=c_1, tuneGrid=tune_1)->tr
 `stepwise classification', using 10-fold cross-validated correctness rate of method lda'.
150 observations of 4 variables in 3 classes; direction: forward
stop criterion: assemble 4 best variables.
correctness rate: 0.96;  in: "Petal.Width";  variables (1): Petal.Width 
correctness rate: 0.96;  in: "Sepal.Width";  variables (2): Petal.Width, Sepal.Width 
correctness rate: 0.96667;  in: "Petal.Length";  variables (3): Petal.Width, Sepal.Width, Petal.Length 
correctness rate: 0.98;  in: "Sepal.Length";  variables (4): Petal.Width, Sepal.Width, Petal.Length, Sepal.Length 

 hr.elapsed min.elapsed sec.elapsed 
        0.0         0.0         0.3 

【问题讨论】:

    标签: r lda r-caret


    【解决方案1】:

    您仍在进行 10 折交叉验证。只要您不设置种子,当您多次训练模型时,您总会得到稍微不同的答案。

    如果您运行这段代码,包括 set.seed,您将获得相同的正确率。

    set.seed(42)
    tr <- train(Species~., data=iris, method = "stepLDA", trControl=c_1, tuneGrid=tune_1)
    

    根据评论编辑:

    10 倍交叉验证的正确率不是来自 Caret,而是来自 klaR 包中的 stepclass 函数。

    stepclass(x, 分组, 方法, 改进 = 0.05, maxvar = Inf, start.vars = NULL, 方向 = c("both", "forward", "backward"), 标准 = “CR”,折叠 = 10,cv.groups = NULL,输出 = TRUE, min1var = TRUE, ...)

    用于交叉验证的折叠参数;如果‘cv.groups’是省略 指定。

    如果您愿意,可以通过将 fold 参数添加到 train 函数来进行调整:

    tr &lt;- train(Species~., data=iris, method = "stepLDA", trControl=c_1, tuneGrid=tune_1, fold = 1)

    但是 1 的折叠是没有意义的。你会得到一堆警告和错误。

    【讨论】:

    • 输出中的行“使用 10 倍 CV...”永远不会改变(即使我选择 k = 5)。我认为是某事。否则。
    • 谢谢!我期待这样的事情。您的回答有助于我了解 caret 包的工作原理。所以我不仅可以设置调整参数,还可以设置原始功能的所有其他参数?如果我理解正确,那么通过 trainControl 告诉 stepLDA 执行 CV 会导致对已经交叉验证的结果进行交叉验证。这是真的吗?
    • 确实如此。只需使用 method = cv 运行代码,您就可以从 caret 获得具有交叉验证正确率的 cv。
    猜你喜欢
    • 2020-10-17
    • 2018-09-07
    • 2020-08-29
    • 2018-08-02
    • 2016-10-31
    • 2012-12-31
    • 2018-09-21
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多