点击这里查看本文件的英文版本。html
# 检查你的Python版本
from sys import version_info
if version_info.major != 2 and version_info.minor != 7:
raise Exception('请使用Python 2.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())
从泰坦尼克号的数据样本中,咱们能够看到船上每位旅客的特征node
NaN
)NaN
)由于咱们感兴趣的是每一个乘客或船员是否在事故中活了下来。能够将 Survived 这一特征从这个数据集移除,而且用一个单独的变量 outcomes
来存储。它也作为咱们要预测的目标。python
运行该代码,从数据集中移除 Survived 这个特征,并将它存储在变量 outcomes
中。jquery
# 从数据集中移除 'Survived' 这个特征,并将它存储在一个新的变量中。
outcomes = full_data['Survived']
data = full_data.drop('Survived', axis = 1)
# 显示已移除 'Survived' 特征的数据集
display(data.head())
这个例子展现了如何将泰坦尼克号的 Survived 数据从 DataFrame 移除。注意到 data
(乘客数据)和 outcomes
(是否存活)如今已经匹配好。这意味着对于任何乘客的 data.loc[i]
都有对应的存活的结果 outcome[i]
。linux
为了验证咱们预测的结果,咱们须要一个标准来给咱们的预测打分。由于咱们最感兴趣的是咱们预测的准确率,既正确预测乘客存活的比例。运行下面的代码来建立咱们的 accuracy_score
函数以对前五名乘客的预测来作测试。android
思考题:在前五个乘客中,若是咱们预测他们所有都存活,你以为咱们预测的准确率是多少?
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)
提示:若是你保存 iPython Notebook,代码运行的输出也将被保存。可是,一旦你从新打开项目,你的工做区将会被重置。请确保每次都从上次离开的地方运行代码来从新生成变量和函数。
若是咱们要预测泰坦尼克号上的乘客是否存活,可是咱们又对他们一无所知,那么最好的预测就是船上的人无一幸免。这是由于,咱们能够假定当船沉没的时候大多数乘客都遇难了。下面的 predictions_0
函数就预测船上的乘客所有遇难。
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%
提示:运行下面的代码来查看预测的准确率。
print accuracy_score(outcomes, predictions)
咱们可使用 survival_stats
函数来看看 Sex 这一特征对乘客的存活率有多大影响。这个函数定义在名为 titanic_visualizations.py
的 Python 脚本文件中,咱们的项目提供了这个文件。传递给函数的前两个参数分别是泰坦尼克号的乘客数据和乘客的 生还结果。第三个参数代表咱们会依据哪一个特征来绘制图形。
运行下面的代码绘制出依据乘客性别计算存活率的柱形图。
survival_stats(data, outcomes, 'Sex')
观察泰坦尼克号上乘客存活的数据统计,咱们能够发现大部分男性乘客在船沉没的时候都遇难了。相反的,大部分女性乘客都在事故中生还。让咱们以此改进先前的预测:若是乘客是男性,那么咱们就预测他们遇难;若是乘客是女性,那么咱们预测他们在事故中活了下来。
将下面的代码补充完整,让函数能够进行正确预测。
提示:您能够用访问 dictionary(字典)的方法来访问船上乘客的每一个特征对应的值。例如, passenger['Sex']
返回乘客的性别。
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%
提示:你须要在下面添加一个代码区域,实现代码并运行来计算准确率。
print accuracy_score(outcomes, predictions)
仅仅使用乘客性别(Sex)这一特征,咱们预测的准确性就有了明显的提升。如今再看一下使用额外的特征可否更进一步提高咱们的预测准确度。例如,综合考虑全部在泰坦尼克号上的男性乘客:咱们是否找到这些乘客中的一个子集,他们的存活几率较高。让咱们再次使用 survival_stats
函数来看看每位男性乘客的年龄(Age)。这一次,咱们将使用第四个参数来限定柱形图中只有男性乘客。
运行下面这段代码,把男性基于年龄的生存结果绘制出来。
survival_stats(data, outcomes, 'Age', ["Sex == 'male'"])
仔细观察泰坦尼克号存活的数据统计,在船沉没的时候,大部分小于10岁的男孩都活着,而大多数10岁以上的男性都随着船的沉没而遇难。让咱们继续在先前预测的基础上构建:若是乘客是女性,那么咱们就预测她们所有存活;若是乘客是男性而且小于10岁,咱们也会预测他们所有存活;全部其它咱们就预测他们都没有幸存。
将下面缺失的代码补充完整,让咱们的函数能够实现预测。
提示: 您能够用以前 predictions_1
的代码做为开始来修改代码,实现新的预测函数。
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%
提示:你须要在下面添加一个代码区域,实现代码并运行来计算准确率。
print accuracy_score(outcomes, predictions)
添加年龄(Age)特征与性别(Sex)的结合比单独使用性别(Sex)也提升了很多准确度。如今该你来作预测了:找到一系列的特征和条件来对数据进行划分,使得预测结果提升到80%以上。这可能须要多个特性和多个层次的条件语句才会成功。你能够在不一样的条件下屡次使用相同的特征。Pclass,Sex,Age,SibSp 和 Parch 是建议尝试使用的特征。
使用 survival_stats
函数来观测泰坦尼克号上乘客存活的数据统计。
提示: 要使用多个过滤条件,把每个条件放在一个列表里做为最后一个参数传递进去。例如: ["Sex == 'male'", "Age < 18"]
survival_stats(data, outcomes, 'Age', ["Sex == 'male'", "Pclass == 1", "SibSp == 1", "Parch == 2"])
当查看和研究了图形化的泰坦尼克号上乘客的数据统计后,请补全下面这段代码中缺失的部分,使得函数能够返回你的预测。
在到达最终的预测模型前请确保记录你尝试过的各类特征和条件。
提示: 您能够用以前 predictions_2
的代码做为开始来修改代码,实现新的预测函数。
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%
提示:你须要在下面添加一个代码区域,实现代码并运行来计算准确率。
print accuracy_score(outcomes, predictions)
通过了数次对数据的探索和分类,你建立了一个预测泰坦尼克号乘客存活率的有用的算法。在这个项目中你手动地实现了一个简单的机器学习模型——决策树(decision tree)。决策树每次按照一个特征把数据分割成愈来愈小的群组(被称为 nodes)。每次数据的一个子集被分出来,若是分割后新子集之间的类似度比分割前更高(包含近似的标签),咱们的预测也就更加准确。电脑来帮助咱们作这件事会比手动作更完全,更精确。这个连接提供了另外一个使用决策树作机器学习入门的例子。
决策树是许多监督学习算法中的一种。在监督学习中,咱们关心的是使用数据的特征并根据数据的结果标签进行预测或建模。也就是说,每一组数据都有一个真正的结果值,不管是像泰坦尼克号生存数据集同样的标签,或者是连续的房价预测。
问题5:想象一个真实世界中应用监督学习的场景,你指望预测的结果是什么?举出两个在这个场景中可以帮助你进行预测的数据集中的特征。
回答: 对我市天气预报预测,知道天气情况(晴,阴,雨,雪),使用特征:风速,温度,湿度
注意: 当你写完了全部5个问题,3个TODO。你就能够把你的 iPython Notebook 导出成 HTML 文件。你能够在菜单栏,这样导出File -> Download as -> HTML (.html) 把这个 HTML 和这个 iPython notebook 一块儿作为你的做业提交。