问题标签 [mlr3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - mlr3 PipeOps:创建具有不同数据转换的分支,并对分支内和分支之间的不同学习器进行基准测试
我想使用PipeOp
s 来训练学习者对数据集的三种替代转换:
- 没有转变。
- 班级平衡。
- 班级平衡。
然后,我想对三个学习模型进行基准测试。
我的想法是按如下方式设置管道:
- 制作管道:输入 -> 估算数据集(可选)-> 分支 -> 拆分为上述三个分支 -> 在每个分支中添加学习者 -> 取消分支。
- 训练管道并希望(这就是我弄错的地方)这将是为每个分支中的每个学习者保存的结果。
不幸的是,遵循这些步骤会导致一个单一的学习者似乎已经“合并”了来自不同分支的所有内容。我希望得到一个长度为 3 的列表,但我得到了一个长度为 1 的列表。
代码:
问题 1 我怎样才能得到三个不同的结果呢?
问题 2 如何在取消分支后在管道中对这三个结果进行基准测试?
问题 3
如果我想在每个分支中添加多个学习者怎么办?我希望将一些学习者插入固定的超参数,而对于其他学习者,我希望AutoTuner
在每个分支中调整他们的超参数。然后,我想在每个分支中对它们进行基准测试,并从每个分支中选择“最佳”。最后,我想对三个最好的学习者进行基准测试,最终得到最好的。
非常感谢。
r - 在 mlr3 中,是否可以在不重新训练模型的情况下预测新数据?
虹膜的一个例子。我们有一些数据,称为 tr。
我们使用我们拥有的数据在 mlr3 中构建模型:
现在我想用我建立的模型预测 newdata,但我只找到row_ids作为预测的参数。newdata 数据集在 tsk 中没有 row_ids。我知道我可以将这些数据合并到模型中并重新训练。但我的问题是:有没有办法在不重新训练 tsk 的情况下进行预测?
谢谢!
r - mlr_measures_classif.costs,predict_type = "prob"
成本敏感度量mlr_measures_classif.costs
需要一个'response'
预测类型。
predict_type
即使将学习者的设置为:此措施似乎也有效'prob'
:
为什么它的工作predict_type
设置为'prob'
?这是一个错误还是该度量在内部将概率转换为类?我猜预测一个类别为正面或负面的阈值在内部设置为 0.5?可以改变这个阈值吗?
r - mlr3 中的自定义 Precision-Recall AUC 测量
我想在 mlr3 中创建一个自定义的 Precision-Recall AUC 度量。
我觉得我快到了,但是 R 抛出了一个我不知道如何解释的恼人的错误。
让我们定义度量:
让我们看看它是否有效:
这是回溯:
似乎故障来自PRROC::pr.curve
. 但是,在实际预测对象上尝试此功能时pred
,它工作得很好:
发生错误的一种可能情况是,在内部PRAUC
,PRROC::pr.curve
的参数weights.class0
是NA
。我无法确认这一点,但我怀疑weights.class0
是接收NA
而不是数字,导致PRROC::pr.curve
内部出现故障PRAUC
。如果是这样的话,我不知道为什么会这样。
可能还有其他我没有想到的场景。任何帮助都感激不尽。
编辑
misuse的回答帮助我意识到为什么我的措施不起作用。第一的,
PRROC::pr.curve(scores.class0 = prediction$prob, weights.class0 = truth1)
应该
PRROC::pr.curve(scores.class0 = prediction$prob[, 1], weights.class0 = truth1)
.
其次,函数pr.curve
返回一个类对象PRROC
,而mlr3
我定义的度量实际上是期望numeric
的。所以应该是
PRROC::pr.curve(scores.class0 = prediction$prob[, 1], weights.class0 = truth1)[[2]]
或者
PRROC::pr.curve(scores.class0 = prediction$prob[, 1], weights.class0 = truth1)[[3]]
,
取决于用于计算 AUC 的方法(请参阅参考资料?PRROC::pr.curve
)。
请注意,虽然MLmetrics::PRAUC
远没有那么令人困惑PRROC::pr.curve
,但似乎前者实施得不好。
PRROC::pr.curve
这是实际有效的措施的实现:
例子:
然而,现在的问题是改变正类会导致不同的分数:
r - mlr3 使用自动调谐参数预测新数据
我对此有一个后续问题。与最初的问题一样,我正在使用 mlr3verse,拥有一个新数据集,并希望使用在自动调整期间表现良好的参数进行预测。该问题的答案是使用 at$train(task)。这似乎又开始了调优。它是否通过使用这些参数完全利用了嵌套重采样?
此外,查看 $tuning_result 有两组参数,一组称为 tune_x,一组称为 params。这些有什么区别?
谢谢。
编辑:下面添加的示例工作流
r - 使用 trafo 调整 SMOTE 的 K 失败:'warning("k should be less than sample size!")'
我SMOTE {smotefamily}
的K
参数的 trafo 函数有问题。特别是,当最近邻的数量K
大于或等于样本大小时,返回错误(warning("k should be less than sample size!")
)并终止调整过程。
在内部重采样过程中,用户无法控制K
小于样本大小。这必须在内部进行控制,例如,如果trafo_K = 2 ^ K >= sample_size
对于 的某个值K
,则说trafo_K = sample_size - 1
。
我想知道是否有解决方案,或者是否已经在路上?
这就是发生的事情
会话信息
非常感谢。
r - 在 MLR3 中将 rpart 超调整参数与下采样相结合
我正在浏览 MLR3 包 ( mlr3gallery:imbalanced data examples ) 中的优秀示例,我希望看到一个结合了超参数调整和不平衡校正的示例。
从上面的链接中,作为我想要实现的目标的描述:
为了保持低运行时间,我们只为不平衡校正方法定义搜索空间。但是,也可以通过使用学习器的超参数扩展搜索空间来联合调整学习器的超参数和不平衡校正方法。
这是一个接近的示例 - mlr3 PipeOps:创建具有不同数据转换的分支,并对分支内和分支之间的不同学习器进行基准测试
所以我们可以(错误地)使用 misuse 的这个很好的例子作为一个演练:
那么此时我们如何添加像cp和minsplit这样的学习器超参数呢?
但这会导致:
我觉得我可能缺少一个关于如何结合这两件事的分支层(rpart 超参数/minsplit 和 cp;以及下/上采样)?感谢您提供任何帮助。
r - 如何使用 MLR3(glmnet 学习器)访问和比较 LASSO 模型系数?
目标
- 使用 MLR3 创建 LASSO 模型
- 使用带有内部 CV 或引导程序的嵌套 CV进行超参数 (lambda) 确定,使用外部 CV 进行模型性能评估(而不是只进行一次测试训练),并在不同模型实例中找到不同 LASSO 回归系数的标准偏差。
- 对尚不可用的测试数据集进行预测。
问题
- 我不确定在下面的代码中是否正确实现了所描述的嵌套 CV 方法。
- 我不确定 alpha 是否设置正确 alpha = 1 only。
- 在 mlr3 中使用重采样时,我不知道如何访问 LASSO lamda 系数。(mlr3learners 中的importance() 尚不支持LASSO)
- 我不知道如何将可能的模型应用于 mlr3 中不可用的测试集。
代码
由reprex 包(v0.3.0)于 2020 年 6 月 11 日创建
编辑 1(LASSO 系数)
根据 misuse LASSO 系数的评论,可以通过result$data$learner[[1]]$model$rp$model$glmnet.fit$beta
另外,我发现store_models = TRUE
需要在结果中设置以存储模型并依次访问系数。
- 尽管设置了 alpha = 1,我还是选择了多个 LASSO 系数。我想要“最佳”LASSO 系数(例如源自 lamda = lamda.min 或 lamda.1se)。不同的 s1, s2, s3, ... 是什么意思?这些是不同的lamdas吗?
- 不同的系数确实似乎源于不同的 lambda 值,表示为 s1, s2 , s3, ... (数字是索引。)我想,可以通过首先找到“最佳”lambda 的索引来访问“最佳”系数
index_lamda.1se = which(ft$lambda == ft$lambda.1se)[[1]]; index_lamda.min = which(ft$lambda == ft$lambda.min)[[1]]
然后找到系数集。错误使用的评论中给出了一种更简洁的方法来找到“最佳”系数。
由reprex 包(v0.3.0)于 2020 年 6 月 15 日创建
编辑 2(可选的后续问题)
嵌套 CV 提供了多个模型之间的差异评估。差异可以表示为外部 CV 获得的误差(例如 RMSE)。虽然该误差可能很小,但来自模型(由外部 CV 实例化)的单个 LASSO 系数(预测变量的重要性)可能会有很大差异。
- mlr3 是否提供描述预测变量定量重要性一致性的功能,即外部 CV 创建的模型中 LASSO 系数的 RMSE?还是应该创建一个自定义函数,使用
result$data$learner[[i]]$model$rp$model$glmnet.fit$beta
(由误用建议)检索 LASSO 系数,其中 i = 1、2、3、4、5 是外部 CV 的折叠,然后取匹配系数的 RMSE?
r - 如何根据 mlr3 中的指标列和批量训练预测对任务进行子集化?
背景
我正在使用 R 中的 mlr3 包进行建模和预测。我正在使用一个由测试集和训练集组成的大数据集。测试集和训练集由指示符列指示(在代码中:test_or_train)。
目标
- 使用数据集中 train_or_test 列指示的训练行批量训练所有学习者。
- 使用相应的训练有素的学习器批量预测 test_or_train 列中的“测试”指定的行。
代码
- 带有测试列指示符的占位符数据集。(在实际的数据训练测试拆分不是人为的)
- 两个任务(在实际代码中任务是不同的,还有更多。)
由reprex 包于 2020-06-22 创建(v0.3.0)
笔记
我尝试使用带有 row_ids 的 benchmark_grid 来只用训练行训练学习者,但这不起作用,而且使用列指示符也比使用行索引容易得多。使用列测试训练指示符,可以使用一个规则(用于拆分),而使用行索引仅适用于任务包含相同行的情况。
r - mlr3 的 task$feature_names 在 R 中重新排序变量?
所以我的问题是,当我有一个数据框,然后使用mlr3
'stask$feature_names
函数创建一个任务时,它会以字母顺序或(某种)不正确的数字顺序返回变量,而我想保持特征名称的顺序出现在数据框中。我在下面提供了两个例子来说明我的意思。第一个示例是(有点)数字示例,第二个示例是字母顺序。
示例 1(数字):
因此,在上面的示例中,我创建了一些数据(即 X1 到 X11),然后创建了一个mlr3
任务。但是,当我运行test_T$feature_names
它时,它会返回:
因此,由于 X10 中的前导 1,mlr3
认为 X10 应该出现在 X2 之前。
示例 2(按字母顺序):
所以这一次,我的数据框中的变量顺序用myData
(即a,b,ab,ba,c)来描述。但是,当我运行时t_T$feature_names
,它会返回:
它已将顺序更改为按字母顺序排列。我不确定这是故意还是疏忽mlr3
......但是无论如何从mlr3
创建的任务中提取特征名称,它不会重新排序变量名称?
我仍然停留在这个问题上,如果有人有任何建议吗?
编辑:我添加了一个(糟糕的)图形示例,只是为了说明问题。因此,从数值示例继续,如果我想创建一个热图样式图,但使用$feature_names
它来获取特征名称,我最终会得到这样的结果:
可以看出,它在 X1 和 X2 之间绘制 X10。理想情况下,我想保持特征出现在数据框中的顺序。我知道可能还有其他方法可以重新排序绘图,但是,我依赖于$feature_names
我创建的大型绘图功能。最初,我使用的是getTaskFeatureNames(task)
from mlr
,它将功能名称保持在原始顺序中......但我最近更新为mlr3
,这似乎改变了顺序。