当前位置: 首页 > 知识库问答 >
问题:

R使用插入符号训练函数的随机林交叉验证不会产生与手工执行相同的准确性

洪俊能
2023-03-14

我正在工作中的一些数据上建立一个随机森林(这意味着我不能分享那个数据,有15K个观测),使用插入符号训练函数进行交叉验证,模型的准确率很低:0.9%。

下面是我使用的代码:

set.seed(512)
n <- nrow(my_data)

train_indices <- sample(1:n)
my_folds <- createFolds(train_indices, k=5)

model <- train(ICNumber ~ ., tuneGrid = data.frame(mtry = c(32), min.node.size = 1, splitrule = "gini"),
                 data = my_data, method = "ranger",
                 trControl = trainControl(verboseIter = TRUE, savePredictions = T, index=my_folds))

print(model$resample)
Accuracy ___ Kappa_____ Resample  
0.026823683_ 0.0260175246_ Fold1  
0.002615234_ 0.0019433907_ Fold2  
0.002301118_ 0.0017644472_ Fold3  
0.001637733_ 0.0007026352_ Fold4  
0.010187315_ 0.0094986595_ Fold5  
set.seed(512)
n <- nrow(my_data)

train_indices <- sample(1:n)
my_folds <- createFolds(train_indices, k=5)

for (fold in my_folds) {
  train_data <- my_data[-fold,]
  test_data <- my_data[fold,]

  model <- train(ICNumber ~ ., tuneGrid = data.frame(mtry = c(32), min.node.size = 1, splitrule = "gini"),
                 data = train_data, method = "ranger",
                 trControl = trainControl(method = "none"))

  p <- predict(model, test_data)
  e <- ifelse(p == test_data$ICNumber, T, F)
  print(sum(e) / nrow(test_data))
}
[1] 0.743871  
[1] 0.7566957  
[1] 0.7380645  
[1] 0.7390181  
[1] 0.7311168

--edit2
以下是有关我的数据的一些详细信息:
15493 OBS。17个变量中:
ICNUmber是一个包含1531个不同值的字符串,这些是类
其他16个变量是具有33个级别的因子
--edit2

--edit3
我的最后一个实验是删除所有出现次数少于10次的类的观察,剩下396个类的12k个观察。对于此数据集,手动和自动交叉验证精度匹配...
--edit3

共有1个答案

东方镜
2023-03-14

这是一个棘手的问题!;-)
错误是由于误用了traincontrol中的index选项。

根据帮助页,index应为:

包含每个重采样迭代的元素的列表。每个列表元素都是一个整数向量,对应于在该迭代中用于训练的行。

library(caret)
#> Le chargement a nécessité le package : lattice
#> Le chargement a nécessité le package : ggplot2
data(Soybean, package = "mlbench")
my_data <- droplevels(na.omit(Soybean))
set.seed(512)
n <- nrow(my_data)

train_indices <- sample(1:n)
my_folds <- createFolds(train_indices, k=5)

model <- train(Class ~ ., tuneGrid = data.frame(mtry = c(32), min.node.size = 1, splitrule = "gini"),
               data = my_data, method = "ranger",
               trControl = trainControl(verboseIter = F, savePredictions = T, 
                                        index=my_folds))
#> Warning: Dropped unused factor level(s) in dependent variable: rhizoctonia-
#> root-rot.
#> Warning: Dropped unused factor level(s) in dependent variable: downy-
#> mildew.

print(model$resample)
#>    Accuracy     Kappa Resample
#> 1 0.7951002 0.7700909    Fold1
#> 2 0.5846868 0.5400131    Fold2
#> 3 0.8440980 0.8251373    Fold3
#> 4 0.8822222 0.8679453    Fold4
#> 5 0.8444444 0.8263563    Fold5
set.seed(512)
n <- nrow(my_data)

train_indices <- sample(1:n)
my_folds <- createFolds(train_indices, k=5, returnTrain = T)

