机器学习工程师纳米学位¶

机器学习基础¶

项目 0: 预测泰坦尼克号乘客生还率¶

1912年,泰坦尼克号在第一次航行中就与冰山相撞沉没,导致了大部分乘客和船员身亡。在这个入门项目中,我们将探索部分泰坦尼克号旅客名单,来确定哪些特征可以最好地预测一个人是否会生还。为了完成这个项目,你将需要实现几个基于条件的预测并回答下面的问题。我们将根据代码的完成度和对问题的解答来对你提交的项目的进行评估。

提示:这样的文字将会指导你如何使用 iPython Notebook 来完成项目。

点击这里查看本文件的英文版本。

了解数据¶

当我们开始处理泰坦尼克号乘客数据时,会先导入我们需要的功能模块以及将数据加载到 pandas DataFrame。运行下面区域中的代码加载数据,并使用 .head() 函数显示前几项乘客数据。

提示:你可以通过单击代码区域,然后使用键盘快捷键 Shift+EnterShift+ Return 来运行代码。或者在选择代码后使用播放(run cell)按钮执行代码。像这样的 MarkDown 文本可以通过双击编辑,并使用这些相同的快捷键保存。Markdown 允许你编写易读的纯文本并且可以转换为 HTML。

In [5]:
# 检查你的Python版本
from sys import version_info
if version_info.major != 2 and version_info.minor != 7:raise Exception('请使用Python 2.7来完成此项目')

In [7]:
import numpy as np
import pandas as pd# 数据可视化代码
from titanic_visualizations import survival_stats
from IPython.display import display
%matplotlib inline# 加载数据集
in_file = 'titanic_data.csv'
full_data = pd.read_csv(in_file)# 显示数据列表中的前几项乘客数据
display(full_data.head())

  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

