本文介绍了在GraphLearner中使用mlr3管道输入数据和编码系数列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

关于mlr3-管道的使用,我有几个问题。事实上,我的目标是创建一个将三个3图结合在一起的管道:

1-处理分类变量的图表:级别归因=>标准化

imp_cat     = po("imputenewlvl", param_vals =list(affect_columns = selector_name(my_cat_variables)))
encode      = po("encode",     param_vals =list(affect_columns = selector_name(my_cat_variables)))
cat = imp_cat %>>% encode

2-处理数值变量子集的图形:均值归因=>标准化

imp_mean = po("imputemean", param_vals = list(affect_columns =selector_name(my_first_set_of_numeric_variables)))
scale = po("scale", param_vals = list(affect_columns = selector_name(my_first_set_of_numeric_variables)))
num_mean = imp_mean %>>% scale

处理另一个数值变量子集的第三个图:中值推算=>最小最大定标

imp_median = po("imputemedian", param_vals = list(affect_columns =selector_name(my_second_set_of_numeric_variables)))
min_max = po("scalerange", param_vals = list(affect_columns = selector_name(my_second_set_of_numeric_variables)))
num_median = imp_median %>>% min_max

功能联合操作合并这些图表:

graph = po("copy", 3) %>>%
   gunion(list(cat, num_mean, num_median )) %>>%
   po("featureunion")

最后在GraphLearner中添加学习者:

g1 = GraphLearner$new(graph %>>% po(lrn("classif.ranger")))

我的数据中有一些缺失值,因此在每个图中使用计算机,我有一个二进制分类任务。

my_task = TaskClassif$new(id="classif", backend = data, target = "my_target")

从理论上讲,我开始学习时不应该有遗漏值错误。

g1$train(my_task)

但根据我选择的学习者,我有几个错误。例如,如果我使用Ranger作为学习器:我有这个错误

Error: Missing data in columns: ....

如果我使用svm、glmnet或xgvoost:由于类别变量的存在,我会遇到问题。Error : has the following unsupported feature types: factor...

使用我的管道,我不应该有一个分类变量,也不应该有缺失值。因此,我看不到如何克服这个问题。

1-我在每个图表中使用了一台计算机,为什么有些算法告诉我总是有缺失值?

2-如何删除编码后的分类变量?某些算法不支持此类型的变量

更新

我认为在管道期间所做的所有修改都不是持久化的。换句话说,算法(svm、ranger等)使列车运行在原始任务上,而不是运行在流水线更新的任务上

推荐答案

第一个问题的答案

我将尝试解释为什么您的工作流中总是缺少值。

让我们加载一堆包

library(mlr3) 
library(mlr3pipelines)
library(mlr3learners)
library(mlr3tuning)
library(paradox)

让我们采用缺少值的任务PIMA

task <- tsk("pima")
task$missings()
diabetes      age  glucose  insulin     mass pedigree pregnant pressure  triceps 
       0        0        5      374       11        0        0       35      227 

因为没有分类列,所以我将三头肌转换为一:

hb <- po("histbin",
         param_vals =list(affect_columns = selector_name("triceps")))

现在分配新级别并进行编码:

imp_cat <- po("imputenewlvl",
              param_vals =list(affect_columns = selector_name("triceps")))
encode <- po("encode",
             param_vals = list( affect_columns = selector_name("triceps")))

cat <- hb %>>% 
  imp_cat %>>%
  encode

task上使用cat时:

cat$train(task)[[1]]$data()
#big output

不仅返回您选择要转换的列,还返回其他所有列

num_mediannum_mean也会发生这种情况。

让我们创建它们

imp_mean <- po("imputemean", param_vals = list(affect_columns = selector_name(c("glucose", "mass"))))
scale <- po("scale", param_vals = list(affect_columns = selector_name(c("glucose", "mass"))))
num_mean <- imp_mean %>>% scale


imp_median <- po("imputemedian", param_vals = list(affect_columns = selector_name(c("insulin", "pressure"))))
min_max <- po("scalerange", param_vals = list(affect_columns = selector_name(c("insulin", "pressure"))))
num_median <- imp_median %>>% min_max

检查num_median做什么

num_median$train(task)[[1]]$data()
#output
     diabetes    insulin  pressure age glucose mass pedigree pregnant triceps
  1:      pos 0.13341346 0.4897959  50     148 33.6    0.627        6      35
  2:      neg 0.13341346 0.4285714  31      85 26.6    0.351        1      29
  3:      pos 0.13341346 0.4081633  32     183 23.3    0.672        8      NA
  4:      neg 0.09615385 0.4285714  21      89 28.1    0.167        1      23
  5:      pos 0.18509615 0.1632653  33     137 43.1    2.288        0      35
 ---                                                                         
764:      neg 0.19951923 0.5306122  63     101 32.9    0.171       10      48
765:      neg 0.13341346 0.4693878  27     122 36.8    0.340        2      27
766:      neg 0.11778846 0.4897959  30     121 26.2    0.245        5      23
767:      pos 0.13341346 0.3673469  47     126 30.1    0.349        1      NA
768:      neg 0.13341346 0.4693878  23      93 30.4    0.315        1      31

所以它在"胰岛素"和"压力"栏上做了它应该做的事情,但也原封不动地返回了其余的。

通过复制数据三次,并在每个步骤中应用这三个预处理器,您不仅返回转换后的列,还返回其余的所有列--三次。

您应该做的是:

graph <- cat %>>%
  num_mean %>>%
  num_median

cat转换选定的列并返回全部,然后num_mean转换选定的列并返回全部...

graph$train(task)[[1]]$data()

我觉得不错

更重要的是

g1 <- GraphLearner$new(graph %>>% po(lrn("classif.ranger")))
g1$train(task)

有效

2-第二个问题的答案是使用selector functions,特别是在您的情况下

selector_type()

selector_invert(selector_type("factor"))

如果在通过管道传递给学习者之前被调用,则应执行此操作。

这篇关于在GraphLearner中使用mlr3管道输入数据和编码系数列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-26 20:03