如何获得mlr3中的逻辑回归系数?
我刚刚开始使用mlr3,对语法仍然非常不熟悉,我有两个问题:如何获得mlr3中的逻辑回归系数?,r,mlr3,R,Mlr3,我刚刚开始使用mlr3,对语法仍然非常不熟悉,我有两个问题: 如何从mlr3中经过训练的逻辑回归中获取系数 我正在处理一个非常不平衡的数据集,98%对2%,在这个数据集中有超过200万行,我尝试使用SMOTE方法,但它非常慢,因为它可以很快在python中完成,所以我的代码中有错误吗? 这是我的密码: 以下是我为你的问题收集的信息#1 创建一个大约有98%1和2%0的数据集 制定培训和测试任务 (1) 创造超平衡的采购订单 (2) 以这种方式创建学习者,原始代码中的方式将无法与po一起使用
以下是我为你的问题收集的信息#1
库(mlr3)
图书馆(dplyr)
库(MLR3管道)
种子(10)
pcs=数据帧(a=runif(1000),b=runif(1000))
pcs=pcs%>%
变异(c=2*a+3*b,d=ifelse(c>0.6,1,0),导航器=因子(d))%>%
选择(-c,-d)
task=TaskClassif$new(“pcs”,backend=pcs,target=“navigator”,positive=“1”)
序列集=样本(任务$nrow,0.8*任务$nrow)
测试集=设置差异(序列长度(任务$nrow),序列集)
任务列车%
po(“学习者”,lrn(“classif.rpart”),
预测(type=“prob”))
)
学员$train(任务训练)
pred=学习者$predict(任务测试)
输出:
learner$model
#' You can see the predicted probability by following the decision tree
#' e.g. say you have a data point a and b
#' first check that b>=.112 or b<.112 (nodes 2 and 3)
#' etc.
1) root 1085 304 1 (0.71981567 0.28018433)
2) b>=0.1122314 728 16 1 (0.97802198 0.02197802)
4) a>=0.007176245 709 0 1 (1.00000000 0.00000000) *
5) a< 0.007176245 19 3 0 (0.15789474 0.84210526) *
3) b< 0.1122314 357 69 0 (0.19327731 0.80672269)
6) a>=0.246552 65 0 1 (1.00000000 0.00000000) *
7) a< 0.246552 292 4 0 (0.01369863 0.98630137) *
#Test predictions
pred$confusion
truth
response 1 0
1 195 1
0 0 4
learner$model
#“你可以通过遵循决策树看到预测的概率
#例如,假设您有一个数据点a和b
#'首先检查b>=.112或bI我猜您没有提供a,但由于您没有包含任何库调用,我不能确定。你想象过我们能够运行这个代码吗?您是否搜索了与“[r]系数mlr”的匹配项?如果你有一个更具理论性或战略性的建议,那么也许可以选择SE::Data Science。这里我们都是关于编写硬示例的,我不是这方面的专家,但是“classif.rpart”是CART(带有一棵树的随机林),而不是logistic回归。如果要使用逻辑回归,请指定“classif.log_reg”。如果要进行逻辑回归,请使用glm
,它将为您提供一个带有参数的模型。在这里,您可以在培训后通过执行learner$model
查看模型。它将向您展示一系列决策。它是非参数的,没有公式/系数。@IRTFM感谢您的建议,我确实用这种方法搜索过,找到了getLearnerModel()
,但我不确定它是否可以在MLR3包中使用。很抱歉,我没有提供一个最简单的例子,因为SMOTE对于小数据集(例如10000*8)来说运行速度足够快,但是对于具有8个特性的一百万行来说,它运行得很慢。我使用imblearn
包在python中尝试了相同的数据集,大约需要3秒钟。我只是想知道在r@Stacker中是否存在一些加速SMOTE方法的设置。谢谢您的帮助,我在那个地方犯了一个错误,但是学习者$model返回空值:(太棒了,谢谢你的帮助Stacker。但是我运行SMOTE方法已经超过30分钟了,它还没有完成,在Python上应该是非常快的,你知道为什么会发生这种情况吗?我可以为SMOTE设置什么使它更快吗?谢谢!我不知道,可能是因为你的数据集太大了吧?你可以尝试对你进行欠采样r少数类,因为200万中的2%仍然是40000行。请尝试安装包(“DMwR”);PC=SMOTE(navigator~,data,perc.over=10,perc.under=100);learner=mlr\u learner$get(“classif.rpart”)learner$predict\u type=“prob”;learner$train(task\u train)甚至perc.over=1仍然非常慢,但感谢您的帮助,谢谢!
gr_smote =
po("colapply", id = "int_to_num",
applicator = as.numeric, affect_columns = selector_type("integer")) %>>%
po("smote", dup_size = 15) %>>%
po("colapply", id = "num_to_int",
applicator = function(x) as.integer(round(x, 0L)), affect_columns = selector_type("numeric"))
library(mlr3)
library(dplyr)
library(mlr3pipelines)
set.seed(10)
pcs=data.frame(a=runif(1000), b=runif(1000))
pcs = pcs %>%
mutate(c=2*a+3*b, d=ifelse(c>.6, 1, 0), navigator=factor(d)) %>%
select(-c, -d)
task = TaskClassif$new("pcs",backend =pcs,target = "navigator",positive = "1" )
train_set = sample(task$nrow, 0.8 * task$nrow)
test_set = setdiff(seq_len(task$nrow), train_set)
task_train <- task$clone()$filter(train_set)
task_test <- task$clone()$filter(test_set)
po_over1= po("classbalancing")
po_over1$param_set$values=list(ratio=16, reference="minor", adjust="minor", shuffle=FALSE)
learner=GraphLearner$new(
po_over1 %>>%
po("learner", lrn("classif.rpart",
predict_type="prob"))
)
learner$train(task_train)
pred=learner$predict(task_test)
learner$model
#' You can see the predicted probability by following the decision tree
#' e.g. say you have a data point a and b
#' first check that b>=.112 or b<.112 (nodes 2 and 3)
#' etc.
1) root 1085 304 1 (0.71981567 0.28018433)
2) b>=0.1122314 728 16 1 (0.97802198 0.02197802)
4) a>=0.007176245 709 0 1 (1.00000000 0.00000000) *
5) a< 0.007176245 19 3 0 (0.15789474 0.84210526) *
3) b< 0.1122314 357 69 0 (0.19327731 0.80672269)
6) a>=0.246552 65 0 1 (1.00000000 0.00000000) *
7) a< 0.246552 292 4 0 (0.01369863 0.98630137) *
#Test predictions
pred$confusion
truth
response 1 0
1 195 1
0 0 4
gr_smote =
po("colapply", id = "int_to_num",
applicator = as.numeric, affect_columns = selector_type("integer")) %>>%
po("smote", dup_size = 15) %>>%
po("colapply", id = "num_to_int",
applicator = function(x) as.integer(round(x, 0L)), affect_columns = selector_type("numeric"))
learner=GraphLearner$new(
gr_smote %>>% po("learner", lrn("classif.rpart", predict_type="prob"))
)
learner$train(task_train)
learner$model
1) root 1085 304 1 (0.7198157 0.2801843)
2) b>=0.5 391 0 1 (1.0000000 0.0000000) *
3) b< 0.5 694 304 1 (0.5619597 0.4380403)
6) a>=0.5 203 0 1 (1.0000000 0.0000000) *
7) a< 0.5 491 187 0 (0.3808554 0.6191446) *
pred=learner$predict(task_test)
pred$confusion
truth
response 1 0
1 159 0
0 36 5