边境的悍匪—Kaggle—泰坦尼克号生还预测详细教程

  • 前言
  • 项目介绍
  • 前期准备
  • 加载数据
  • 初步分析
  • 数据清洗
  • 数据分析
  • 特征转换
  • 建模与调优
  • 模型训练与预测
  • 总结

前言

最近在学习机器学习,想要把学习到的知识运用到实践中,找了很多地方终决定使用kaggle上的数据集。文章主要描述第一次加入到kaggle中完整的完成对泰坦尼克号数据挖掘、分析到预测,最后上传到平台获取分数的一个过程。

该项目是博主的第一个kaggle项目,记录下来用作学习和分享,全文有任何疑点欢迎立刻联系并指出我的错误,不喜勿喷。

项目介绍

泰坦尼克号的沉没是历史上最臭名昭著的沉船之一。
1912年4月15日,人们普遍认为“永不沉没”的皇家邮轮“泰坦尼克”号在处女航中撞上冰山后沉没。不幸的是,船上没有足够的救生艇供所有人使用,导致2224名乘客和船员中有1502人死亡。
虽然生存中有一些运气因素,但似乎有些人比其他人更有可能生存下来。
在这个挑战中,我们要求你建立一个预测模型来回答这个问题:“什么样的人更有可能活下来?”使用乘客数据(如姓名、年龄、性别、社会经济阶层等)。

前期准备


图中红框部分就是泰塔尼克号项目,点击进入即可参加。

点击data获取下载分析数据。

加载数据

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as pltfrom sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.feature_selection import SelectKBest# 加载数据
train = pd.read_csv("./data/train.csv")
test = pd.read_csv("./data/test.csv")all_data = pd.concat([train, test])
# 获取测试集的id
passenger_id = test["PassengerId"]

初步分析

我们简单的打印一个数据详情和一部分数据,检查数据的基本情况。我们可以看到这组数据一共有12个特征,其中Age特征缺失263条数据,Fare缺失一条数据,Cabin缺失1014条数据,Embarked缺失2条数据,整个数据集有1309条数据,其中891条是训练集,418条是训练集。

# 特征含义:
# PassengerId(ID)
# Survived (标志是否存活)
# Pclass(客舱等级)
# Name(乘客姓名)
# Sex(性别)
# Age(年龄)
# SibSp(兄弟姐妹数/配偶数)
# Parch(父母数/子女数)
# Ticket(船票编号)
# Fare(票价)
# Cabin(客舱编号)
# Embarked(上船的港口)print(all_data.info())
print(all_data.head())
print(all_data.isnull().sum())


数据清洗

我们接下来的任务需要把数据中缺失的部分用各种方式补全,竟可能的让数据完整统一,看上去更清晰。
首选把性别换位数字

# 把男性设置成 1 女性设置成 0
all_data["Sex"] = all_data["Sex"].apply(lambda x: 0 if x == "female" else 1)

接下来从缺失最多的Cabin下手,我们以重新创建一个特征的方式来补全Cabin。这里使用编号的第一个字母来做为甲板号,缺失的定义为U(unknown),修改完查看每个甲板号的生存率。

# 补全客舱编号特征,此处用Deck来替代客舱编号,编号为空的用unknown U 来替代
all_data["Deck"] = all_data["Cabin"].apply(lambda x: "U" if x is np.nan else str(x)[0])
sns.barplot(x="Deck", y="Survived", data=all_data)
plt.show()


然后把甲板号改为数字

deck_dict = {"U": 1, "C": 2, "B": 3, "D": 4, "E": 5, "A": 6, "F": 7, "G": 8, "T": 9}
all_data["Deck"] = all_data["Deck"].map(deck_dict)

补全年龄需要根据名字中的特殊标识分类人们的标签,有的是男士有的是妇女有的是士官。完成之后选择年龄(Age),标签(Title),船舱等级(Pclass)性别(Sex)特征来使用RandomForestRegressor训练预测填充缺失值。

