实用指南:逻辑回归实战:泰坦尼克号生存预测

news/2025/11/14 15:33:36/文章来源:https://www.cnblogs.com/tlnshuju/p/19222286

实用指南:逻辑回归实战:泰坦尼克号生存预测

2025-11-14 15:31  tlnshuju  阅读(0)  评论(0)    收藏  举报

一、逻辑回归的基本概念

逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计学习方法,尽管名称中包含 "回归",但它实际上是一种分类算法。逻辑回归主要用于解决二分类问题(是 / 否、正 / 负、0/1),通过计算事件发生的概率来进行分类判断。

与线性回归不同,逻辑回归的输出值被限制在 0 到 1 之间,这使得它非常适合处理分类任务。其核心思想是将线性回归的输出通过一个激活函数(通常是 Sigmoid 函数)映射到 [0,1] 区间,从而得到事件发生的概率。

二、逻辑回归的数学原理

1. Sigmoid 函数

Sigmoid 函数是逻辑回归的核心,其数学表达式为:

\sigma \left ( z \right )= \frac{1}{1+e^{-z}}

其中z是线性回归的输出,即z=w_{0}+w_{1}x_{1}+w_{2}x_{2}+...+w_{n}x_{n}w为模型参数,x为输入特征。

Sigmoid 函数具有以下特点:

  • 输出值范围在 (0,1) 之间
  • 当z=0时,输出值为 0.5
  • 当z→+∞时,输出值趋近于 1
  • 当z→−∞时,输出值趋近于 0

2. 决策边界

通过 Sigmoid 函数得到概率值后,我们需要设定一个阈值(通常为 0.5)来进行分类:

  • 当σ(z)≥0.5时,预测为正类(1)
  • 当σ(z)<0.5时,预测为负类(0)

这相当于当z≥0时预测为正类,z<0时预测为负类,z=0即为决策边界。

3. 损失函数

逻辑回归使用交叉熵损失函数(Cross-Entropy Loss)来衡量预测值与真实值之间的差异:

对于二分类问题,损失函数为:L\left ( y,\hat{y} \right )=-y\log \left ( \hat{y} \right )-\left ( 1-y \right )\log \left ( 1-\hat{y} \right )

其中y是真实标签(0 或 1),\hat{y}是预测的概率值。

模型训练的目标是通过优化算法(如梯度下降)找到使损失函数最小化的参数w。

三、Python 实现逻辑回归的步骤

使用 Python 实现逻辑回归通常包括以下步骤:

  1. 数据准备与探索
  2. 数据预处理(缺失值处理、特征编码等)
  3. 划分训练集和测试集
  4. 模型训练
  5. 模型评估
  6. 结果分析与可视化

四、完整案例:泰坦尼克号生存预测

下面我们将通过泰坦尼克号数据集来演示逻辑回归的具体应用,预测乘客是否能够幸存。

1. 数据准备

首先导入必要的库并加载数据:

# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, roc_curve, auc
from sklearn.impute import SimpleImputer
# 从本地文件加载数据(无需网络)
# 请确保titanic.csv文件与该脚本在同一目录下
try:titanic = pd.read_csv('titanic.csv')print("数据加载成功!")
except FileNotFoundError:print("错误:未找到titanic.csv文件,请确保该文件与脚本在同一目录下")print("请从以下地址下载文件:https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv")exit()
# 查看数据基本信息
print("数据集形状:", titanic.shape)
print("\n前5行数据:")
print(titanic.head())
# 查看数据缺失情况
print("\n数据缺失情况:")
print(titanic.isnull().sum())
# 数据探索:查看生存情况分布
print("\n生存情况分布:")
print(titanic['survived'].value_counts(normalize=True))
# 可视化生存情况与其他特征的关系
plt.figure(figsize=(15, 10))
# 性别与生存关系
plt.subplot(2, 2, 1)
sns.countplot(x='sex', hue='survived', data=titanic)
plt.title('Survival by Sex')
# 船舱等级与生存关系
plt.subplot(2, 2, 2)
sns.countplot(x='pclass', hue='survived', data=titanic)
plt.title('Survival by Pclass')
# 年龄与生存关系
plt.subplot(2, 2, 3)
sns.histplot(data=titanic, x='age', hue='survived', multiple='stack', bins=20)
plt.title('Survival by Age')
# 登船港口与生存关系
plt.subplot(2, 2, 4)
sns.countplot(x='embarked', hue='survived', data=titanic)
plt.title('Survival by Embarked')
plt.tight_layout()
plt.show()
# 选择特征和目标变量
features = ['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked']
X = titanic[features]
y = titanic['survived']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义特征预处理管道
# 数值型特征
numeric_features = ['age', 'sibsp', 'parch', 'fare']
numeric_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='median')),  # 用中位数填充缺失值('scaler', StandardScaler())  # 标准化
])
# 分类型特征
categorical_features = ['pclass', 'sex', 'embarked']
categorical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),  # 用最频繁值填充缺失值('onehot', OneHotEncoder(handle_unknown='ignore'))  # 独热编码
])
# 组合所有预处理步骤
preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, numeric_features),('cat', categorical_transformer, categorical_features)])
# 创建并训练逻辑回归模型管道
model = Pipeline(steps=[('preprocessor', preprocessor),('classifier', LogisticRegression(random_state=42, max_iter=1000))
])
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]  # 正类的预测概率
# 模型评估
print("\n模型评估结果:")
print(f"准确率 (Accuracy): {accuracy_score(y_test, y_pred):.4f}")
print("\n混淆矩阵:")
cm = confusion_matrix(y_test, y_pred)
print(cm)
# 可视化混淆矩阵
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()
print("\n分类报告:")
print(classification_report(y_test, y_pred))
# ROC曲线和AUC
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
# 提取并可视化特征重要性
# 获取特征名称
categorical_encoder = model.named_steps['preprocessor'].named_transformers_['cat'].named_steps['onehot']
cat_feature_names = list(categorical_encoder.get_feature_names_out(categorical_features))
feature_names = numeric_features + cat_feature_names
# 获取特征系数
coefficients = model.named_steps['classifier'].coef_[0]
# 创建特征重要性DataFrame
feature_importance = pd.DataFrame({'Feature': feature_names,'Importance': coefficients
})
# 按重要性排序
feature_importance = feature_importance.sort_values('Importance', ascending=False)
# 可视化特征重要性
plt.figure(figsize=(12, 8))
sns.barplot(x='Importance', y='Feature', data=feature_importance)
plt.title('Feature Importance in Logistic Regression')
plt.show()
# 分析特征重要性
print("\n最重要的5个正相关特征:")
print(feature_importance.head(5))
print("\n最重要的5个负相关特征:")
print(feature_importance.tail(5))

泰坦尼克号生存预测逻辑回归实现

数据加载成功!
数据集形状: (891, 15)
前5行数据:survived  pclass     sex   age  ...  deck  embark_town  alive  alone
0         0       3    male  22.0  ...   NaN  Southampton     no  False
1         1       1  female  38.0  ...     C    Cherbourg    yes  False
2         1       3  female  26.0  ...   NaN  Southampton    yes   True
3         1       1  female  35.0  ...     C  Southampton    yes  False
4         0       3    male  35.0  ...   NaN  Southampton     no   True
[5 rows x 15 columns]
数据缺失情况:
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64
生存情况分布:
survived
0    0.616162
1    0.383838
Name: proportion, dtype: float64
模型评估结果:
准确率 (Accuracy): 0.7989
混淆矩阵:
[[90 15][21 53]]

2. 代码解析

上述代码实现了一个完整的逻辑回归分类流程,主要包括以下几个部分:

(1)数据探索

首先加载泰坦尼克号数据集并进行初步探索,了解数据的基本情况,包括数据形状、缺失值分布以及生存情况的基本统计。通过可视化分析,我们可以发现一些直观的模式,例如女性生存率高于男性,头等舱乘客生存率高于其他舱位等。

(2)数据预处理

针对不同类型的特征(数值型和分类型),我们设计了不同的预处理管道:

  • 数值型特征:使用中位数填充缺失值,并进行标准化处理
  • 分类型特征:使用最频繁值填充缺失值,并进行独热编码处理

这种预处理方式可以有效处理数据中的缺失值,并将原始数据转换为适合逻辑回归模型输入的格式。

(3)模型训练与评估

我们使用sklearn库中的LogisticRegression类构建模型,并通过管道(Pipeline)将数据预处理和模型训练整合在一起,提高了代码的简洁性和可维护性。

模型评估采用了多种指标:

  • 准确率(Accuracy):整体预测正确的比例
  • 混淆矩阵:展示真正例(TP)、假正例(FP)、真负例(TN)、假负例(FN)的分布
  • 分类报告:包含精确率(Precision)、召回率(Recall)、F1 分数等详细指标
  • ROC 曲线和 AUC 值:评估模型的区分能力
(4)特征重要性分析

逻辑回归的一个重要优势是可以解释特征的重要性。通过分析模型的系数,我们可以了解各个特征对预测结果的影响程度和方向(正相关或负相关)。

3. 结果分析

