标签: mlr3

整体的 MLR3 平均分数

使用非常有用的mlr3 书中的示例,我尝试简单地返回堆叠模型输出的平均分数。有人可以解释一下如何使用 mlr3 执行此操作吗?我尝试过使用LearnerClassifAvg$new( id = "classif.avg")po("classifavg"),但不确定我是否正确应用了这些,谢谢

例子:

library("magrittr")
library("mlr3learners") # for classif.glmnet

task      = mlr_tasks$get("iris")
train.idx = sample(seq_len(task$nrow), 120)
test.idx  = setdiff(seq_len(task$nrow), train.idx)

rprt = lrn("classif.rpart", predict_type = "prob")
glmn = lrn("classif.glmnet", predict_type = "prob")

#  Create Learner CV Operators
lrn_0 = PipeOpLearnerCV$new(rprt, id = "rpart_cv_1")
lrn_0$param_set$values$maxdepth = 5L
lrn_1 = PipeOpPCA$new(id = "pca1") %>>% PipeOpLearnerCV$new(rprt, id = "rpart_cv_2")
lrn_1$param_set$values$rpart_cv_2.maxdepth = 1L
lrn_2 = PipeOpPCA$new(id = "pca2") %>>% PipeOpLearnerCV$new(glmn)

# Union them with a …
Run Code Online (Sandbox Code Playgroud)

r mlr3

6
推荐指数
1
解决办法
390
查看次数

使用“mlr3pipelines”预处理数据后,“mlr3filters”的变量重要性在“mlr3proba”中不起作用

使用 R的mlr3proba和包运行下面的代码以在预处理数据集上实现算法并执行“可变重要性”,显示错误:mlr3pipelinesmlr3filtersrpart

task <- tsk("iris")

learner <- lrn("classif.rpart")

learner <- po("encode") %>>% po("scale") %>>% po("learner", learner)      # preprocessing

learner <- GraphLearner$new(learner)  #applying learner on a graph in mlr3pipelines

filter <- flt("importance", learner = learner)    #using filter for variable importance

filter$calculate(task)
Run Code Online (Sandbox Code Playgroud)
#Error: 

Error in learner$importance() : attempt to apply non-function 
Run Code Online (Sandbox Code Playgroud)

但是当我运行上面的代码时,无需预处理,它就可以工作:

task <- tsk("iris")

learner <- lrn("classif.rpart")

filter <- flt("importance", learner = learner)

filter$calculate(task)

as.data.table(filter)
Run Code Online (Sandbox Code Playgroud)
#Results:

        feature     score
1:  Petal.Width  88.96940
2: Petal.Length  81.34496
3: Setal.Length …
Run Code Online (Sandbox Code Playgroud)

machine-learning mlr3 data-preprocessing

6
推荐指数
0
解决办法
174
查看次数

使用 mlr3-pipelines 在 GraphLearner 中估算数据并编码因子列?

我有一些关于 mlr3-pipelines 的使用问题。事实上,我的目标是创建一个结合三个 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

第三张图用于处理数值变量的另一个子集:中值插补 => 最小最大缩放

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 …
Run Code Online (Sandbox Code Playgroud)

pipeline r machine-learning mlr3

5
推荐指数
1
解决办法
1250
查看次数

使用来自数据库(不同表)的数据定义 mlr3 任务?

这是一个新手问题。如何定义tsk使用(sqlite)数据库中的数据的(分类)?该mlr3db例子似乎先写内存中的数据。就我而言,数据已经在数据库中。也许更大的问题是,目标数据和特征在不同的表中。

我试过的:

con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "my_data.db")
my_features <- dplyr::tbl(con, "my_features")
my_target <- dplyr::tbl(con, "my_targets")
task <- mlr3::TaskClassif$new("my_task", backend=my_features, target="???")
Run Code Online (Sandbox Code Playgroud)

然后我不知道如何指定target参数。

也许一个解决方案是在数据库中创建一个连接功能和目标的 VIEW?

r mlr3

5
推荐指数
1
解决办法
61
查看次数

基于重要性的变量缩减