从泰坦尼克号的数据样本中,我们可以看到船上每位旅客的特征

  • Survived:是否存活(0代表否,1代表是)
  • Pclass:社会阶级(1代表上层阶级,2代表中层阶级,3代表底层阶级)
  • Name:船上乘客的名字
  • Sex:船上乘客的性别
  • Age:船上乘客的年龄(可能存在 NaN
  • SibSp:乘客在船上的兄弟姐妹和配偶的数量
  • Parch:乘客在船上的父母以及小孩的数量
  • Ticket:乘客船票的编号
  • Fare:乘客为船票支付的费用
  • Cabin:乘客所在船舱的编号(可能存在 NaN
  • Embarked:乘客上船的港口(C 代表从 Cherbourg 登船,Q 代表从 Queenstown 登船,S 代表从 Southampton 登船)

因为我们感兴趣的是每个乘客或船员是否在事故中活了下来。可以将 Survived 这一特征从这个数据集移除,并且用一个单独的变量 outcomes 来存储。它也做为我们要预测的目标。

运行该代码,从数据集中移除 Survived 这个特征,并将它存储在变量 outcomes 中。

In [8]:
# 从数据集中移除 'Survived' 这个特征,并将它存储在一个新的变量中。
outcomes = full_data['Survived']
data = full_data.drop('Survived', axis = 1)# 显示已移除 'Survived' 特征的数据集
display(data.head())

  PassengerId Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

这个例子展示了如何将泰坦尼克号的 Survived 数据从 DataFrame 移除。注意到 data(乘客数据)和 outcomes (是否存活)现在已经匹配好。这意味着对于任何乘客的 data.loc[i] 都有对应的存活的结果 outcome[i]

计算准确率¶

为了验证我们预测的结果,我们需要一个标准来给我们的预测打分。因为我们最感兴趣的是我们预测的准确率,既正确预测乘客存活的比例。运行下面的代码来创建我们的 accuracy_score 函数以对前五名乘客的预测来做测试。

思考题:在前五个乘客中,如果我们预测他们全部都存活,你觉得我们预测的准确率是多少?

In [299]:
def accuracy_score(truth, pred):""" 返回 pred 相对于 truth 的准确率 """# 确保预测的数量与结果的数量一致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 outcomes!"# 测试 'accuracy_score' 函数
predictions = pd.Series(np.ones(5, dtype = int)) #五个预测全部为1,既存活
print accuracy_score(outcomes[:5], predictions)

Predictions have an accuracy of 60.00%.

提示:如果你保存 iPython Notebook,代码运行的输出也将被保存。但是,一旦你重新打开项目,你的工作区将会被重置。请确保每次都从上次离开的地方运行代码来重新生成变量和函数。

最简单的预测¶

如果我们要预测泰坦尼克号上的乘客是否存活,但是我们又对他们一无所知,那么最好的预测就是船上的人无一幸免。这是因为,我们可以假定当船沉没的时候大多数乘客都遇难了。下面的 predictions_0 函数就预测船上的乘客全部遇难。

In [300]:
def predictions_0(data):""" 不考虑任何特征,预测所有人都无法生还 """predictions = []for _, passenger in data.iterrows():# 预测 'passenger' 的生还率predictions.append(0)# 返回预测结果return pd.Series(predictions)# 进行预测
predictions = predictions_0(data)

问题1:对比真实的泰坦尼克号的数据,如果我们做一个所有乘客都没有存活的预测,这个预测的准确率能达到多少?

回答61.62%

提示:运行下面的代码来查看预测的准确率。

In [301]:
print accuracy_score(outcomes, predictions)

Predictions have an accuracy of 61.62%.

考虑一个特征进行预测¶

我们可以使用 survival_stats 函数来看看 Sex 这一特征对乘客的存活率有多大影响。这个函数定义在名为 titanic_visualizations.py 的 Python 脚本文件中,我们的项目提供了这个文件。传递给函数的前两个参数分别是泰坦尼克号的乘客数据和乘客的 生还结果。第三个参数表明我们会依据哪个特征来绘制图形。

运行下面的代码绘制出依据乘客性别计算存活率的柱形图。

In [302]:
survival_stats(data, outcomes, 'Sex')

观察泰坦尼克号上乘客存活的数据统计,我们可以发现大部分男性乘客在船沉没的时候都遇难了。相反的,大部分女性乘客都在事故中生还。让我们以此改进先前的预测:如果乘客是男性,那么我们就预测他们遇难;如果乘客是女性,那么我们预测他们在事故中活了下来。

将下面的代码补充完整,让函数可以进行正确预测。

提示:您可以用访问 dictionary(字典)的方法来访问船上乘客的每个特征对应的值。例如, passenger['Sex'] 返回乘客的性别。

In [303]:
def predictions_1(data):""" 只考虑一个特征,如果是女性则生还 """predictions = []for _, passenger in data.iterrows():# TODO 1# 移除下方的 'pass' 声明# 输入你自己的预测条件if passenger['Sex'] == 'female':predictions.append(1)else:predictions.append(0)# 返回预测结果return pd.Series(predictions)# 进行预测
predictions = predictions_1(data)

问题2:当我们预测船上女性乘客全部存活,而剩下的人全部遇难,那么我们预测的准确率会达到多少?

回答: 78.68%

提示:你需要在下面添加一个代码区域,实现代码并运行来计算准确率。

In [305]:
print accuracy_score(outcomes, predictions)

Predictions have an accuracy of 78.68%.

考虑两个特征进行预测¶

仅仅使用乘客性别(Sex)这一特征,我们预测的准确性就有了明显的提高。现在再看一下使用额外的特征能否更进一步提升我们的预测准确度。例如,综合考虑所有在泰坦尼克号上的男性乘客:我们是否找到这些乘客中的一个子集,他们的存活概率较高。让我们再次使用 survival_stats 函数来看看每位男性乘客的年龄(Age)。这一次,我们将使用第四个参数来限定柱形图中只有男性乘客。

运行下面这段代码,把男性基于年龄的生存结果绘制出来。

In [306]:
survival_stats(data, outcomes, 'Age', ["Sex == 'male'"])

仔细观察泰坦尼克号存活的数据统计,在船沉没的时候,大部分小于10岁的男孩都活着,而大多数10岁以上的男性都随着船的沉没而遇难。让我们继续在先前预测的基础上构建:如果乘客是女性,那么我们就预测她们全部存活;如果乘客是男性并且小于10岁,我们也会预测他们全部存活;所有其它我们就预测他们都没有幸存。

将下面缺失的代码补充完整,让我们的函数可以实现预测。
提示: 您可以用之前 predictions_1 的代码作为开始来修改代码,实现新的预测函数。

In [307]:
def predictions_2(data):""" 考虑两个特征:
            - 如果是女性则生还
            - 如果是男性并且小于10岁则生还 """predictions = []for _, passenger in data.iterrows():# TODO 2# 移除下方的 'pass' 声明# 输入你自己的预测条件if passenger['Sex'] == 'female':predictions.append(1)else:if passenger['Age'] < 10:predictions.append(1) else:predictions.append(0)# 返回预测结果return pd.Series(predictions)# 进行预测
predictions = predictions_2(data)

问题3:当预测所有女性以及小于10岁的男性都存活的时候,预测的准确率会达到多少?

回答: 79.35%

提示:你需要在下面添加一个代码区域,实现代码并运行来计算准确率。

In [308]:
print accuracy_score(outcomes, predictions)

Predictions have an accuracy of 79.35%.

你自己的预测模型¶

添加年龄(Age)特征与性别(Sex)的结合比单独使用性别(Sex)也提高了不少准确度。现在该你来做预测了:找到一系列的特征和条件来对数据进行划分,使得预测结果提高到80%以上。这可能需要多个特性和多个层次的条件语句才会成功。你可以在不同的条件下多次使用相同的特征。PclassSexAgeSibSpParch 是建议尝试使用的特征。

使用 survival_stats 函数来观测泰坦尼克号上乘客存活的数据统计。
提示: 要使用多个过滤条件,把每一个条件放在一个列表里作为最后一个参数传递进去。例如: ["Sex == 'male'", "Age < 18"]

In [309]:
survival_stats(data, outcomes, 'Age', ["Sex == 'male'", "Pclass == 1", "SibSp == 1", "Parch == 2"])

当查看和研究了图形化的泰坦尼克号上乘客的数据统计后,请补全下面这段代码中缺失的部分,使得函数可以返回你的预测。
在到达最终的预测模型前请确保记录你尝试过的各种特征和条件。
提示: 您可以用之前 predictions_2 的代码作为开始来修改代码,实现新的预测函数。

In [310]:
def predictions_3(data):""" 考虑多个特征,准确率至少达到80% """predictions = []for _, passenger in data.iterrows():# TODO 3# 移除下方的 'pass' 声明# 输入你自己的预测条件if passenger['Sex'] == 'female':predictions.append(1)else:if passenger['Age'] < 10:predictions.append(1)elif passenger['Age'] < 20:if passenger['Pclass']==1:if passenger['SibSp']==0:predictions.append(1)elif passenger['SibSp']==1 and passenger['Parch']==2:predictions.append(1)else:predictions.append(0)else:predictions.append(0)elif passenger['Age'] < 30:if (passenger['Pclass']==1 and passenger['SibSp']==1) or (passenger['Pclass']==1 and passenger['Parch']==0):predictions.append(1)else:predictions.append(0)#         predictions.append(1)#     elif (passenger['Age'] < 50 and passenger['SibSp'] == 0):elif passenger['Age'] < 40:if passenger['Pclass']==1:predictions.append(1)else:predictions.append(0)    elif passenger['Age'] < 50:if (passenger['Pclass']==1 and passenger['SibSp']==1):predictions.append(1)else:predictions.append(0)else:predictions.append(0)# 返回预测结果return pd.Series(predictions)# 进行预测
predictions = predictions_3(data)

问题4:请描述你实现80%准确度的预测模型所经历的步骤。您观察过哪些特征?某些特性是否比其他特征更有帮助?你用了什么条件来预测生还结果?你最终的预测的准确率是多少?

回答80.02%

提示:你需要在下面添加一个代码区域,实现代码并运行来计算准确率。

In [312]:
print accuracy_score(outcomes, predictions)

Predictions have an accuracy of 80.02%.

结论¶

经过了数次对数据的探索和分类,你创建了一个预测泰坦尼克号乘客存活率的有用的算法。在这个项目中你手动地实现了一个简单的机器学习模型——决策树(decision tree)。决策树每次按照一个特征把数据分割成越来越小的群组(被称为 nodes)。每次数据的一个子集被分出来,如果分割后新子集之间的相似度比分割前更高(包含近似的标签),我们的预测也就更加准确。电脑来帮助我们做这件事会比手动做更彻底,更精确。这个链接提供了另一个使用决策树做机器学习入门的例子。

决策树是许多监督学习算法中的一种。在监督学习中,我们关心的是使用数据的特征并根据数据的结果标签进行预测或建模。也就是说,每一组数据都有一个真正的结果值,不论是像泰坦尼克号生存数据集一样的标签,或者是连续的房价预测。

问题5:想象一个真实世界中应用监督学习的场景,你期望预测的结果是什么?举出两个在这个场景中能够帮助你进行预测的数据集中的特征。

回答: 对我市天气预报预测,知道天气状况(晴,阴,雨,雪),使用特征:风速,温度,湿度

欢迎扫码关注,或搜索大数据与知识图谱,定期分享大数据与知识图谱相关知识点:

转载于:https://www.cnblogs.com/zeppelin/p/10478809.html

预测泰坦尼克号乘客生还率相关推荐

  1. 基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程

    基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程 0.项目介绍 1.使用数据集 2.数据的基本统计分析 3.数据的属性探查 4.数据预处理 5.数据的相关性分析 6.特征工程 7.数据 ...

  2. 机器学习中的特征选择——决策树模型预测泰坦尼克号乘客获救实例

    在机器学习和统计学中,特征选择(英语:feature selection)也被称为变量选择.属性选择或变量子集选择.它是指:为了构建   模型而选择相关特征(即属性.指标)子集的过程.使用特征选择技术 ...

  3. 应用分类算法,预测泰坦尼克号乘客幸存结果

    应用分类算法,预测泰坦尼克号乘客幸存结果 一.业务场景 二.数据集说明 三.操作步骤 阶段一.启动HDFS.Spark集群服务和zeppelin服务器 阶段二.准备案例中用到的数据集 阶段三.对数据集 ...

  4. 机器学习入门之:使用 scikit-learn 决策分类树来预测泰坦尼克号沉船生还情况

    代码 有关数据处理部分的相关解析,请看 30天吃掉那只 TensorFlow2 写的非常详细 不再在这里赘述 from sklearn import tree import pandas as pd ...

  5. 决策树模型之泰坦尼克号乘客是否生还预测

    泰坦尼克号乘客数据查验 import pandas as pd #利用pandas的read_csv模块直接从互联网收集泰坦尼克号乘客数据 titanic = pd.read_csv('http:// ...

  6. Titantic乘客生还预测数据分析报告—基于python实现

    Titantic乘客生还预测数据分析报告-基于python实现 1. 问题提出 2. 数据描述 3. 特征独立分析 4. 数据处理 5. 模型评估 1. 问题提出 Titantic数据集是Kaggle ...

  7. Kaggle入门之泰坦尼克号生还率预测

    这是Kaggle上的一道入门题目,旨在让我们了解机器学习的大致过程. 题目链接: Titanic: Machine Learning from Disaster 题目大意:当年泰坦尼克号的沉没造成了很 ...

  8. 'python program'.count('p')的值是_如何用Python分析泰坦尼克号生还率?

    原标题:如何用Python分析泰坦尼克号生还率? 1912年当时世界上最大的豪华客轮泰坦尼克号在处女航中撞上冰山沉没,船上船员及乘客共有2224人,只有710人生还.当灾难突然降临时,所有人的生死瞬间 ...

  9. 泰坦尼克号数据_数据分析-泰坦尼克号乘客生存率预测

    项目背景 目标 预测一个乘客是否能够在泰坦尼克号事件中幸存. 概述 1912年4月15日,泰坦尼克号在首次航行期间撞上冰山后沉没,船上共有2224名人员(包括乘客和机组人员),共有1502人不幸遇难. ...

  10. gini系数 决策树_案例7:机器学习--使用决策树实现泰坦尼克号乘客生存率预测...

    一.决策树简介 1.1 什么是决策树? 决策树:是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗由多个判断节点组成的树. ...

最新文章

  1. android封装全局调用的toast_Android实用的Toast工具类封装
  2. gitlab 端口_安装Gitlab-注意端口
  3. adb server is out of date. linux,adb server is out of date. killing完美解决
  4. pip修改下载源为国内源 linux系统
  5. 2020年3月数据库流行度排行:疫情烽烟四起,数据价值为王
  6. 【Antlr】unknown attribute text for rule stat in $stat.text
  7. MVC中用 BundleCollection 压缩CSS时图片路径问题
  8. sql语句优化的一些办法
  9. 一文看尽 Facebook 3D视觉技术研究进展
  10. 基于统计学的商务与经济数据分析知识
  11. 计算机dll修复工具,DLL修复工具哪个好?五款修复能力强推荐
  12. 利用微信官方文档下载微信对账单、资金账单
  13. 如何用markdown排版公众号,使用排版神器Markdown Nice
  14. 使用calibre给电子书生成目录
  15. 互联网创业的准备——架构
  16. 群晖DS3617 DS918引导文件+安装文件下载
  17. PS 快速抠图换背景
  18. LATEX 排版问题记录
  19. java 实现树形结构
  20. mrcc srcc_mrcc – MapReduce上的分布式C编译器系统

热门文章

  1. .net分流抢票助手
  2. 视频教程-数据结构实战完全手册-C/C++
  3. MPI大漩涡(单纯的floyd)
  4. 微信小程序之“豆瓣电影”
  5. 企业信息安全————3、如何建立企业安全框架
  6. 域名劫持预防与解决办法
  7. 2017招商银行笔试01
  8. 服务器防火墙如何开放端口?常见的服务器端口有哪些?
  9. 如何制作刷爆朋友圈的H5
  10. 002-CentOS7 固定IP