首页 文章

如何使用R-caret对回归问题中的不 balancer 类进行子采样?

提问于
浏览
-1

我是堆栈溢出和预测建模的新手 . 我试图根据光谱学预测叶片大小 . 然而,叶片大小(连续变量)取决于植物的生命形式(在我的例子中,3个分类) . 这些课程严重失衡 . 最重要的是,我想知道光谱学如何预测每个类别中的叶片大小 . 目前,我不确定如何拆分我的数据集,我在网上找到的大多数例子都是严格的分类问题,我不确定它是否适用于这种情况 . 我是否必须为每个 class 构建一个单独的训练集,或者这是对训练集进行二次取样(向下,向上等)然后执行回归的正确方法?我正在使用R上的插入包,因为我也正在构建机器学习方法的集合,并且插入符号似乎是最用户友好的方式 . 我的数据集包括1647个预测变量和1500个观测值 . 到目前为止,我正在为每个类构建单独的模型,但它似乎不是正确的方法 .

library(caret)
library(dplyr)
#data
 str(df,10)
'data.frame':   1648 obs. of  1904 variables:
$ life_form: Factor w/ 3 levels "","herbaceous",..
$ leaf_size: num  120.4 73.6 85.4 60.1 108.7 ...
$ X601     : num  0.0847 0.1065 0.1286 0.084 0.0967 ...
$ X602     : num  0.0844 0.1062 0.1284 0.0837 0.0964 ...
$ X603     : num  0.0841 0.1058 0.1281 0.0833 0.0961 ...
$ X604     : num  0.0837 0.1053 0.1277 0.0829 0.0957 ...
$ X605     : num  0.0833 0.1049 0.1273 0.0824 0.0953 ...
$ X606     : num  0.0828 0.1044 0.1269 0.0819 0.0948 ...
$ X607     : num  0.0823 0.1039 0.1265 0.0814 0.0943 ...
$ X608     : num  0.0818 0.1033 0.1259 0.0809 0.0937 ...
 ....
$ X2500    : num  0.0853 0.1072 0.129 0.0847 0.0972 ...

  df %>% 
  group_by(life_form) %>% 
  summarise(n = n())

# A tibble: 
1 ""             4
2 grass        564
3 herbaceous   227
4 woody        853

#Filtering per class
woody = df %>% dplyr::filter(life_form =="woody")

# Data partition
index <- createDataPartition(woody$leaf_size, p = 0.7, list = FALSE)
train_data <- woody[index, ]
test_data  <- woody[-index, ]

control = trainControl(method ="cv",number= 10, repeat=5,   selectionFunction = "oneSE")
set.seed(1234)
mod1 <- train(tam_folha ~ ., data = train_data,
method = "pls",
metric = "RMSE",
tuneLength = 10,
trControl = control)

### Repeat to other life form classes

1 回答

  • 1

    你似乎有点困惑;显然,你有一个类不 balancer 的问题 .

    类不 balancer 仅适用于分类设置(您处于回归模式);它与类(结果,即你想要预测的结果)有关,而与你的情况不同 . 教科书示例是当您遇到二进制分类问题(0/1)时,例如,99%的样本属于0级,并且您需要采用特定技术以防止分类器获得99%的准确率通过天真地预测0级的所有内容,即忽略1级(通常,它恰好是感兴趣的类,代表例如故障,患者等) .

    以上任何内容均不适用于您的情况 .

    话虽如此,根据 life_form 功能的值将数据集分成较小的数据集并不是一种无效的方法,一般来说(但不是由于类不 balancer ,这里不存在) . 确定是否应该这样做的最安全的方法是很好的反复试验:尝试一下,并尝试使用整个数据集 . 原则上,没有理由为什么典型的ML算法不能处理这些特征中的不 balancer .

相关问题