首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于 mlr 包的逻辑回归算法介绍与实践(下)

基于 mlr 包的逻辑回归算法介绍与实践(下)

作者头像
庄闪闪
发布2022-04-08 14:42:35
发布2022-04-08 14:42:35
9770
举报

前言

上期 基于 mlr 包的逻辑回归算法介绍与实践(上)关于逻辑回归的介绍内容中主要包括了特征工程、特征选择和缺失值的处理等问题,都是小编之前没有系统学过的机器学习任务。本期逻辑回归内容基于上期进行了扩展,主要包括逻辑回归中的交叉验证、odds ratio 和预测等。

1. 交叉验证逻辑回归模型

交叉验证时,应该交叉验证整个模型的构建过程,包括任何依赖于数据的预处理步骤,例如缺失值填充等。在之前介绍 KNN 算法的推文中,我们使用了一个 wrapper 函数,将 learner 和超参数调优过程封装在一起。本期,我们将为 learner 和缺失值填充创建一个 wrapper

1.1 包括缺失值填充的交叉验证过程

函数 makeImputeWrapper()learner 和缺失值填充方法封装在一起:

代码语言:javascript
复制
logRegWrapper <- makeImputeWrapper("classif.logreg",#指定learner
                                   cols = list(Age = imputeMean()))#使用wrapper封装

接下来,对 logRegWrapper 应用 10 次交叉验证,重复 50 次,过程和 KNN 算法的嵌套交叉验证类似。对于交叉验证的每一个 fold,训练集中 Age 变量的均值将被用来输入到任何的缺失值。

代码语言:javascript
复制
kFold <- makeResampleDesc(method = "RepCV", folds = 10, reps = 50,
                          stratify = TRUE) #设置 K-fold 交叉验证
logRegwithImpute <- resample(logRegWrapper, titanicTask,
                             resampling = kFold,
                             measures = list(acc, fpr, fnr))
logRegwithImpute

#Resample Result
#Task: imp$data
#Learner: classif.logreg.imputed
#Aggr perf: acc.test.mean=0.7966432,fpr.test.mean=0.2988353,fnr.test.mean=0.1439165
#Runtime: 6.67456

由于这是一个二分类问题,我们可以访问一些额外的性能指标,例如 false positive rate (fpr)false negative rate (fnr)。平均而言,模型将 79.7% 的乘客正确分类,但将 29.9%的死亡乘客错误地分类为幸存乘客(fpr),将 14.4% 的幸存乘客错误地分类为死亡乘客(fnr)。

1.2 性能指标

这里小编举一个简单的例子来帮助读者们更好地理解 fprfnr

假设你在一家银行的欺诈检测部门工作,是一名数据科学家。你的工作是建立一个模型,预测信用卡交易是合法的还是欺诈的。假设在 10 万次信用卡交易中,只有 1 次是欺诈。因为欺诈相对罕见,所以你决定建立一个模型,将所有交易简单地归类为合法交易。

模型精度为 99.999%,但该模型无法识别任何欺诈交易,并且有 100% 的 fnr

由此可知,我们应该在特定的问题中选择合适的评估模型性能的指标。

性能指标网站[1]中可以查看 mlr 包当前包含的所有性能指标以及其适用的情况。

2. 解释模型:odds ratio

在上期推文中曾经提到由于模型参数的可解释性,逻辑回归非常受欢迎。

为了提取模型参数,我们需要使用 getLearnerModel() 函数将 mlr 模型对象 logRegModel 转化为 R 模型对象。接下来,再将这个 R 模型对象作为参数传递给函数 coef(),它代表“系数” (或参数),返回模型参数。

代码语言:javascript
复制
logRegModelData <- getLearnerModel(logRegModel)#转换模型对象
coef(logRegModelData)#提取模型参数
#(Intercept)      Pclass2      Pclass3      Sexmale          Age 
# 3.809661697 -1.000344806 -2.132428850 -2.775928255 -0.038822458 
#        Fare      FamSize 
# 0.003218432 -0.243029114 

当所有连续变量都为零且各因素处于参考水平时,截距代表的是泰坦尼克号灾难幸存几率(odd)的对数。实际上我们对斜率比对截距更感兴趣,但这些值是用对数几率单位(log odds unit)表示的,将很难解释。因此,人们通常把它们转换成 odds ratio

例如,如果你是女性,在泰坦尼克号上幸存的几率(odd)是 0.7,如果你是男性,幸存的几率(odd)是 0.2,那么如果女性幸存的 odds ratio 就是 3.5。换句话说,如果你是女性,你的幸存可能会是男性的 3.5 倍。

