2

所以我的问题是,当我有一个数据框,然后使用mlr3'stask$feature_names函数创建一个任务时,它会以字母顺序或(某种)不正确的数字顺序返回变量,而我想保持特征名称的顺序出现在数据框中。我在下面提供了两个例子来说明我的意思。第一个示例是(有点)数字示例,第二个示例是字母顺序。

示例 1(数字):

library(mlr3)
# Set Values
n <- 10      # No of rows
p <- 10       # No of cols
e <- rnorm(n) # used for noise
b <- 10      


# Create matrix of values
xValues <- matrix(rnorm(n*p), nrow=n)   # Create matrix wt 3 columns
colnames(xValues)<- paste0(1:p)     # Name columns
df <- data.frame(xValues)               # Create dataframe

# Equation 
y <- (b + b*df$X1 - b*df$X2 + (b*df$X3)*(b*df$X2) + e)     # Equation

# Adding y to df
df$y <- y

# mlr3 TASK
test_T = TaskRegr$new(id = "test", backend = df, target = "y")
test_T$feature_names

因此,在上面的示例中,我创建了一些数据(即 X1 到 X11),然后创建了一个mlr3任务。但是,当我运行test_T$feature_names它时,它会返回:

[1] "X1"  "X10" "X2"  "X3"  "X4"  "X5"  "X6"  "X7"  "X8"  "X9" 

因此,由于 X10 中的前导 1,mlr3认为 X10 应该出现在 X2 之前。

示例 2(按字母顺序):

library(mlr3)
a  <-rnorm(10)
b  <-rnorm(10)
ab <-rnorm(10)
ba <-rnorm(10)
c  <-rnorm(10)
myData <- data.frame(a, b, ab, ba, c)
t_T = TaskRegr$new(id = "test", backend = myData, target = "c")
t_T$feature_names

所以这一次,我的数据框中的变量顺序用myData(即a,b,ab,ba,c)来描述。但是,当我运行时t_T$feature_names,它会返回:

[1] "a"  "ab" "b"  "ba"

它已将顺序更改为按字母顺序排列。我不确定这是故意还是疏忽mlr3......但是无论如何从mlr3创建的任务中提取特征名称,它不会重新排序变量名称?
我仍然停留在这个问题上,如果有人有任何建议吗?

编辑:我添加了一个(糟糕的)图形示例,只是为了说明问题。因此,从数值示例继续,如果我想创建一个热图样式图,但使用$feature_names它来获取特征名称,我最终会得到这样的结果:

nam <- test_T$feature_names

var_int2 = df %>% as_tibble %>% 
  mutate(var_num1 = 1:length(nam)) %>% 
  pivot_longer(cols = 1:length(nam),
               values_to = 'values') %>% 
  mutate(var_num2 = rep(1:length(nam), length(nam)),
         alpha_imp = as.integer(var_num1 == var_num2),
         alpha_int = 1 - alpha_imp)

p <- ggplot(data = var_int2, 
            mapping = aes(x = var_num1, y = var_num2)) + 
  scale_x_continuous(breaks = 1:length(nam), labels = nam, position = "top") + 
  scale_y_reverse(breaks = 1:length(nam), labels = nam) +
  geom_raster(aes(fill = y),
              alpha = var_int2$alpha_int)

p

这将产生如下内容: 热图

可以看出,它在 X1 和 X2 之间绘制 X10。理想情况下,我想保持特征出现在数据框中的顺序。我知道可能还有其他方法可以重新排序绘图,但是,我依赖于$feature_names我创建的大型绘图功能。最初,我使用的是getTaskFeatureNames(task)from mlr,它将功能名称保持在原始顺序中......但我最近更新为mlr3,这似乎改变了顺序。

4

2 回答 2

0

如果您可以提供一个功能顺序很重要的示例或用例,我们可以尝试保留它。

于 2020-07-02T17:29:25.553 回答
-1

我们进行了简短的讨论,不认为这是一个错误。也可以查看任务中的数据,获取列名

task = tsk("mtcars")
task$feature_names
# [1] "am"   "carb" "cyl"  "disp" "drat" "gear" "hp"   "qsec" "vs"   "wt"  
colnames(task$data())
# [1] "mpg"  "am"   "carb" "cyl"  "disp" "drat" "gear" "hp"   "qsec" "vs"   "wt" 

请注意,这包含目标列。此外,如果您使用另一个后端,它可能会变慢,data.table因为数据将被检索,而$feature_names与数据无关。

综上所述,您可以使用此解决方案的顺序很重要

setdiff(colnames(task$data()), task$target_names)
于 2020-07-02T16:42:47.477 回答