【问题标题】:How to get the coefficient of the Logistic Regression in mlr3?如何获得mlr3中Logistic回归的系数?
【发布时间】:2021-03-14 20:25:39
【问题描述】:

刚开始使用mlr3,对语法还是很陌生,有两个问题:

  1. 如何从 mlr3 中经过训练的 Logistic 回归中访问系数?
  2. 我正在处理一个非常不平衡的数据集,98% vs 2%,并且这个数据集有超过 200 万行,我尝试使用 SMOTE 方法,但是速度很慢,因为它可以在 python 中很快完成,那么我的代码有什么错误吗? 这是我的代码:
task = TaskClassif$new("pcs",backend =pcs,target = "navigator",positive = "1" )
table(task$truth())

po_over = po("classbalancing",id="oversample",adjust="minor",reference="minor",shuffle=F,ratio=16)
table(po_over$train(list(task))$output$truth())

learner = mlr_learners$get("classif.rpart")
learner$predict_type = "prob"

learner = po_over %>>% learner

resampling = rsmp("holdout",ratio=0.8)

rr = resample(task,learner,resampling,store_models = T)

res <- rr$prediction()
auto1 <- autoplot(res)
auto2 <- autoplot(res,type='roc')

rr$score(msr("classif.acc"))$classif.acc %>% print()

对于 SMOTE:

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"))

【问题讨论】:

  • 我猜您没有提供minimal reproducible example,但由于您没有包含任何library 电话,我无法确定。你有没有想过我们可以运行这段代码?您是否搜索了“[r] 系数 mlr”的匹配项?如果您需要更理论或战略性的建议形式,那么也许可以去 SE::Data Science。在这里,我们都是关于编写困难示例的代码。
  • 我不是这方面的专家,但“classif.rpart”是 CART(单棵树的随机森林),而不是逻辑回归。如果要使用逻辑回归,请指定“classif.log_reg”。如果你想做逻辑回归,使用glm,它会给你一个带参数的模型。在这里,您可以在训练后通过 learner$model 查看模型。它将向您展示一系列决定。它是非参数的——没有公式/系数。
  • @IRTFM 感谢您的建议,我确实是这样搜索的,并找到了getLearnerModel(),但我不确定它是否可以在 MLR3 包中使用。抱歉,我没有提供一个最小的示例,因为 SMOTE 对于小型数据集(例如 10000*8)的运行速度足够快,但是对于具有 8 个特征的一百万行,它运行缓慢。我使用imblearn包在python中尝试了相同的数据集,大约需要3s。我只想知道是否存在一些设置来加速 r 中的 SMOTE 方法。
  • @Stacker,谢谢你的帮助,我在那个地方犯了一个错误,但是 learner$model 返回一个 null :(

标签: r mlr3


【解决方案1】:

这是我为您的问题 #1 收集的内容

  1. 创建一个包含大约 98% 的 1 和 2% 的 0 的数据集

  2. 制定训练和测试任务

  3. (1) 创建过度平衡的 po 东西

    (2) 以这种方式创建学习器,原始代码中的方式不适用于 po

  4. 在训练集上训练学习者

  5. 在测试集上测试

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

这是针对问题 #2 SMOTE

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

【讨论】:

  • 太棒了,感谢您的帮助 Stacker。但是我已经运行了 SMOTE 方法超过 30 分钟,它还没有完成,这在 Python 上应该非常快,你知道为什么会这样吗?我可以为 SMOTE 设置什么以使其更快吗?谢谢!
  • 我不知道,可能是因为您的数据集很大?您可以尝试对少数类进行欠采样,因为 200 万行中的 2% 仍然是 40,000 行。尝试 install.packages(“DMwR”); pcs = SMOTE(导航器 ~ ., 数据, perc.over = 10,perc.under=100);学习者 = mlr_learners$get("classif.rpart") 学习者$predict_type = "prob"; learner$train(task_train) 甚至 perc.over=1
  • 还是很慢,不过感谢您的帮助,不胜感激!
猜你喜欢
  • 2020-09-12
  • 2020-01-29
  • 2018-03-23
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2018-07-08
相关资源
最近更新 更多