預測泰坦尼克號乘客生還率

 

 

機器學習工程師納米學位

機器學習基礎

項目 0: 預測泰坦尼克號乘客生還率

1912年,泰坦尼克號在第一次航行中就與冰山相撞沉沒,致使了大部分乘客和船員身亡。在這個入門項目中,咱們將探索部分泰坦尼克號旅客名單,來肯定哪些特徵能夠最好地預測一我的是否會生還。爲了完成這個項目,你將須要實現幾個基於條件的預測並回答下面的問題。咱們將根據代碼的完成度和對問題的解答來對你提交的項目的進行評估。javascript

提示:這樣的文字將會指導你如何使用 iPython Notebook 來完成項目。css

 

點擊這裏查看本文件的英文版本。html

 

瞭解數據

當咱們開始處理泰坦尼克號乘客數據時,會先導入咱們須要的功能模塊以及將數據加載到 pandas DataFrame。運行下面區域中的代碼加載數據,並使用 .head() 函數顯示前幾項乘客數據。html5

提示:你能夠經過單擊代碼區域,而後使用鍵盤快捷鍵 Shift+EnterShift+ Return 來運行代碼。或者在選擇代碼後使用播放(run cell)按鈕執行代碼。像這樣的 MarkDown 文本能夠經過雙擊編輯,並使用這些相同的快捷鍵保存。Markdown 容許你編寫易讀的純文本而且能夠轉換爲 HTML。java

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
 

從泰坦尼克號的數據樣本中,咱們能夠看到船上每位旅客的特徵node

  • 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 來存儲。它也作爲咱們要預測的目標。python

運行該代碼,從數據集中移除 Survived 這個特徵,並將它存儲在變量 outcomes 中。jquery

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]linux

 

計算準確率

爲了驗證咱們預測的結果,咱們須要一個標準來給咱們的預測打分。由於咱們最感興趣的是咱們預測的準確率,既正確預測乘客存活的比例。運行下面的代碼來建立咱們的 accuracy_score 函數以對前五名乘客的預測來作測試。android

思考題:在前五個乘客中,若是咱們預測他們所有都存活,你以爲咱們預測的準確率是多少?

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:想象一個真實世界中應用監督學習的場景,你指望預測的結果是什麼?舉出兩個在這個場景中可以幫助你進行預測的數據集中的特徵。

 

回答: 對我市天氣預報預測,知道天氣情況(晴,陰,雨,雪),使用特徵:風速,溫度,溼度

 

注意: 當你寫完了全部5個問題,3個TODO。你就能夠把你的 iPython Notebook 導出成 HTML 文件。你能夠在菜單欄,這樣導出File -> Download as -> HTML (.html) 把這個 HTML 和這個 iPython notebook 一塊兒作爲你的做業提交。

相關文章
相關標籤/搜索