我在过滤模型中最不重要的变量时遇到了困难。我收到了一组包含 4,000 多个变量的数据,我被要求减少进入模型的变量数量。

我确实尝试过两种方法,但我失败了两次。

我尝试的第一件事是在建模后手动检查变量重要性,并在此基础上删除不重要的变量。

# reproducible example
data <- iris

# artificial class imbalancing
data <- iris %>% 
  mutate(Species = as.factor(ifelse(Species == "virginica", "1", "0"))) 
Run Code Online (Sandbox Code Playgroud)

使用 simple 时一切正常Learner

# creating Task
task <- TaskClassif$new(id = "score", backend = data, target = "Species", positive = "1")

# creating Learner
lrn <- lrn("classif.xgboost") 

# setting scoring as prediction type 
lrn$predict_type = "prob"

lrn$train(task)
lrn$importance()

 Petal.Width Petal.Length 
  0.90606304   0.09393696 
Run Code Online (Sandbox Code Playgroud)

问题是数据高度不平衡,所以我决定使用GraphLearnerwithPipeOp运算符来对多数组进行欠采样,然后将其传递给AutoTuner

我确实跳过了我认为对这种情况不重要的代码的某些部分,例如搜索空间、终止符、调谐器等。

# undersampling
po_under …
Run Code Online (Sandbox Code Playgroud)

pipeline r machine-learning xgboost mlr3

4
推荐指数
1
解决办法
164
查看次数

使用 mlr3 处理类别不平衡问题

最近有人建议我将机器学习框架更改为 mlr3。但我发现过渡比我一开始想象的要困难一些。在我当前的项目中,我正在处理高度不平衡的数据,我希望在训练模型之前对其进行平衡。我发现这个教程解释了如何通过管道和图形学习器处理不平衡:

https://mlr3gallery.mlr-org.com/posts/2020-03-30-imbalanced-data/

恐怕这种方法也会通过新数据预测来执行类平衡。我为什么要这样做并减少我的测试样本?

所以出现的两个问题是:

  1. 我在测试数据中不平衡类别是否正确?
  2. 如果是这样,mlr3中有没有办法做到这一点?

当然,我可以手动对训练数据进行子集化并自己处理不平衡问题,但这不再有趣了!:)

无论如何,感谢您的回答,
干杯!

pipeline r mlr3 imbalanced-data

3
推荐指数
1
解决办法
421
查看次数

mlr3 中的留一法交叉验证

我喜欢在 mlr3 中使用留一法交叉验证(作为管道的一部分)。

我可以指定折叠数(=实例数),例如通过

resampling = rsmp("cv", folds=task$nrow)
Run Code Online (Sandbox Code Playgroud)

但这明确指的是可能无法在管道中工作的“任务”。

我怎样才能在这里继续?

cross-validation mlr3

3
推荐指数
1
解决办法
46
查看次数

如何根据mlr3中的指标列和批量训练预测对任务进行子集化?

背景

我正在使用 R 中的 mlr3 包进行建模和预测。我正在处理一个包含测试集和训练集的大数据集。测试集和训练集由指示符列指示(在代码中:test_or_train)。

目标

  1. 使用数据集中的 train_or_test 列指示的训练行对所有学习器进行批量训练。
  2. 使用相应的训练学习器批量预测 test_or_train 列中由“test”指定的行。

代码

  1. 占位符数据集与测试火车指标列。(在实际数据中 train-test split 不是人为的)
  2. 两个任务(在实际代码中任务是不同的,而且还有更多。)
library(readr)
library(mlr3)
library(mlr3learners)
library(mlr3pipelines)
library(reprex)
library(caret)

# Data
urlfile = 'https://raw.githubusercontent.com/shudras/office_data/master/office_data.csv'
data = read_csv(url(urlfile))[-1]

## Create artificial partition to test and train sets
art_part = createDataPartition(data$imdb_rating, list=FALSE)
train = data[art_part,]
test = data[-art_part,]

## Add test-train indicators
train$test_or_train = 'train'
test$test_or_train = 'test'

## Data set that I want to work / am working with
data = rbind(test, train)