# 补全年龄
# 按照标签给这些人分类
all_data["Title"] = all_data["Name"].apply(lambda x: x.split(",")[1].split(".")[0].strip())
# print(all_data["Title"].value_counts())
title_dict = {}
title_dict.update(dict.fromkeys(['Capt', 'Col', 'Major', 'Dr', 'Rev'], "Officer"))
title_dict.update(dict.fromkeys(['Don', 'Sir', 'the Countess', 'Dona', 'Lady'], "Royalty"))
title_dict.update(dict.fromkeys(['Mme', 'Ms', 'Mrs'], 'Mrs'))
title_dict.update(dict.fromkeys(['Mlle', 'Miss'], 'Miss'))
title_dict.update(dict.fromkeys(['Mr'], 'Mr'))
title_dict.update(dict.fromkeys(['Jonkheer', "Master"], 'Master'))
all_data["Title"] = all_data["Title"].map(title_dict)# 选择性别 标签 客舱等级来预测补全年龄数据
replenish_age = all_data[["Age", "Title", "Pclass", "Sex"]]
replenish_age = pd.get_dummies(replenish_age)
unknown_age = replenish_age[replenish_age["Age"].isnull()].values
known_age = replenish_age[replenish_age["Age"].notnull()].values
X = known_age[:, 1:]
y = known_age[:, 0]
rfr = RandomForestRegressor(n_estimators=100, random_state=0, n_jobs=1)
rfr.fit(X, y)
predict_age = rfr.predict(unknown_age[:, 1:])
all_data.loc[(all_data["Age"].isnull()), "Age"] = predict_age

最后两个根据特征对应的中位数来补全数据

# 补全Fare 与 Embarked
# 查看那一条Fare为空的数据, 根据上船的港口和仓位来查看价格
print(all_data.loc[(all_data["Fare"].isnull())])fare = all_data.loc[(all_data["Pclass"] == 3) & (all_data["Embarked"] == "S")].Fare.median()
all_data["Fare"] = all_data["Fare"].fillna(fare)# 查看那两条Embarked为空的数据
print(all_data[["PassengerId", "Pclass", "Fare", "Embarked"]].loc[(all_data["Embarked"].isnull())])
print(all_data.groupby(["Pclass", "Embarked"])["Fare"].median())
all_data.loc[(all_data["Embarked"].isnull()), "Embarked"] = "C"

至此,所有数据清理工作完成。

数据分析

# 查看相关性矩阵图
sns.heatmap(all_data.corr(), cmap="Blues", vmax=1, annot=True)
plt.show()
# 初步确认了有关特征为 甲板号(Deck) 票价(Fare) 性别(Sex) 船舱等级(Pclass)


根据相关性矩阵图初步确认了有关特征为 甲板号(Deck) 票价(Fare) 性别(Sex) 船舱等级(Pclass),后续就是逐个验证每个特征与存活的关系,会有很多图片这里就不一一呈现。

# 验证甲板号与存活的关系
sns.barplot(x="Deck", y="Survived", data=all_data)
plt.show()# 验证票价和存活的关系(可升级为价格区间)
face = sns.FacetGrid(all_data, hue="Survived", aspect=2)
face.map(sns.kdeplot, "Fare", shade=True)
face.set(xlim=(0, 100))
face.add_legend()
plt.xlabel("Fare")
plt.ylabel("density")
plt.show()# 验证性别与存活的关系
sns.barplot(x="Sex", y="Survived", data=all_data)
plt.show()# 验证船舱等级与存活的关系
sns.barplot(x="Pclass", y="Survived", data=all_data)
plt.show()# 验证年龄与存活的关系(同样可以升级为年龄区间)
face = sns.FacetGrid(all_data, hue="Survived", aspect=2)
face.map(sns.kdeplot, "Age", shade=True)
face.set(xlim=(0, train["Age"].max()))
face.add_legend()
plt.xlabel("Age")
plt.ylabel("density")
plt.show()# 验证兄弟姐妹数/配偶数与存活的关系
sns.barplot(x="SibSp", y="Survived", data=all_data)
plt.show()# 验证父母数/子女数与存活的关系
sns.barplot(x="Parch", y="Survived", data=all_data)
plt.show()

特征转换

在验证了已有特征完成后我还需要生成一些新的特征或者是对原有的特征做一些转换。后续代码主要完成了以下几个事情:

  1. 验证船票编号相同数和生存率的关系。
  2. 生成一个姓的特征家庭数量并对家庭数量进行分类。
  3. 对年龄、票价根据上一步分析的结果进行分类。
 特征转换并验证特征与存活的关系
