使用非常有用的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的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) 我有一些关于 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) 这是一个新手问题。如何定义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?
我在过滤模型中最不重要的变量时遇到了困难。我收到了一组包含 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) 最近有人建议我将机器学习框架更改为 mlr3。但我发现过渡比我一开始想象的要困难一些。在我当前的项目中,我正在处理高度不平衡的数据,我希望在训练模型之前对其进行平衡。我发现这个教程解释了如何通过管道和图形学习器处理不平衡:
https://mlr3gallery.mlr-org.com/posts/2020-03-30-imbalanced-data/
恐怕这种方法也会通过新数据预测来执行类平衡。我为什么要这样做并减少我的测试样本?
所以出现的两个问题是:
当然,我可以手动对训练数据进行子集化并自己处理不平衡问题,但这不再有趣了!:)
无论如何,感谢您的回答,
干杯!
我喜欢在 mlr3 中使用留一法交叉验证(作为管道的一部分)。
我可以指定折叠数(=实例数),例如通过
resampling = rsmp("cv", folds=task$nrow)
Run Code Online (Sandbox Code Playgroud)
但这明确指的是可能无法在管道中工作的“任务”。
我怎样才能在这里继续?
我正在使用 R 中的 mlr3 包进行建模和预测。我正在处理一个包含测试集和训练集的大数据集。测试集和训练集由指示符列指示(在代码中:test_or_train)。
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) 在调整学习器并使用它之后,我们可以使用它通过命令行进行预测
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) 我想使用许多(> 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()显然不起作用! …
假设我有一台 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 中使用 mlr3 包训练并测试了决策树分类器:
pred_probability = learner_DT$train(task_train)$predict(task_test)
我怎样才能从这个模型中获得变量重要性?我试过了,learner_DT$importance()但结果是named numeric(0)
任何帮助表示赞赏。