0

我正在使用 caret 中的 ranger 方法开发一个随机森林模型来预测死亡风险,并且我的数据集高度不平衡,因此我在我的 trainControl 中对少数类进行上采样。但是,我还想在我的模型中添加一个权重声明。

我使用插入符号的原因是因为我希望能够在交叉验证期间而不是之前使用对我的少数类进行上采样,以避免过度乐观的模型。

我想出了如何使用 weights 语句,如下所示:

set.seed(40)

model_weights <- ifelse(data.train$mort_30 == "Dead",  20, 1)

control.data <- trainControl(method= "cv",  number=5, 
#sampling ="up", 
verboseIter = TRUE, classProbs = TRUE)

rfGrid <- expand.grid(
.mtry = 2:6, 
.splitrule = "gini",
.min.node.size = c(250,500))

fit.data <- train(mort_30 ~ C_SEX+V_AGE+Hemoglobin,Thrombocytes+Leukocytes+CRP,
                                      data = data.train,
                                      method = "ranger",
                                      max.depth = 5,
                                      num.trees= 1000,
                                      trControl = control.data,
                                      tuneGrid = rfGrid,
                                      weights = model_weights,
                                      importance = "impurity",
                                      verbose = TRUE)

但它似乎不起作用,当我在 CV 期间也使用上采样时(因此 # before sampling=up),因为那时我的 model_weights 的长度和样本数不再相同。我收到这条消息:

Error in model.frame.default variable lengths differ (found for '(weights)')

有谁知道是否有解决方法,所以两者(上采样+权重)可以一起工作?

4

0 回答 0