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

简介: 本期介绍的是 《Machine Learning with R, tidyverse, and mlr》 一书的第四章——逻辑回归(logistic regression)。逻辑回归是基于概率分类的有监督学习算法,它依赖于直线方程,产生的模型非常容易解释和交流。在其最简单的形式中,逻辑回归被用来预测二分类问题,但算法的变体也可以处理多个类。

2. 建立逻辑回归模型

在此,我们建立一个二项逻辑回归模型来预测一名乘客是否能在泰坦尼克号灾难中幸存下来。加载包:

library(mlr)
library(tidyverse)

R 中警告信息:自 2019 年 7 月以来,mlr 处于“仅维护”模式。未来的开发将只在 mlr3 中进行(https://mlr3.mlr-org.com)。由于对 mlr3 的关注,在 mlr 中可能会有未捕获的 bug,请考虑切换。


2.1 加载泰坦尼克号数据集

该数据集在 titanic 包中,有 891 个实例和 12 个变量。

install.packages("titanic")#安装包
data(titanic_train, package = "titanic")#加载数据
titanicTib <- as_tibble(titanic_train)#转换为 tibble 格式
titanicTib #查看数据
# A tibble: 891 x 12
#   PassengerId Survived Pclass Name         Sex     Age SibSp Parch Ticket   Fare Cabin
#         <int>    <int>  <int> <chr>        <chr> <dbl> <int> <int> <chr>   <dbl> <chr>
# 1           1        0      3 Braund, Mr.~ male     22     1     0 A/5 21~  7.25 ""   
# 2           2        1      1 Cumings, Mr~ fema~    38     1     0 PC 175~ 71.3  "C85"
# 3           3        1      3 Heikkinen, ~ fema~    26     0     0 STON/O~  7.92 ""   
# 4           4        1      1 Futrelle, M~ fema~    35     1     0 113803  53.1  "C12~
# 5           5        0      3 Allen, Mr. ~ male     35     0     0 373450   8.05 ""   
# 6           6        0      3 Moran, Mr. ~ male     NA     0     0 330877   8.46 ""   
# 7           7        0      1 McCarthy, M~ male     54     0     0 17463   51.9  "E46"
# 8           8        0      3 Palsson, Ma~ male      2     3     1 349909  21.1  ""   
# 9           9        1      3 Johnson, Mr~ fema~    27     0     2 347742  11.1  ""   
#10          10        1      2 Nasser, Mrs~ fema~    14     1     0 237736  30.1  ""   
# ... with 881 more rows, and 1 more variable: Embarked <chr>

tibble 包含以下变量:

  • PassengerId: 每个乘客都有一个独特的任意数字。
  • Survived: 表示是否存活的整数(1=存活,0=死亡)。
  • Pclass: 乘客是住在一等舱,二等舱还是三等舱。
  • Name: 乘客姓名的字符向量。
  • Sex: 包含“男性”和“女性”的字符向量。
  • Age: 乘客的年龄。
  • SibSp: 乘客船上兄弟姐妹和配偶的总数。
  • Parch: 乘客船上父母和孩子的总数。
  • Ticket: 乘客票号的字符向量。
  • Fare: 乘客买票的金额。
  • Cabin: 乘客座舱号的字符向量。
  • Embarked: 乘客出发港口的字符向量。


2.2 充分利用数据:特征工程和特征选择

通常我们不会使用整个数据集来进行建模。在正式建模之前,首先要对数据进行清理,包括将数据转换为正确类型、纠正错误和删除不相关数据等步骤。对于泰坦尼克号数据集,主要有以下三个处理步骤:

  1. Survived, Sex, Pclass 三个变量转换为因子(factor)。(converting to factors)
  2. 添加新的变量 FamSizeSibSpParch 两个变量之和。(feature engineering)
  3. 选择认为对模型有预测价值的变量。(feature selection)


2.2.1 转换为因子 (converting to factors)

每个变量都应该被视为一个因子,因为它们代表了在整个数据集中重复出现的不同情况之间的离散差异。


2.2.2 特征工程(feature engineering)

这是一项极其重要的机器学习任务,它是对数据集中的变量进行修改,以提高它们的预测值。特征工程有两种方式:

  • Feature extraction.
  • Feature creation.

Feature extraction 是将预测信息保存在变量中,但以一种无用的格式保存。例如,假设有一个变量,它包含事件发生的年、月、日和时间。一天中的时间有重要的预测价值,而年、月、日则没有。为了让这个变量在模型中有用,只需要提取一天中的时间信息作为一个新变量。

Feature creation 是将现有的变量组合起来创建新变量。例如,添加新的变量 FamSizeSibSpParch 两个变量之和。


2.2.3 特征选择(feature selection)

这是另一个非常重要的机器学习任务:保留增加预测价值的变量,删除没有增加预测价值的变量。

泰坦尼克号数据清理代码如下:

fctrs <- c("Survived", "Sex", "Pclass")#定义将要转换为因子的变量的向量
titanicClean <- titanicTib %>%
  mutate_at(.vars = fctrs, .funs = factor) %>% #将变量转换为因子
  mutate(FamSize = SibSp + Parch) %>% #定义新的变量
  select(Survived, Pclass, Sex, Age, Fare, FamSize)#选择可以增加预测价值的变量
titanicClean#查看处理后的数据集
# A tibble: 891 x 6
#   Survived Pclass Sex      Age  Fare FamSize
#   <fct>    <fct>  <fct>  <dbl> <dbl>   <int>
# 1 0        3      male      22  7.25       1
# 2 1        1      female    38 71.3        1
# 3 1        3      female    26  7.92       0
# 4 1        1      female    35 53.1        1
# 5 0        3      male      35  8.05       0
# 6 0        3      male      NA  8.46       0
# 7 0        1      male      54 51.9        0
# 8 0        3      male       2 21.1        4
# 9 1        3      female    27 11.1        2
#10 1        2      female    14 30.1        1
# ... with 881 more rows


2.3 绘制数据

首先,使用 gather() 函数将数据转化为 untidy 形式:每个预测变量名保存在一列中,它们的值保存在另一列中。这样就可以使用 ggplot2 作分面图把不同的变量画在一起。

titanicUntidy <- gather(titanicClean, key = "Variable", value = "Value",
                        -Survived)
titanicUntidy
# A tibble: 4,455 x 3
#   Survived Variable Value
#   <fct>    <chr>    <chr>
# 1 0        Pclass   3    
# 2 1        Pclass   1    
# 3 1        Pclass   3    
# 4 1        Pclass   1    
# 5 0        Pclass   3    
# 6 0        Pclass   3    
# 7 0        Pclass   1    
# 8 0        Pclass   3    
# 9 1        Pclass   3    
#10 1        Pclass   2    
# ... with 4,445 more rows
titanicUntidy %>%
  filter(Variable != "Pclass" & Variable != "Sex") %>% #过滤掉Pclass和Sex两个变量
  ggplot(aes(Survived, as.numeric(Value))) +
  facet_wrap(~ Variable, scales = "free_y") + #绘制不同变量分面图
  geom_violin(draw_quantiles = c(0.25, 0.5, 0.75)) + #小提琴形状并画出分位数线
  theme_bw()

D5ME6]B8WVFKLQY%KKD[FKA.png


Fig 9. 三个变量分面图

小提琴图显示沿 y 轴的数据密度。每把小提琴上的线代表第 1 个四分位数、中位数和第 3 个四分位数(从最低到最高)。


接下来绘制关于 PclassSex 两个变量的图,分别查看不同舱位和性别所占幸存人数的比例。

DO{6XV)]0ED[VM1A%K4{$3M.png


Fig 10. 两个变量比例图


2.4 训练模型

现在我们已经清理了数据,接下来用 mlr 包创建任务、learner 和模型(使用 "classif.logreg" 来作为逻辑回归的 learner)。

titanicTask <- makeClassifTask(data = titanicClean, target = "Survived")#创建任务
logReg <- makeLearner("classif.logreg")#指定learner
logRegModel <- train(logReg, titanicTask)#训练模型
#Error in checkLearnerBeforeTrain(task, learner, weights) : 
#  Task 'titanicClean' has missing values in 'Age', but learner 'classif.logreg' does not support that!

此时报错,查看年龄数据可知存在缺失值,而逻辑回归无法处理这样的数据。


2.5 处理缺失值

处理缺失数据有两种方法:

  • 简单地从分析中排除缺少数据的情况。
  • 应用一种机制来填补空白。

当缺失值的情况与完整情况的比例非常小时,第一种选择可能是有效的。在这种情况下,省略带有缺失值的实例不太可能对模型的性能产生很大的影响。

第二种选择是使用一些算法来估计那些缺失值,用这些估计值替换 NA,并使用这个新数据集来训练模型。估计缺失值的方法有很多种,例如均值插补,也就是取缺失数据变量的均值,用它来替换缺失值。

在本例中,由于年龄缺失值较多,故使用第二种处理缺失值的方法。

imp <- impute(titanicClean, cols = list(Age = imputeMean()))#均值插补
sum(is.na(titanicClean$Age))#原数据集年龄变量缺失值个数
#[1] 177
sum(is.na(imp$data$Age))#新数据集年龄变量缺失值个数
#[1] 0


2.6 重新训练模型

titanicTask <- makeClassifTask(data = imp$data, target = "Survived")#定义任务
logRegModel <- train(logReg, titanicTask)#训练模型

使用经过处理缺失值的新数据来训练模型。

目录
相关文章
机器学习/深度学习 算法 自动驾驶
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、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!

热门文章

最新文章