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

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

前言


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

2~RCWSPKTXAEPVC@I]]]RWD.png




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


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


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

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

logRegWrapper <- makeImputeWrapper("classif.logreg",#指定learner
                                   cols = list(Age = imputeMean()))#使用wrapper封装


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

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(),它代表“系数” (或参数),返回模型参数。

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% 置信区间。

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.预测

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

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)
目录
相关文章
机器学习/深度学习 算法 自动驾驶
301 0
|
2月前
|
算法 API 数据安全/隐私保护
深度解析京东图片搜索API:从图像识别到商品匹配的算法实践
京东图片搜索API基于图像识别技术,支持通过上传图片或图片URL搜索相似商品,提供智能匹配、结果筛选、分页查询等功能。适用于比价、竞品分析、推荐系统等场景。支持Python等开发语言,提供详细请求示例与文档。
|
5月前
|
监控 算法 安全
公司电脑监控软件关键技术探析:C# 环形缓冲区算法的理论与实践
环形缓冲区(Ring Buffer)是企业信息安全管理中电脑监控系统设计的核心数据结构,适用于高并发、高速率与短时有效的多源异构数据处理场景。其通过固定大小的连续内存空间实现闭环存储,具备内存优化、操作高效、数据时效管理和并发支持等优势。文章以C#语言为例,展示了线程安全的环形缓冲区实现,并结合URL访问记录监控应用场景,分析了其在流量削峰、关键数据保护和高性能处理中的适配性。该结构在日志捕获和事件缓冲中表现出色,对提升监控系统效能具有重要价值。
124 1
|
6月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
169 17
|
6月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
162 8
|
6月前
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
137 5
|
11月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
1209 30
|
11月前
|
存储 算法
深入解析PID控制算法:从理论到实践的完整指南
前言 大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。 基本介绍 PID 深入理解 (1)闭环控制系统:讲解 PID 之前,我们先解释什么是闭环控制系统。简单说就是一个有输入有输出的系统,输入能影响输出。一般情况下,人们也称输出为反馈,因此也叫闭环反馈控制系统。比如恒温水池,输入就是加热功率,输出就是水温度;比如冷库,
1463 15
|
12月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
12月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!

热门文章

最新文章