从上述案例的运行结果中,我们可以得出以下结论:

  1. 模型性能:通常该模型在泰坦尼克号数据集上可以达到约 80% 左右的准确率,AUC 值在 0.85 左右,说明模型具有较好的分类能力。

  2. 特征重要性:

    • 性别是最重要的预测因素之一,女性(sex_female)的系数为正,表明女性更有可能幸存
    • 船舱等级(pclass)也很重要,头等舱乘客比其他舱位的乘客更有可能幸存
    • 年龄也是一个重要因素,年轻乘客的生存率相对较高
  3. 模型局限性:虽然逻辑回归在这个数据集上表现不错,但它假设特征与目标变量之间存在线性关系,可能无法捕捉更复杂的非线性模式。

五、逻辑回归的优缺点

优点

  1. 解释性强:模型输出的系数可以直接解释为特征对结果的影响程度和方向。
  2. 计算效率高:训练速度快,适合处理大规模数据集。
  3. 输出概率值:不仅能给出分类结果,还能提供事件发生的概率。
  4. 较少的过拟合风险:在适当正则化的情况下,逻辑回归通常具有较好的泛化能力。

缺点

  1. 只能处理线性关系:逻辑回归无法捕捉特征与目标变量之间的非线性关系。
  2. 对异常值敏感:异常值可能会显著影响模型参数。
  3. 特征工程依赖度高:需要手动设计和选择特征,以获得良好的性能。
  4. 难以处理高维稀疏数据:在特征维度极高的情况下,性能可能不如其他算法。

六、逻辑回归的应用场景

逻辑回归因其简单、高效和可解释性强的特点,被广泛应用于各个领域:

  1. 金融领域:信用评分、欺诈检测、贷款违约预测等
  2. 医疗领域:疾病风险预测、患者预后分析等
  3. 营销领域:客户流失预测、营销响应率预测等
  4. 社交媒体:垃圾邮件识别、用户行为预测等
  5. 工业领域:设备故障预测、质量控制等

七、总结

逻辑回归是一种简单但强大的分类算法,特别适用于二分类问题。它通过 Sigmoid 函数将线性回归的输出映射到 [0,1] 区间,从而实现对事件发生概率的预测。

在实际应用中,逻辑回归具有计算高效、解释性强等优点,是许多分类问题的首选算法之一。然而,它也有一定的局限性,特别是在处理非线性关系时表现不佳。

通过本文的案例,我们展示了如何使用 Python 和 scikit-learn 库实现逻辑回归,并对模型结果进行评估和分析。希望这个案例能帮助读者更好地理解和应用逻辑回归算法。

在实际项目中,我们通常会尝试多种算法并进行比较,选择最适合特定问题的模型。逻辑回归往往是一个很好的起点,既可以作为基准模型,也可能在许多情况下提供足够好的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nessus 10.8.5 在 Ubuntu 22.04 下的完整配置指南(含激活与突破 16IP 扫描限制)

Nessus 10.8.5 在 Ubuntu 22.04 下的完整配置指南(含激活与突破 16IP 扫描限制)本文详细介绍了 Nessus 10.8.5 在 Ubuntu 22.04 系统下的完整配置流程,涵盖从安装到突破限制的全步骤。首先需上传安装包并通过dpkg命…

谷歌Nano Banana 2带着脑子来了!彻底颠覆AI生图,4K画质秒解高数题(附API接入教程)

Nano Banana 2(GemPix 2)要发布了?Nano Banana(Gemini2.5Flash Image)是谷歌DeepMind团队的核心产品在8月26日发布,这才两个多月又要更新了!Nano Banana(Gemini2.5Flash Image)刚发布两个多月又要更新新版本?…

Cookie与Session的作用

Cookie与Session的作用 一、为什么需要会话管理? HTTP协议是无状态的(Stateless),即每次请求都是独立的,服务器无法区分不同用户或请求的连续性。例如:用户登录后,访问其他页面时服务器如何知道其已登录? 用户…

2025年木纹转印加工服务优质厂家推荐榜单TOP10

摘要 木纹转印技术作为表面处理行业的重要分支,在2025年迎来了新一轮发展高峰。随着环保要求的提高和消费升级,市场对木纹转印加工服务的品质、效率和个性化需求持续增长。本文基于行业调研数据和用户反馈,整理出当…

2025年喷漆加工服务排名指南:专业评测与选择建议

摘要 2025年喷漆加工行业持续快速发展,随着制造业升级和环保要求提升,高质量喷漆服务需求激增。本文基于市场调研和行业数据,为您呈现2025年喷漆加工服务Top5排名榜单,帮助您快速找到可靠供应商。榜单结合企业实力…

2025年木纹转印加工服务全方位解析与优质厂家推荐榜单

