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