odds ratio 是解释预测因子对结果影响的一种非常流行的方式。

2.1 将模型参数转换成 odds ratio

要将 log odds 转换为 odds ratios,取指数即可,还可以使用 confint() 函数计算 95% 置信区间。

代码语言:javascript
复制
exp(cbind(Odds_Ratio = coef(logRegModelData), confint(logRegModelData)))
#Waiting for profiling to be done...
#             Odds_Ratio       2.5 %       97.5 %
#(Intercept) 45.13516691 19.14718874 109.72483921
#Pclass2      0.36775262  0.20650392   0.65220841
#Pclass3      0.11854901  0.06700311   0.20885220
#Sexmale      0.06229163  0.04182164   0.09116657
#Age          0.96192148  0.94700049   0.97652950
#Fare         1.00322362  0.99872001   1.00863263
#FamSize      0.78424868  0.68315465   0.89110044

大多数的 odds ratio 都小于 1,意味着事件不太可能发生。如果用 1 除以它们,就更容易理解了。例如,如果你是男性,幸存的 odds ratio 是 0.06,1 除以 0.06 = 16.7。这意味着,在所有其他变量不变的情况下,男性的幸存率是女性的 16.7 倍。

对于连续变量,我们将 odds ratio 解释为:变量每增加一个单位,乘客幸存的可能性就增加多少。例如,每增加一名家庭成员,一名乘客幸存的可能性就会降低 1 / 0.78 = 1.28 倍。

对于因子,我们将 odds ratio 解释为与该变量的参考水平相比乘客幸存的可能性有多大。例如,我们有 Pclass2 和 Pclass3 的 odds ratio,分别是 2 级和 3 级乘客与 1 级乘客相比存活的倍数。

95% 置信区间表示每个变量具有预测价值的强度。odds ratio 为 1 意味着几率相等,并且变量对预测没有影响。因此,如果 95% 置信区间包含值 1,例如 Fare 变量的置信区间,则这可能表明此变量对预测没有影响。

2.2 增加一个单位是没有意义的

一个单位的增加通常是不容易解释的。 假设你得到一个odds ratio,即在蚁丘中每增加一只蚂蚁,这个蚁丘在白蚁攻击中存活的可能性就增加 1.000005 倍。如何解释这么小的 odds ratio 呢?

当一个单位的增加没有意义时,一种流行的技术是在训练模型之前对连续变量进行对数转换。这不会影响模型的预测,但可以将 odds ratio 解释为:每次蚂蚁的数量增加一倍,蚁丘存活的可能性就增加 x 倍。这将提供更大、更可解释的 odds ratio

3.预测

我们已经构建、交叉验证和解释了我们的模型,现在可以很好地使用该模型对新数据进行预测。这个模型的场景有点不同寻常,因为我们是根据一个历史事件建立了一个模型,所以不会用它来预测另一场泰坦尼克号灾难的幸存者。故要说明如何使用逻辑回归模型进行预测,可载入一些未标记的乘客数据并清理后进行预测。

代码语言:javascript
复制
data(titanic_test, package = "titanic")#加载数据测试集
titanicNew <- as_tibble(titanic_test)
titanicNewClean <- titanicNew %>%
  mutate_at(.vars = c("Sex", "Pclass"), .funs = factor) %>%
  mutate(FamSize = SibSp + Parch) %>%
  select(Pclass, Sex, Age, Fare, FamSize)#清理数据
predict(logRegModel, newdata = titanicNewClean)#预测

#Prediction: 418 observations
#predict.type: response
#threshold: 
#time: 0.01
#  response
#1        0
#2        0
#3        0
#4        0
#5        1
#6        0
#... (#rows: 418, #cols: 1)

小编有话说

至此,《Machine Learning with R, tidyverse, and mlr》 一书中关于逻辑回归的内容已介绍完毕,书中该章节的最后还总结了逻辑回归的优缺点,感兴趣的读者可以自行查看。下期小编将学习介绍该书的第 5 章——判别分析 (Discriminant Analysis)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 庄闪闪的R语言手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1. 交叉验证逻辑回归模型
    • 1.1 包括缺失值填充的交叉验证过程
    • 1.2 性能指标
  • 2. 解释模型:odds ratio
    • 2.1 将模型参数转换成 odds ratio
    • 2.2 增加一个单位是没有意义的
  • 3.预测
  • 小编有话说
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档