当前位置: 首页 > news >正文

机器学习入门实战 4 - 基本模型

📌 机器学习基本模型项目实战:预测泰坦尼克号乘客的生存概率

🚢 项目背景

1912 年 4 月 15 日,泰坦尼克号在处女航中撞上冰山沉没,船上 2224 名乘客和船员中,仅有约 710 人生还。
哪些因素决定了生还几率? 年龄?性别?船舱等级?
作为数据科学家,你的任务是分析数据并建立模型,预测某位乘客是否能生还

本项目将贯穿 数据清理 → 可视化分析 → 机器学习建模 → 预测生存概率,让你从零开始完成一个完整的数据科学项目!🚀


📌 1. 获取数据

数据来源

  • 我们使用 Kaggle 泰坦尼克号数据集
  • 下载地址:Titanic - Machine Learning from Disaster
  • 文件train.csv

📌 安装所需工具

pip install pandas numpy seaborn matplotlib scikit-learn

Pandas、NumPy、Seaborn、Matplotlib 是 Python 进行数据分析 & 可视化最常用的四个库,适用于数据处理、统计计算、图表绘制等。

主要用途常见功能
Pandas数据处理读写 CSV、数据清理、数据分析
NumPy数值计算矩阵运算、随机数生成
Seaborn高级可视化统计图表、热图
Matplotlib基础绘图折线图、柱状图、散点图

sklearn(Scikit-learn)是 Python 里最流行的机器学习库,用于构建、训练和评估机器学习模型。它基于 NumPy 和 pandas,提供了数据预处理、分类、回归、聚类、降维等功能。

为什么使用 sklearn?
✅ 封装了常见机器学习算法,只需几行代码即可完成训练和预测
✅ 支持数据预处理(填充缺失值、特征缩放、类别编码等)
✅ 提供超参数调优工具(如 GridSearchCV)
✅ 可用于分类、回归、聚类、降维等各种任务
✅ 与 pandas、matplotlib、seaborn 兼容,易于分析和可视化

📌 导入库

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix

📌 加载数据

df = pd.read_csv("train.csv")

# 查看数据结构
print(df.head())

数据示例

   PassengerId  Survived  Pclass   Sex   Age  SibSp  Parch     Fare  Embarked
0            1        0       3  male  22.0      1      0   7.2500        S
1            2        1       1  female 38.0      1      0  71.2833        C

📌 字段解释

  • Survived:是否生还(0=未生还,1=生还)
  • Pclass:船舱等级(1=头等舱,2=二等舱,3=三等舱)
  • Sex:性别
  • Age:年龄
  • SibSp:兄弟姐妹/配偶数量
  • Parch:父母/子女数量
  • Fare:票价
  • Embarked:登船港口(C = Cherbourg, Q = Queenstown, S = Southampton)

📌 2. 数据清理

📌 查看缺失值

print(df.isnull().sum())

可能发现

Age         177
Cabin       687
Embarked      2

📌 处理缺失值

df["Age"] = df["Age"].fillna(df["Age"].median())  # 用中位数填充年龄
df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode()[0])  # 用最常见的港口填充
df.drop(columns=["Cabin", "PassengerId", "Name", "Ticket"], inplace=True)  # 删除无关列

📌 3. 数据可视化

📌 乘客生还率

plt.figure(figsize=(6,4))
sns.countplot(x="Survived", data=df, palette="Set1")
plt.title("泰坦尼克号生还 vs. 未生还人数")
plt.show()

观察:生还人数远少于未生还人数。
在这里插入图片描述

📌 不同性别的生还率

plt.figure(figsize=(6,4))
sns.barplot(x="Sex", y="Survived", data=df, palette="pastel")
plt.title("性别 vs. 生还率")
plt.show()

观察女性生还率显著高于男性(“女士优先”)。
在这里插入图片描述

📌 不同船舱的生还率

plt.figure(figsize=(6,4))
sns.barplot(x="Pclass", y="Survived", data=df, palette="muted")
plt.title("船舱等级 vs. 生还率")
plt.show()

观察:头等舱乘客生还率最高,三等舱最低。
在这里插入图片描述


📌 4. 特征工程

特征工程是数据科学和机器学习中的关键步骤,目的是优化数据,使机器学习模型能更好地理解和学习数据的模式。

📌 简单来说:

  • 数据本身无法直接用于机器学习模型,需要进行转换和优化
  • 特征工程是将原始数据转换为更有意义、更能帮助模型学习的形式
  • 好的特征工程可以极大提升模型的准确率

📌 总结
✅ 数据清理 = 确保数据质量,不让模型崩溃
✅ 特征工程 = 提供更有用的数据,提升模型表现

📌 处理类别变量

df["Sex"] = df["Sex"].map({"male": 0, "female": 1})
df["Embarked"] = df["Embarked"].map({"C": 0, "Q": 1, "S": 2})

📌 划分训练集和测试集

X = df.drop("Survived", axis=1)  # 特征 #删除 Survived 列,保留所有特征列
y = df["Survived"]  # 目标值

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

📌 作用:
train_test_split 是 scikit-learn(sklearn)库中的方法,用于拆分训练集和测试集。
将 X 和 y 拆分为训练集(80%)和测试集(20%)。
test_size=0.2 表示 20% 数据作为测试集,80% 用于训练模型。
random_state=42 保证每次拆分结果相同,方便实验对比。