# 验证船票编号相同数和生存率的关系(初步设想可以分为编号为纯属数字与有字母的分类)
ticket_dict = dict(all_data["Ticket"].value_counts())
all_data["TicketList"] = all_data["Ticket"].apply(lambda x: ticket_dict[x])
print(all_data["TicketList"].value_counts())
sns.barplot(x="TicketList", y="Survived", data=all_data)
plt.show()# 生成一个家庭人员数据
all_data["FamilySize"] = all_data["SibSp"] + all_data["Parch"] + 1print(all_data["FamilySize"].value_counts())
sns.barplot(x="FamilySize", y="Survived", data=all_data)
plt.show()# 对家庭人数进行分类
def family_size_class(num):if 2 <= num <= 4:return 1elif num == 1 or 4 < num <= 8:return 2elif num > 8:return 3all_data["FamilySizeClass"] = all_data["FamilySize"].apply(family_size_class)sns.barplot(x="FamilySizeClass", y="Survived", data=all_data)
plt.show()# 对票价进行分类
def fare_class(f):if f <= 30:return 1elif 30 <= f <= 200:return 2elif f > 200:return 3all_data["FareClass"] = all_data["Fare"].apply(fare_class)print(all_data["FareClass"].value_counts())
sns.barplot(x="FareClass", y="Survived", data=all_data)
plt.show()# 对年龄进行分类
def age_class(a):if a <= 20:return 1elif 20 < a < 35:return 2elif a >= 35:return 3all_data["AgeClass"] = all_data["Age"].apply(age_class)
print(all_data["AgeClass"].value_counts())
sns.barplot(x="AgeClass", y="Survived", data=all_data)
plt.show()

建模与调优

# 选取特征,划分训练集与测试集
all_data = all_data[["Survived", "Pclass", "Sex", "Embarked", "Deck", "Title", "TicketList","FamilySizeClass", "FareClass", "AgeClass"]]
all_data = pd.get_dummies(all_data)
train = all_data[all_data["Survived"].notnull()].values
test = all_data[all_data["Survived"].isnull()].drop("Survived", axis=1).values
X = train[:, 1:]
y = train[:, 0]# 建模和优化
pipe = Pipeline([("select", SelectKBest()),("classify", RandomForestClassifier(random_state=7, max_features="sqrt"))])param_test = {"classify__n_estimators": list(range(20, 50, 2)),"classify__max_depth": list(range(3, 60, 3))}gsc = GridSearchCV(estimator=pipe, param_grid=param_test, scoring="roc_auc", cv=10)
gsc.fit(X, y)
print(gsc.best_params_, gsc.best_score_)

模型训练与预测

# 训练模型
select = SelectKBest()
rfc = RandomForestClassifier(random_state=7, max_features="sqrt", n_estimators=42, max_depth=6, warm_start=True)
pipe = make_pipeline(select, rfc)
pipe.fit(X, y)
# 交叉验证
cv_score = cross_val_score(pipe, X, y, cv=10)
print(f"CV Score : Mean - {np.mean(cv_score)} | Std - {np.std(cv_score)}")# 预测
predictions = pipe.predict(test)
submission = pd.DataFrame({"PassengerId": passenger_id, "Survived": predictions.astype(np.int32)})
submission.to_csv("./data/submission_v0.1.csv", index=False)

总结

最后把生成的csv上传到kaggle即可,泰坦尼克号已经有很多很多的队伍参加,实现的方法大同小异,这个算法最后的结果也并没有达到很完美,还需要很多的改进。如果你有什么好的思路或者是想要和博主一起学习机器学习,可以与我取得联系。邮箱2579779624@qq.com。感谢阅读,祝你好运。

