所以我的问题是,当我有一个数据框,然后使用mlr3的task$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。最初,我使用的是mlr的getTaskFeatureNames(task),它保持了功能名称的原始顺序……但我最近更新到了mlr3,这似乎改变了顺序。
发布于 2020-07-03 01:29:26
如果您可以提供一个示例或用例,其中功能的顺序很重要,我们可以尝试保留它。
发布于 2020-07-03 00:42:47
我们有一个简短的讨论,不要认为这是一个错误。您还可以查看任务中的数据并获取列名
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)https://stackoverflow.com/questions/62646969
复制相似问题