机器学习练习项目(决策树):泰坦尼克号乘客生还率预测

相应的数据集和可执行文件均可以在本文中获取。以下各段代码也均可在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值