# Create …
Run Code Online (Sandbox Code Playgroud)

r machine-learning batch-processing mlr3

2
推荐指数
1
解决办法
161
查看次数

mlr3 - 预测的置信区间

在调整学习器并使用它之后,我们可以使用它通过命令行进行预测

predict(Learner, newdata, predict_type="response")
Run Code Online (Sandbox Code Playgroud)

但是,我们如何计算预测的置信区间?


task <- TaskRegr$new("data", data, "y")
learner <- lrn("regr.xgboost")
preprocess <- po("scale", param_vals = list(center = TRUE, scale = TRUE))
pp <- preprocess %>>% learner
gg<- GraphLearner$new(pp)
gg$train(task)
predict(gg, newdata = pred, predict_type="reponse")
Run Code Online (Sandbox Code Playgroud)

r mlr3

2
推荐指数
1
解决办法
278
查看次数

如何更改列名称以符合 mlr3 的命名约定

我想使用许多(> 50K)标记作为特征名称来执行文本分类。但是,中的Task()函数mlr3不允许在列名中包含很多字符,这些字符是通过的make.names,否则就可以了。以下是我目前找到的清单:

  mutate(token=str_replace(token, "à", "a")) %>% 
    mutate(token=str_replace(token, "ã", "a")) %>%  
    mutate(token=str_replace(token, "á", "a")) %>% 
    mutate(token=str_replace(token, "ø", "o")) %>%
    mutate(token=str_replace(token, "ç", "c")) %>%
    mutate(token=str_replace(token, "ô", "o")) %>%
    mutate(token=str_replace(token, "é", "e")) %>% 
    mutate(token=str_replace(token, "é", "e")) %>%   
    mutate(token=str_replace(token, "í", "i")) %>% 
    mutate(token=str_replace(token, "î", "i")) %>% 
    mutate(token=str_replace(token, "è", "e")) %>% 
    mutate(token=str_replace(token, "ë", "e")) %>% 
    mutate(token=str_replace(token, "å", "a")) %>%  
    mutate(token=str_replace(token, "â", "a")) %>%  
    mutate(token=str_replace(token, "æ", "a")) %>%  
    mutate(token=str_replace(token, "ñ", "n")) %>%  
Run Code Online (Sandbox Code Playgroud)

如何使我的 data.frame 与 兼容mlr3,而无需以这种方式手动替换所有特殊字符(反复试验)?make.names()显然不起作用! …

r mlr3

2
推荐指数
1
解决办法
68
查看次数

mlr3 正确设置并行化

假设我有一台 32 个核心的机器,并且希望尽可能高效地执行 5 个外折叠和 3 个内折叠的嵌套 CV。

在外层,我对两个或多个学习器进行基准测试,在内层,我为一个或 nk 个学习器调整超参数。

如何设置batch_size和future::plan()?

term_eval 如何取决于批量大小?

这明智吗?我的直觉是更好地并行运行内部循环。但我不确定 term_evals 和 batch_size。

lrn1 <- auto_tuner(
  method = "random_search",
  learner = lrn1,
  resampling = rsmp("cv", folds = 3),
  measure = msr("classif.auc"),
  term_evals = 100,
  batch_size = 10,
  store_models = TRUE
)

design = benchmark_grid(task = task, learner = c(lrn1, lrn2), resampling = rsmp("cv", folds = 5))

# Runs the inner loop in parallel and the outer loop sequentially
future::plan(list("sequential", "multisession"))

bmr = benchmark(design, store_models = …
Run Code Online (Sandbox Code Playgroud)

r machine-learning mlr3

2
推荐指数
1
解决办法
256
查看次数

mlr3 rpart学习器中未定义变量重要性

我在 R 中使用 mlr3 包训练并测试了决策树分类器:

pred_probability = learner_DT$train(task_train)$predict(task_test)

我怎样才能从这个模型中获得变量重要性?我试过了,learner_DT$importance()但结果是named numeric(0)

任何帮助表示赞赏。

r decision-tree mlr3

1
推荐指数
1
解决办法
160
查看次数