model <- train(Class ~ ., tuneGrid = data.frame(mtry = c(32), min.node.size = 1, splitrule = "gini"),
               data = my_data, method = "ranger",
               trControl = trainControl(verboseIter = F, savePredictions = T, 
                                        index=my_folds))

print(model$resample)
#>    Accuracy     Kappa Resample
#> 1 0.9380531 0.9293371    Fold1
#> 2 0.8750000 0.8583687    Fold2
#> 3 0.9115044 0.9009814    Fold3
#> 4 0.8660714 0.8505205    Fold4
#> 5 0.9107143 0.9003825    Fold5
set.seed(512)
n <- nrow(my_data)

train_indices <- sample(1:n)
my_folds <- createFolds(train_indices, k=5)

for (fold in my_folds) {
    train_data <- my_data[-fold,]
    test_data <- my_data[fold,]

    model <- train(Class ~ ., tuneGrid = data.frame(mtry = c(32), min.node.size = 1, splitrule = "gini"),
                   data = train_data, method = "ranger",
                   trControl = trainControl(method = "none"))

    p <- predict(model, test_data)
    e <- ifelse(p == test_data$Class, T, F)
    print(sum(e) / nrow(test_data))
}
#> [1] 0.9380531
#> [1] 0.875
#> [1] 0.9115044
#> [1] 0.875
#> [1] 0.9196429

由reprex包(v0.2.0)于2018-03-09创建。

 类似资料:
  • 我有一个关于库中的函数的问题。在插入符号-主页链接上,它们给出了以下RFE算法:算法 对于本例,我使用具有3重交叉验证的函数,使用具有线性SVM和5重交叉验证的train函数。 根据上面的算法,我假设该算法将与2个嵌套交叉验证一起工作: 将数据(150个样本)拆分为3个折叠 函数将在训练集(100个样本)上运行,并进行5次交叉验证,以调整模型参数--以及随后的RFE。 干杯

  • 我最近一直在研究R包,有一个关于训练过程中模型的可再现性和比较性的问题,但我还没能确定下来。 我的意图是,每个调用以及由此产生的每个模型都使用相同的交叉验证拆分,以便交叉验证的初始存储结果与构建过程中计算的模型样本外估计具有可比性。 我见过的一种方法是,您可以在每次调用之前指定种子: 但是,在调用之间共享对象是否意味着它们通常使用相同的重采样和索引,或者是否必须将参数显式传递到函数中。列控对象在使

  • 本文向大家介绍scikit-learn 使用交叉验证训练分类器,包括了scikit-learn 使用交叉验证训练分类器的使用技巧和注意事项,需要的朋友参考一下 示例 使用虹膜数据集: 数据分为训练集和测试集。要做到这一点,我们使用train_test_split效用函数来分割双方X和y(数据和目标矢量)用随机选择train_size=0.75(训练集包含数据的75%)。 训练数据集被输入到k最近邻

  • 关于使用Lenet5网络解释MNIST上某些优化器的性能,我有几个问题,以及验证损失/精度与训练损失/精度图确切地告诉我们什么。因此,所有的事情都是在Keras中使用标准的LeNet5网络完成的,它运行了15个历元,批处理大小为128。 有两个图,列车acc vs val acc和列车损失vs val损失。我生成了4个图,因为我运行了两次,一次是validation_split=0.1,一次是va

  • *种子为重复性设置为123,我运行的是3.63 R。

  • 问题内容: 我目前正在研究一个问题,该问题将在同一数据集上比较三种不同的机器学习算法的性能。我将数据集分为70/30训练/测试集,然后使用GridSearchCV和进行网格搜索以找到每种算法的最佳参数。 第一个问题,我是应该对训练集执行网格搜索,还是应该对整个数据集进行网格搜索? 第二个问题,我知道GridSearchCV在其实现中使用K折,如果我对GridSearchCV中比较的所有三种算法都使