首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MLR3的task$feature_names正在重新排序R中的变量?

MLR3的task$feature_names正在重新排序R中的变量?
EN

Stack Overflow用户
提问于 2020-06-30 05:31:54
回答 2查看 108关注 0票数 2

所以我的问题是,当我有一个数据框,然后使用mlr3task$feature_names函数创建一个任务时,它会以字母顺序或(某种)错误的数字顺序返回变量,而我希望保持特征名称在数据框中出现的顺序。我提供了下面两个我想要的例子。第一个例子是(有点)数字例子,第二个例子是按字母顺序排列的。

示例1(数字):

代码语言:javascript
复制
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时,它返回以下内容:

代码语言:javascript
复制
[1] "X1"  "X10" "X2"  "X3"  "X4"  "X5"  "X6"  "X7"  "X8"  "X9" 

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

示例2(按字母顺序):

代码语言:javascript
复制
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时,它返回以下内容:

代码语言:javascript
复制
[1] "a"  "ab" "b"  "ba"

它已将顺序更改为字母顺序。我不确定这是故意的还是mlr3的疏忽...但有没有办法从mlr3创建的任务中提取功能名称,其中它不会对变量名称进行重新排序?

我仍然被这个问题卡住了,如果有人有什么建议的话?

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

代码语言:javascript
复制
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。最初,我使用的是mlrgetTaskFeatureNames(task),它保持了功能名称的原始顺序……但我最近更新到了mlr3,这似乎改变了顺序。

EN

回答 2

Stack Overflow用户

发布于 2020-07-03 01:29:26

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

票数 0
EN

Stack Overflow用户

发布于 2020-07-03 00:42:47

我们有一个简短的讨论,不要认为这是一个错误。您还可以查看任务中的数据并获取列名

代码语言:javascript
复制
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是独立于数据的。

总而言之,你可以使用这个解决方案的顺序是很重要的

代码语言:javascript
复制
setdiff(colnames(task$data()), task$target_names)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62646969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档