📌为什么要拆分训练集和测试集
训练集(X_train, y_train)
用于训练机器学习模型
模型从训练数据中学习规律
测试集(X_test, y_test)
用于评估模型的泛化能力
不能用训练数据评估,否则会过拟合!
📌 举例
如果用训练数据评估模型,可能会得到 99% 准确率,但这只是“记住”了数据,并无法对新数据进行准确预测(过拟合)。
使用测试数据可以真正衡量模型是否能推广到新数据上。


📌 5. 训练不同模型

在 sklearn 中,我们可以使用 不同的机器学习模型 来训练数据:

📌 逻辑回归

适用场景

  • 逻辑回归适用于二分类任务(如生还 vs. 未生还)
  • 适用于数据线性可分的情况
  • 解释性强,可以提供各个特征对结果的影响权重

✅ 逻辑回归能提供较快、稳定的分类,但可能无法捕捉复杂的非线性关系。

model_lr = LogisticRegression()
model_lr.fit(X_train, y_train)
y_pred_lr = model_lr.predict(X_test)

accuracy_lr = accuracy_score(y_test, y_pred_lr)
print(f"逻辑回归准确率: {accuracy_lr:.2f}")

输出示例:

逻辑回归准确率: 0.81

📌 决策树

适用场景

  • 决策树适用于非线性数据(如不同等级船舱对生还率的影响可能是非线性的)
  • 具有可解释性,可以绘制树状图来分析决策过程
  • 但容易过拟合,深度太大会记住训练数据,而泛化能力下降
model_dt = DecisionTreeClassifier(max_depth=4)
model_dt.fit(X_train, y_train)
y_pred_dt = model_dt.predict(X_test)

accuracy_dt = accuracy_score(y_test, y_pred_dt)
print(f"决策树准确率: {accuracy_dt:.2f}")

输出示例:

决策树准确率: 0.80

📌 随机森林

适用场景

  • 随机森林是集成学习方法,使用多棵决策树进行预测
  • 对抗过拟合:相比单个决策树,随机森林更稳定,泛化能力更强
  • 适用于高维度数据,能自动选择重要特征

✅ 随机森林通常比单一决策树更稳健,适用于大部分分类任务!

model_rf = RandomForestClassifier(n_estimators=100, random_state=42)
model_rf.fit(X_train, y_train)
y_pred_rf = model_rf.predict(X_test)

accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"随机森林准确率: {accuracy_rf:.2f}")

输出示例:

随机森林准确率: 0.82

模型对比

模型准确率
逻辑回归0.81
决策树0.80
随机森林0.82

📌 哪个模型表现最好?


📌 6. 结果分析

📌 查看随机森林模型的混淆矩阵

cm = confusion_matrix(y_test, y_pred_rf)
sns.heatmap(cm, annot=True, cmap="Blues", fmt="d")
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.title("随机森林混淆矩阵")
plt.show()

在这里插入图片描述

解释

  • 左上角 TN(True Negative)= 90:真实类别是 0,模型也预测为 0(正确分类)
  • 右上角 FP(False Positive)= 15:真实类别是 0,但模型错误地预测成 1(误报)
  • 左下角 FN(False Negative)= 18:真实类别是 1,但模型错误地预测成 0(漏报)
  • 右下角 TP(True Positive)= 56:真实类别是 1,模型也预测为 1(正确分类)

📌后续可以对混淆矩阵作进一步分析!


📌 7. 总结

📌 你学到了什么?
数据清理:处理缺失值、转换类别变量
可视化分析:不同因素(性别、船舱)对生还率的影响
机器学习模型训练:逻辑回归、决策树、随机森林
模型对比:哪个模型最适合生存预测?

相关文章:

  • 【SQL】SQL多表查询
  • FastAdmin后端列表导入表格数据
  • 瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库
  • 确保设备始终处于最佳运行状态,延长设备的使用寿命,保障系统的稳定运行的智慧地产开源了
  • HTTP2.0 和 HTTP1.1 的区别
  • 【分布式理论13】分布式存储:数据存储难题与解决之道
  • JavaEE基础之- 数据库与建模工具
  • BSD协议栈:UDP输入
  • Scrapy安装,创建Scrapy项目,启动Scrapy爬虫
  • 【Vue】集成Antlr4
  • k8s-对接NFS存储
  • java:用Guava的TypeToken优雅处理通配符类型(WildcardType): ? extends Number
  • JSON类型理解(前后端交互/内存对数据操作)
  • 【论文技巧】Mermaid VSCode插件制作流程图保存方法
  • POI优化Excel录入
  • LangFlow和LangChain有什么区别
  • 大数据SQL调优专题——Flink执行原理
  • Web3 通识
  • 解锁外观模式:Java 编程中的优雅架构之道
  • TortoiseSVN\bin下的没有svn.exe的解决问题
  • 上海市委常委会扩大会议传达学习习近平总书记考察上海重要讲话和在部分省区市“十五五”时期经济社会发展座谈会上的重要讲话精神
  • 五一车市消费观察:政策赋能、企业发力,汽车消费火热
  • 新华每日电讯头版聚焦上海:科创高地向未来
  • 2025上海车展圆满闭幕,共接待海内外观众101万人次
  • 增诉滥用职权罪,尹锡悦遭韩国检方追加起诉
  • 4月人民币对美元即期汇率微跌,今年以来升值0.48%