【问题标题】:How to Dynamically Specify Class Labels in R?如何在 R 中动态指定类标签?
【发布时间】:2021-03-05 15:37:05
【问题描述】:

让我首先给出一个我期望在我的代码中使用的数据集形式因素的通用示例。 感谢 @Sathish 帮助我表达这一点。

attribute1 <- c("str1", "str2", "strN")
attribute2 <- c("num1", "num2", "numN")
attributeN <- c("val1", "val2", "valN")
class <- c(TRUE, FALSE, TRUE || FALSE)

df <- data.frame(attribute1, attribute2, attributeN, class)

dput(df)
print(df)

类不一定需要是布尔值。为简单起见,我只是在此示例中使用它。

我正在尝试在R 中创建一个可重用的 ANN(人工神经网络),只要数据集符合某些标准,它就可以与任何 .csv 一起使用。我遇到的一个大问题是,我似乎无法弄清楚如何使用 createDataPartition()library(caret) 之类的东西动态拆分数据:

data <- createDataPartition(dataset$lapply(dataset[ncol(dataset)]), p = test_ratio, list = FALSE)

这是我最近尝试解决上述代码 sn-p 的方法。注意fread()来自library(data.table)

library(caret)
library(data.table)
library(dplyr)
dataset <- as.data.frame(fread(file = file_name), header = TRUE)
class_label <- lapply(dataset[ncol(dataset)], function(x) names(dataset[ncol(dataset)]))
data <- createDataPartition('$'(dataset, class_label), p = test_ratio, list = FALSE)

类标签应该是任何数据集中的最后一列。在我看来,createDataPartition() 有点静态,因为它寻找 Data$Class 以这种特定方式进行区分。但是,我仍在学习 R,所以我可能会遗漏一些东西。我在几个地方寻找答案,但找不到任何具体的答案。

所以我认为我的问题的根源是我不确定如何使用lapply() 将类标签的名称传递给Data$Class。我的尝试给了我这个错误:

createDataPartition 中的错误(dataset$class_name, p = test_ratio, list = FALSE) : y 必须至少有 2 个数据点调用:get_stratified_samples -> createDataPartition 执行停止

我想我理解错误,但似乎无法弄清楚如何解决。我相信这是因为lapply(dataset[ncol(dataset)], function(x) names(dataset[ncol(dataset)])) 部分给了我一个类标签名称的字符串而不是类标签本身?

另外,我想做的另一件事是使用createDataPartition() 或类似的函数,根据多个类对数据进行分层拆分。这也让我望而却步。

如果我需要添加更多细节,请告诉我,我会尽力而为。

【问题讨论】:

  • @Sathish,你是对的。我用正确的信息更新了问题。我正在添加一个通用表,该表将采用我正在寻找的 .csv 数据的形式。根据我的理解,这是非常基本的。
  • 感谢您为我的问题@Sathish 提供的所有帮助。你写的有一部分我不太明白。 df$X. &lt;- NULL df$X..1 &lt;- NULL df$X..2 &lt;- NULL df$X..3 &lt;- NULL dput(df)
  • 没错。我正在尝试根据最后一列对数据进行分层拆分,该列预计是类标签,而无需提前知道类标签名称。
  • 那么df$X..1指的是数据框的第一列?另外,df$X. 让我有点困惑。它指的是什么?
  • 是的。分层拆分是一种拆分,其中原始数据集中的列值的比率保留在生成的训练和测试样本中。这就是我正在寻找的预期结果。

标签: r machine-learning r-caret


【解决方案1】:

如果您阅读 help page 中的 createDataPartition,则 y 的参数应该是“结果向量”。我不知道你想用这些代码行做什么:

class_label <- lapply(dataset[ncol(dataset)], function(x) names(dataset[ncol(dataset)]))
data <- createDataPartition('$'(dataset, class_name), p = test_ratio, list = FALSE)

如果你想动态地将数据框的一列传递给这个函数,你可以使用列名,或者列号:

splitData = function(dataset,Col,test_ratio){

      createDataPartition(dataset[,Col],p=test_ratio)

}

例如在 iris 中:

splitData(iris , "Species",0.7)
$Resample1
  [1]   2   3   4   5   7   8   9  11  13  16  17  18  19  20  22  23  24  25
 [19]  26  27  28  29  31  32  33  34  35  36  37  39  40  42  48  49  50  52
 [37]  53  54  55  56  58  59  60  61  62  63  64  68  69  70  74  75  76  77
 [55]  78  79  80  81  83  87  90  91  92  93  94  95  96  97  98  99 102 104
 [73] 106 108 110 111 112 113 114 115 117 118 119 120 121 123 124 125 128 129
 [91] 130 132 135 136 137 138 139 141 142 143 144 146 147 149 150

或者数据框的最后一列:

splitData(iris ,ncol(iris),0.7)
$Resample1
  [1]   5   6   9  11  12  13  15  16  17  18  19  21  22  24  26  27  28  29
 [19]  31  32  34  35  36  38  39  40  41  43  44  45  46  47  48  49  50  51
 [37]  52  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  73  74
 [55]  77  78  79  80  81  82  83  84  85  87  89  92  95  98  99 100 101 102
 [73] 104 105 106 107 108 110 114 115 116 118 119 121 122 123 125 127 128 129
 [91] 131 132 133 134 135 137 138 140 141 143 144 146 148 149 150

【讨论】:

  • class_name 应该是 class_label 这里。对于那个很抱歉。这段代码的目标是动态地找到类标签,它应该是数据集的最后一列。然后我想在createDataPartition() 中使用它,这样我就可以为任何数据集创建分区作为代码的输入。因此,一个数据集可能有一个名为“类”的类标签,也可能是“结果”或“类别”等。我希望我的代码不关心提供的数据集中的实际类标签名称。只需要查看最后一列即可知道类标签名称。
  • 问题在于,当我尝试将变量class_label 传递给例如dataset$class_label 时,代码会尝试查找名为“class_label”的列,而不是应用class_label 变量。所以我尝试使用$ 作为它已经存在的函数,但你可以像'$'(data, col) 那样做。当我使用'$'(dataset, class_label) 时,它会执行相同的操作,即查找名为“class_label”的列,而不是应用class_label 变量的值。
  • 实际上,我的问题可能是我将class_label 作为变量,但不小心尝试使用class_name 作为变量。当我有机会时,我会尝试一下。感谢您指出这一点。
猜你喜欢
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多