Задача mlr3$feature_names - это переупорядочивание переменных в R?
Итак, моя проблема в том, что когда у меня есть фрейм данных, а затем я создаю задачу, используя mlr3
с task$feature_names
функция, она возвращает переменные в алфавитном порядке или в (своего рода) неправильном числовом порядке, тогда как я хотел бы сохранить порядок, в котором имена функций отображаются во фрейме данных. Ниже я привел 2 примера того, что я имею в виду. 1-й пример представляет собой (несколько) числовой пример, а 2-й пример - алфавитный.
Пример 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"
Итак, из-за ведущей 1 в X10, 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
В результате получится что-то вроде этого:
Как можно видеть, он отображает X10 между X1 и X2. В идеале я хотел бы сохранить порядок функций в том порядке, в котором они появляются во фрейме данных. Я знаю, что могут быть другие способы изменить порядок сюжета, однако я полагался на$feature_names
в большой функции построения графиков, которую я создал. Изначально я использовалgetTaskFeatureNames(task)
от mlr
, который сохраняет имена функций в исходном порядке... но я недавно обновился до mlr3
и это, кажется, меняет порядок.
2 ответа
Если вы можете привести пример или вариант использования, в котором важен порядок функций, мы можем попытаться сохранить его.
У нас было короткое обсуждение, и мы не считаем это ошибкой. Вы также можете просмотреть данные в задаче и получить имена столбцов.
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)