1. 项目概述
作为一名长期从事数据科学实践的工程师,我最近完成了一个使用pgmpy库构建泰坦尼克号数据集贝叶斯网络的项目。这个项目不同于常见的机器学习分类任务,它更注重概率推理和可解释性。通过完整的流程——从数据清洗、离散化处理到网络构建与推理——我实现了两种建模方式:手工设计网络(准确率82.68%)和自动结构学习(78.77%)。
贝叶斯网络在这个案例中展现了独特优势:不仅能预测乘客是否生还,还能回答"在特定条件下生还概率是多少"这类概率推理问题。例如,对于女性、头等舱、高票价且有舱位信息的乘客,模型计算出生还概率高达96.64%。这种能力是传统分类模型难以提供的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与数据获取
2.1 实验环境配置
我使用的是Python 3.13环境,核心依赖包括:
bash复制pgmpy==1.0.0
pandas==2.1.0
scikit-learn==1.3.0
matplotlib==3.8.0
seaborn==0.12.2
建议使用虚拟环境管理依赖:
bash复制python -m venv bn_env
source bn_env/bin/activate # Linux/Mac
bn_env\Scripts\activate # Windows
pip install -r requirements.txt
2.2 数据获取与划分
数据源来自公开的Titanic数据集:
python复制import pandas as pd
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
data = pd.read_csv(url)
# 划分训练测试集
from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(data, test_size=0.2, random_state=42)
print(f"训练集: {len(train_df)}条, 测试集: {len(test_df)}条")
3. 数据预处理关键步骤
3.1 缺失值处理策略
原始数据存在严重缺失问题,特别是Cabin字段(约77%缺失)和Age字段(约20%缺失)。我的处理方法是:
- Cabin字段:简化为二元特征(是否有舱位信息)
python复制data['Cabin'] = data['Cabin'].notna().astype(int)
- Age字段:从姓名中提取称谓(Mr/Mrs/Miss等),按称谓分组填补
python复制# 提取称谓
data["Title"] = data["Name"].str.extrac