摘要 随着建筑装饰和家具制造行业的快速发展,木纹转印技术作为表面处理的重要工艺,在2025年迎来了新一轮的技术革新和市场扩张。本文基于行业数据分析和市场调研,为您深度解析木纹转印加工行业现状,并提供权威的厂…

Python操作多波段图像改变数据结构

Python操作多波段图像改变数据结构import rasterio import matplotlib.pyplot as plt import numpy as np def imageshow(image, title): plt.figure(figsize=(15, 8)) plt.imshow(image, cmap=viridis) plt.colorbar(…

山西忻州一对一辅导市场报告:原平、定襄等区县2025主流补习平台的辅导模式解析

“又换了一家辅导机构,孩子成绩还是没起色!”这不仅是忻府区王女士的无奈,也道出了许多忻州家长的共同焦虑。 她的孩子正在读初二,数学成绩在及格线徘徊,一年内换了3家辅导机构,花费近两万元,结果却是孩子对数学…

Java-请求相关重要的类

在 Java Web 开发(尤其是基于 Servlet 规范和 Spring Boot 的应用)中,处理 HTTP 请求(Request) 与 响应(Response) 涉及多个核心类。 一、底层:Servlet API(由 Tomcat/Jetty 等容器提供) 这些是 Java EE(现…

习题解析之:字母查找2.0

习题解析之:字母查找2.0【问题描述】 定义一个函数来判断单词m是否可以由字符串n中出现的字母来组成。本题保证字符串中出现的字母均为小写字母,n中的字母只能使用一次。在两行中分别输入两个字符串m,n 如果输入的m包…

迈向人机共生文明:AI元人文构想的理论框架、架构与意义

迈向人机共生文明:AI元人文构想的理论框架、架构与意义 岐金兰 2025年11月14日 摘要:在人工智能技术引发全球性伦理与治理焦虑的时代背景下,岐金兰提出的“AI元人文构想”为实现从“人类控制AI”到“人机文明共生”…

2025年空气滤芯批发厂家权威推荐榜单:离心式空气滤芯/油浴式空气滤芯/过滤式空气滤芯源头厂家精选

在工业环保要求日益严格与设备精细化管理的双重驱动下,空气滤芯作为保障动力设备稳定运行的关键部件,其性能直接关系到设备的使用寿命与运行效率。 根据工业过滤器行业数据显示,优质空气滤芯能有效降低设备故障率35…

Winlator 如何显示中文

1.添加值为zh-CN.utf8的环境变量LC_ALL。 2.将中文字体,比如宋体simsun.ttf放置到windows/font目录里面

dp problems

太厉害了相关的算法可以看 dp tricks 那篇文章,这篇文章主要写题,并且记录一些常见的以我目前水平难以归类的东西。 [BJ United Round #3] 三色树 改编自 ProjectEuler #677。请你对满足以下要求的 \(n\) 个节点的 无…

2025年栏杆制作厂家综合实力排行榜:专业视角下的五大优选厂商

摘要 随着建筑行业标准化和工业化进程的加速,栏杆制作行业在2025年迎来了新一轮发展机遇。本文基于市场调研数据和技术实力评估,为您呈现当前栏杆制作厂家的综合排名,并提供详细的厂商分析供参考。榜单数据来源于行…

uniapp开发抖音小程序避坑指南

在使用uniapp开发抖音小程序过程中发现了一些不常见的问题,记录一下。 1、如何禁止全屏右滑返回上一页?解决:在页面中调用tt.setSwipeBackMode(0),原生开发模式可直接使用,若是在uniapp中就使用条件编辑来调用。 …

通信原理 —— HDB3 码的编码规则及实现

参考教材为樊昌信主编的《通信原理(第 7 版)》课本摘句 HDB3 码全称为三阶高密度双极性码(High Density Bipolar 3)。它是 AMI 码的一种改进,保持了 AMI 码没有直流成分且高、低频 分量少、能量集中的优点外克服了…

我写了个容错性很高的 JSON 格式化在线工具给自己用

我写了个容错性很高的 JSON 格式化在线工具给自己用为什么开发这个在线 JSON 格式化工具? 我是一个前端开发,在开发调试时,经常需要格式化 JSON 数据。以前的做法是:打开 DevTools → 复制 JSON → 打开 VS Code →…

阿卡德平台:打造个人知识IP的得力帮手

阿卡德平台:打造个人知识IP的得力帮手在信息爆炸的时代,个人知识IP的打造已成为众多知识创作者和职场人士提升影响力、实现知识变现的重要途径。个人IP,作为个人知识产权的集中体现,不仅涵盖了文字、图片等创造性作…