边境的悍匪—Kaggle—泰坦尼克号生还预测详细教程相关推荐

  1. Kaggle实战入门:泰坦尼克号生还预测(基础版)

    Kaggle实战入门:泰坦尼克号生还预测 1. 加载数据 2. 特征工程 3. 模型训练 4. 模型部署 泰坦尼克号(Titanic),又称铁达尼号,是当时世界上体积最庞大.内部设施最豪华的客运轮船, ...

  2. Kaggle实战入门:泰坦尼克号生还预测(进阶版)

    Kaggle实战入门:泰坦尼克号生还预测 1. 加载数据 2. 特征工程 3. 模型训练 4. 模型部署 Kaggle实战入门:泰坦尼克号生还预测(基础版)对机器学习的全流程进行了总体介绍.本文继续以 ...

  3. Kaggle泰坦尼克号生存预测挑战——模型建立、模型调参、融合

    Kaggle泰坦尼克号生存预测挑战 这是kaggle上Getting Started 的Prediction Competition,也是比较入门和简单的新人赛,我的最好成绩好像有进入top8%,重新 ...

  4. Kaggle泰坦尼克号生存预测挑战——数据分析

    Kaggle泰坦尼克号生存预测挑战 这是kaggle上Getting Started 的Prediction Competition,也是比较入门和简单的新人赛,我的最好成绩好像有进入top8%,重新 ...

  5. 2泰坦尼克号生还预测 四种不同方法

    1.泰坦尼克号生还预测 准备工作 泰坦尼克号生还预测是一个非常典型的联系项目.数据集是公开数据集. 1.1 环境准备 numpy=1.14.5 pandas=0.22.0 sklearn=0.19.2 ...

  6. [sklearn数据科学浅尝]kaggle泰坦尼克号幸存预测问题(入全球前10%)

    问题描述 比赛地址 kaggle泰坦尼克号比赛说明 泰坦尼克号的沉没是历史上最著名的沉船之一.1912年4月15日,在她的首航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502 ...

  7. kaggle 泰坦尼克号生存预测——六种算法模型实现与比较

    Hi,大家好,这是我第一篇博客. 作为非专业程序小白,博客内容必然有不少错误之处,还望各位大神多多批评指正. 在开始正式内容想先介绍下自己和一些异想天开的想法. 我是一名研究生,研究的方向是蛋白质结构 ...

  8. kaggle竞赛--房价预测详细解读

    ## Kaggle竞赛 -- 房价预测 (House Prices) #### 完整代码见[kaggle kernel](https://www.kaggle.com/massquantity/all ...

  9. 头哥教学平台-泰坦尼克号生还预测

    第2关 填充缺失值 import pandas as pd import numpy as npdef process_nan_value(data):'''处理data中缺失值,有缺失值的特征为`A ...

  10. 机器学习实战(入门级) ------ Kaggle 泰坦尼克号幸存者预测 (随机森林,KNN,SVM)

    文章目录 前言 数据集介绍 gender_submision.csv: train.csv: test.csv 数据清洗 数据预处理 缺失值填充 数据优化 训练过程 SVM 完整代码 KNN K-Me ...

最新文章

  1. 怎样学会科学的调研并启动一个项目
  2. Python爬虫自学之第(⑤)篇——爬取某宝商品信息
  3. opencv 读取CV_16U图像 c++
  4. python请输入_python中的三种输入方式
  5. mysql NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
  6. PyTorch 深度学习:32分钟快速入门——DenseNet
  7. linux软件安装完成信号,Linux信号机制解析
  8. VB.NET 中图形旋转任意角度 [ZT]
  9. LINUX:lpr不能打印,可以试试lp
  10. java类转为er图_ER图,以及转化成关系模式
  11. C99标准的新特性介绍
  12. mysql日期查询索引_mysql – 如何为这种查询索引两个日期列
  13. JAVA面试题2012(1)
  14. 前端笔记1(选择器,动态增添/修改页面元素)
  15. java的博_小博老师解析Java核心技术 ——I/O流
  16. 台式计算机怎么加一个硬盘,台式机加装一个机械硬盘图解 但建议直接在windows下...
  17. Python语言中的注释方法应用
  18. [java]干支纪年法(循环练习)
  19. shell 脚本处理多行文本的记录 -- awk
  20. 控制工程基础应掌握的重要知识点

热门文章

  1. win11关闭开机密码的方法
  2. 实验室服务器系统崩溃,选课系统崩溃解救报告
  3. 在html中加入网址,网页超链接怎么做,添加超链接网址的的详细步骤
  4. v-charts使用-实例
  5. java对网络图片进行签名
  6. java抠图片文字或签名
  7. 安卓查看内存读写测试软件_办公电脑太慢?试试加条内存就好!内存晒单和内存问题科普...
  8. Android广播静态注册失效
  9. php nofollow,php如何实现统一给外部链接添加nofollow值?
  10. 科研实习 | 清华大学交叉信息研究院弋力老师招收三维视觉科研实习生