相应的数据集和可执行文件均可以在本文中获取。以下各段代码也均可在jupyter中运行,可以随时查看结果。
题目描述:
1912年,泰坦尼克号在第一次航行中就与冰山相撞沉没,导致了大部分乘客和船员身亡。在这个项目中,我们将探索部分泰坦尼克号旅客名单,来确定哪些特征可以最好地预测一个人是否会生还。
分析数据
import numpy as np #导入包
import pandas as pd
# 加载数据集
full_data = pd.read_csv('titanic_data.csv')
print(full_data.describe()) #打印数据集

表中是每行:
- count:总数
- mean:平均值
- std:是方差
- min:最小值
- 25%、50%、75%:位于总数据分别为25%、50%、75%的数据
- max:最大值
表中每列是数据里面旅客的特征:
- PassengerId:乘客ID
- Survived:是否存活(0代表否,1代表是)
- Pclass:社会阶级(1代表上层阶级,2代表中层阶级,3代表底层阶级)
- Age:船上乘客的年龄(可能存在 NaN)
- SibSp:乘客在船上的兄弟姐妹和配偶的数量
- Parch:乘客在船上的父母以及小孩的数量
- Fare:乘客为船票支付的费用
这和我们直接在csv表里面看到的数据不一样,那是因为打印的时候没有处理字符列。

- Survived:是否存活(0代表否,1代表是)
- Pclass:社会阶级(1代表上层阶级,2代表中层阶级,3代表底层阶级)
- Name:船上乘客的名字
- Sex:船上乘客的性别
- Age:船上乘客的年龄(可能存在
NaN) - SibSp:乘客在船上的兄弟姐妹和配偶的数量
- Parch:乘客在船上的父母以及小孩的数量
- Ticket:乘客船票的编号
- Fare:乘客为船票支付的费用
- Cabin:乘客所在船舱的编号(可能存在
NaN) - Embarked:乘客上船的港口(C 代表从 Cherbourg 登船,Q 代表从 Queenstown 登船,S 代表从 Southampton 登船)
我们单独把数据集的前几行打印出来看下
display(full_data.head())#显示前5行

这里显示的就正确了。
从上面这些表中可以看到年龄(Age)列只有714行,缺失了105行。所以我们要对缺失值进行处理。
考虑到年龄最小值是0.42,最大值80,这里用中位数填充缺失值,因为中位数不受极端变量值的影响。
# 年龄缺失值处理
full_data['Age']=full_data['Age'].fillna( full_data['Age'].median())# 用中位数填充
# 再次查看数据完整性
print(full_data.describe())

这回数据都完整了。
因为我们感兴趣的是每个乘客或船员是否在事故中活了下来。可以将 Survived 这一特征从这个数据集移除,并且用一个单独的变量 outcomes 来存储。它也做为我们要预测的目标。
# 从数据集中移除 'Survived' 这个特征,并将它存储在一个新的变量中。
outcomes = full_data['Survived']
data = full_data.drop('Survived', axis = 1)
# 显示已移除 'Survived' 特征的数据集前5行
display(data.head())

此时泰坦尼克号的 Survived 数据从 DataFrame 移除。 data(乘客数据)和 outcomes (是否存活)现在已经匹配好。也就是对于任何乘客的 data.loc[i] 都有对应的存活的结果 outcome[i]。
定义评判标准(计算准确率)
为了验证我们预测的结果,我们需要一个标准来给我们的预测打分。预测的准确率,既正确预测乘客存活的比例。
创建我们的 accuracy_score 函数以对前五名乘客的预测来做测试。
假设预测他们全部都存活,求预测的准确率。
def accuracy_score(truth, pred):
# 确保预测的数量与结果的数量一致
if len(truth) == len(pred):
# 计算预测准确率(百分比)
return "Predictions have an accuracy of {:.2f}%.".format((truth == pred).mean()*100)
else:
return "Number of predictions does not match number of outco

8365

被折叠的 条评论
为什么被折叠?



