Kaggle項目:泰坦尼克號生存預測

Part1 項目背景

The sinking of the RMS Titanic is one of the most infamous shipwrecks in history. On April 15, 1912, during her maiden voyage, the Titanic sank after colliding with an iceberg, killing 1502 out of 2224 passengers and crew. This sensational tragedy shocked the international community and led to better safety regulations for ships.

One of the reasons that the shipwreck led to such loss of life was that there were not enough lifeboats for the passengers and crew. Although there was some element of luck involved in surviving the sinking, some groups of people were more likely to survive than others, such as women, children, and the upper-class.

In this challenge, we ask you to complete the analysis of what sorts of people were likely to survive. In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy.


Part2 項目實踐

整體思路:

1 理解項目需求

登錄Kaggle官網,查看項目需求:

Titanic: Machine Learning from Disaster?

www.kaggle.com

1.1 項目需求(提出問題)

什麼樣的人在泰坦尼克號遇難事件中更容易存活?

1.2 實踐技能

  • Binary classification(二元分類)
  • Python and R basics

2 數據理解、準備

2.1 導入數據

其中訓練數據總共有891條,測試數據有418條

為了方便數據清洗,將兩個數據集合併

2.2 查看數據集信息

2.2.1 查看數據信息的方法

  • full.head()#查看前五條數據
  • full.describe()#獲取數據類型列的描述統計信息
  • full.info()#獲取每一列的數據信息(數據總和、數據類型等)

2.2.2 分析

  • 數據存在缺失:

1)年齡(Age)裡面數據總數是1046條,缺失了263條,缺失率263/1309=20%

2)船票價格(Fare)裡面數據總數是1308條,缺失了1條數據

3)登船地點(Embarked)裡面數據總數是1307條,缺失了2條數據

4)船艙好(Cabin)裡面數據總數是295條,缺失了1014條,缺失率=1014/1309=77.5%,缺失比較大

  • 數據類型:

該項目生存率預測屬於二元分類問題(Binary classification)即特徵描述需要使用0與1來描述,因此對於object類型數據需要進行特徵提取

3 數據清洗

3.1 數據預處理

3.1.1 缺失值處理

1)數值型數據:年齡(Age),船票價格(Fare);一般採取用平均值填充缺失值

2)字元串數據:登船港口(Embarked),船艙號(Cabin)

先查看數據內容根據缺失數量考慮不同的填充方式

  • 登船港口(Embarked):屬於分類數據,缺失2條,可以考慮用出現頻次最高的數據填充,即填充『S』
  • 船艙號(Cabin):缺失數據量很大,缺失值填充為U,表示未知(Uknow)

填充完成後查看每列數據情況

3.2 特徵提取

3.2.1 數據分類

對於不同數據類型的特徵提取方法不同,對於數值類型的數據可直接使用,對於日期數據需轉換為單獨的年、月、日,對於分類數據使用One-hot編碼方法用數字代替類別。

1)數值類型:

乘客編號(PassengerId),年齡(Age),船票價格(Fare),同代直系親屬人數(SibSp),不同代直系親屬人數(Parch)

2)時間序列:無

3)分類數據:

a)有直接類別的:

  • 乘客性別(Sex):男性male,女性female
  • 登船港口(Embarked):出發地點S=英國南安普頓Southampton,途徑地點1:C=法國 瑟堡市Cherbourg,出發地點2:Q=愛爾蘭 昆士敦Queenstown
  • 客艙等級(Pclass):1=1等艙,2=2等艙,3=3等艙

b)字元串類型:從這裡面提取出特徵來,也歸到分類數據中

乘客姓名(Name),客艙號(Cabin),船票編號(Ticket)

  • 性別(Sex)

應用map()函數:

map(function, iterable, ...) 會根據提供的函數對指定序列做映射。第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。

  • 登船港口(Embarked)

1)pd.get_dummies()函數:用於one-hot編碼,Convert categorical variable into dummy/indicator variables;prefix參數指列名前綴

2)pd.comcat(objs, axis=0, join=outer)函數:實現series或者dataframe合併;

axis: 需要合併鏈接的軸,0是行,1是列 ;默認是0

join:inner得到的是兩表的交集,outer得到的是兩表的並集;默認是outer

  • 客艙等級(Pclass)

  • 字元串類型:從姓名中提取頭銜
  • strip()函數:用於移除字元串頭尾指定的字元(默認為空格)

  • 從客艙號中提取客艙類別
  • 匿名函數lambda:lambda 參數1,參數2:函數體或者表達式

  • 建立家庭人數和家庭類別

3.3 特徵選擇

相關係數法:計算各個特徵的相關係數

計算出所有變數之間的相關係數

我們這裡研究特徵與生存情況(Survived)的相關關係:

  • 根據各個特徵與生成情況(Survived)的相關係數大小,我們選擇了這幾個特徵作為模型的輸入: 頭銜(前面所在的數據集titleDf)、客艙等級(pclassDf)、家庭大小(familyDf)、船票價格(Fare)、船艙號(cabinDf)、登船港口(embarkedDf)、性別(Sex)

4 構建模型

4.1 建立訓練數據集和測試數據集

注意:之前為方便清洗數據我們將訓練數據集與測試數據集合併了,而在構建模型時我們需要將測試數據集拆分出來作為我們的預測數據集

4.1.1 交叉驗證

訓練數據集(記為source)將拆分為兩部分:訓練數據集(記為train:用於模型訓練)和測試數據集(記為test:用於模型評估)

4.2 建立模型

選擇一個機器學習演算法,用於模型的訓練,對於二元分類問題選擇較為簡單的邏輯回歸演算法

4.3 訓練模型

5 評估模型

模型的正確率為86%,表明模型擬合很好

6 方案實施

通過構建的模型導入預測數據集,得到預測結果,根據Kaggle給出的提交文件標準需要對預測結果進行數據格式轉換

將結果上傳至Kaggle,不出意外排名靠後,多多學習,優化模型選擇,提升排名。


Part 3 總結

第一次接觸Kaggle,過程比結果更重要,作為逐漸入坑的小白:

  • 最終要的是理清思路
  • 通過項目積累不同問題的處理方式,比如面對二元分類問題如何提取特徵,選擇邏輯回歸或者隨機森林等演算法
  • 碰到問題利用好Internet

推薦閱讀:

移動互聯網下半場剛剛開始,人工智慧就殺機四伏
中國手機ODM廠商實力如何?未來將何去何從?
想像一下未來的我們在吃什麼?這裡有一本書會告訴你
魯班,視覺生成引擎的應用
人工智慧時代,在身體里注入晶元就真的能擁有超能力嗎?

TAG:科技 | 泰坦尼克號電影 |