泰坦尼克号生存预测项目教程
1. 项目概述
在这个项目中,我们将使用泰坦尼克号乘客数据集,预测乘客是否能够生还。这是一个经典的机器学习分类问题,适合初学者练习。
2. 数据集介绍
数据集包含泰坦尼克号乘客的各种信息,如性别、年龄、船舱等级等,以及是否生还的标签。
3. 开始项目
3.1 导入必要的库
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.metrics import accuracy_score, confusion_matrix, classification_report, roc_curve, roc_auc_score
3.2 加载数据集
# 加载数据集
df = pd.read_csv('titanic.csv')
3.3 数据探索
# 查看前几行数据
print(df.head())
# 检查缺失值
print(df.isnull().sum())
# 查看数据统计信息
print(df.describe())
# 查看数据信息
print(df.info())
3.4 数据可视化
# 生存情况可视化
sns.countplot(x='Survived', data=df)
plt.show()
# 性别与生存情况
sns.countplot(x='Sex', hue='Survived', data=df)
plt.show()
# 船舱等级与生存情况
sns.countplot(x='Pclass', hue='Survived', data=df)
plt.show()
# 年龄分布
sns.histplot(df['Age'], kde=True)
plt.show()
3.5 数据预处理
处理缺失值
# 用中位数填充年龄缺失值
df['Age'].fillna(df['Age'].median(), inplace=True)
# 删除Cabin列,因为缺失值太多
df.drop('Cabin', axis=1, inplace=True)
# 删除Embarked缺失值的行(缺失值较少)
df.dropna(subset=['Embarked'], inplace=True)
编码分类变量
# 将Sex和Embarked转换为数值型
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
df['Embarked'] = le.fit_transform(df['Embarked'])
删除不必要的列
# 删除不需要的列
df.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True)
3.6 划分训练集和测试集
X = df.drop('Survived', axis=1)
y = df['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3.7 构建模型
逻辑回归模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
预测
y_pred = model.predict(X_test)
3.8 模型评估
# 准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率: {accuracy:.2f}')
# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print('混淆矩阵:')
print(cm)
# 分类报告
print('分类报告:')
print(classification_report(y_test, y_pred))
# ROC曲线
y_prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
plt.plot(fpr, tpr)
plt.xlabel('假正率')
plt.ylabel('真正率')
plt.title('ROC曲线')
plt.show()
# AUC分数
auc = roc_auc_score(y_test, y_prob)
print(f'AUC: {auc:.2f}')
3.9 结论
- 结果解释: 模型的准确率为X%,表明其在预测生存方面表现良好。
- 改进方向: 可以尝试其他模型如决策树、随机森林等,或进行超参数调优、特征工程等。
4. 额外提示
- 尝试其他模型: 如 RandomForestClassifier, SVC, 或 GradientBoostingClassifier。
- 交叉验证: 使用交叉验证获得更 robust 的性能评估。
- 处理类别不平衡: 如使用 SMOTE 等技术。
- 特征重要性分析: 研究哪些特征对预测贡献最大。
5. 参考资料
- 泰坦尼克号数据集
- Scikit-Learn 文档
- Seaborn 可视化
- Pandas 官方文档
- NumPy 官方文档
- 机器学习算法介绍
- 逻辑回归详解
- 数据预处理技巧
- 特征工程方法
- 混淆矩阵解释
- ROC 曲线和 AUC 解释
- SMOTE 技术介绍
- 交叉验证详解
- Pandas 数据处理教程
- NumPy 数据操作教程
- Seaborn 数据可视化教程
数据集介绍
好的,我明白了您的需求。以下是一个关于泰坦尼克号生存预测项目的详细中文指南,涵盖了数据理解、预处理、特征工程、模型选择、评估和预测等各个环节。
泰坦尼克号生存预测项目指南
1. 数据理解
-
数据集构成:
- 训练集(train.csv):包含乘客的特征和生存情况。
- 测试集(test.csv):包含乘客的特征,但没有生存情况,需要预测。
- 示例提交文件(gender_submission.csv):假设所有女性都存活的预测结果。
-
变量定义:
survival
:生存情况,0表示未生存,1表示生存。pclass
:票类,1表示上等,2表示中等,3表示下等。sex
:性别。age
:年龄,小于1岁的小数表示。sibsp
:船上兄弟姐妹/配偶数量。parch
:船上父母/子女数量。ticket
:票号。fare
:票价。cabin
:舱位号。embarked
:登船港口,C表示瑟堡,Q表示皇后镇,S表示南安普顿。
2. 数据预处理
-
探索性数据分析(EDA):
- 使用Pandas和Matplotlib库加载数据,检查数据结构和缺失值。
- 分析各特征与生存率之间的关系,例如性别、年龄、舱位对生存的影响。
-
缺失值处理:
- 对
age
列的缺失值,可以使用均值或中位数填充。 cabin
列缺失值较多,可以考虑创建一个新的二元特征表示是否有舱位。
- 对
3. 特征工程
-
特征创建:
- 创建
family_size
特征,结合sibsp
和parch
。 - 从
name
列中提取尊称(如Mr., Mrs., Miss.)作为新特征。
- 创建
-
类别特征处理:
- 对
sex
和embarked
进行独热编码(one-hot encoding)。
- 对
-
无用特征去除:
- 考虑删除
ticket
和cabin
等可能无用的特征。
- 考虑删除
4. 模型选择与训练
-
算法选择:
- 逻辑回归:简单且解释性强。
- 决策树:处理非线性关系能力强。
- 随机森林:集成学习,性能较好。
- 神经网络:适用于复杂关系。
-
模型评估:
- 使用交叉验证评估模型性能,防止过拟合。
- 关注准确率、精确率、召回率和F1分数。
5. 模型调优
- 超参数调优:
- 使用网格搜索或随机搜索优化模型参数。
6. 预测与提交
-
预测:
- 在测试集上应用训练好的模型进行预测。
-
结果提交:
- 确保预测结果格式正确,符合提交要求,生成提交文件。