Python 機器學習 入門新手篇 Kaggle鐵達尼號生存預測 教學

文章分類:程式開發
發布日期:2019-01-11 00:00:00
背景自己筆記紀錄一下…本篇用實務範例帶大家如何操作及學習,針對第一次想學機器學習的人,適合稍微有一點點程式基礎的人閱讀我的開發環境為 Python 3.7 + 虛擬環境 venv一、環境建置安裝完 Python 之後先從環境建置...
封面圖片

背景

自己筆記紀錄一下…
本篇用實務範例帶大家如何操作及學習,針對第一次想學機器學習的人,適合稍微有一點點程式基礎的人閱讀
我的開發環境為 Python 3.7 + 虛擬環境 venv

一、環境建置

安裝完 Python 之後
先從環境建置開始教起

1.1 創建虛擬環境

創建名為 t_venv 的虛擬環境

python -m venv t_venv

1.2 切換虛擬環境

切換到虛擬環境

t_venv\Scripts\activate

切換成功會在前面顯示(t_venv),例如:(t_venv) D:\python\t_venv

1.3 安裝套件

再來是安裝所需的套件
在安裝之前記得把 pip 升級一下

python -m pip install -U pip
pip install pandas
pip install -U scikit-learn
pip install jupyter

套件說明:

  • pandas:幫我們做資料預處理
  • scikit-learn:機器學習套件
  • Jupyter:提供 Web 介面,可以在瀏覽器直接撰寫程式,方便我們分析資料 (選用)

1.4 開啟 Jupyter

jupyter notebook
運行成功後會自動開啟 localhost 網頁

二、資料預處理/資料分析

2.1 下載資料

下載所需的鐵達尼號資料,我們可以到 Kaggle 這網站,我們這次練習主題是鐵達尼號,先把下面兩個 CSV 檔載下來

  • train.csv (訓練集)
  • test.csv (測試集)

放到我們的開發目錄
例如筆者的目錄位置在 D:\python\t_venv
就放到這個資料夾裡
我們用 EXCEL 打開 CSV 檔,分別有以下這些欄位:

  • PassengerId 乘客編號
  • Survived 是否倖存
  • Pclass 船票等級
  • Name 乘客姓名
  • Sex 乘客性別
  • Age 年齡
  • SibSp 堂兄弟妹
  • Parch 父母與小孩
  • Ticket 船票號碼
  • Fare 船票價格
  • Cabin 船艙
  • Embarked 登入港口

2.2 資料載入

接著在 juypyter localhost 網頁的右上角 “New” 按鈕,新增新的 “Python3” Notebook
先把所有有用到的套件引入進來

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier ## 隨機森林
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

這次教學是使用隨機森林

2.3 基本欄位查看

使用 info(),可以看到有許多欄位有缺失值

train.info()
test.info()

我們看到 Age、Cabin、Embarked、Fare,這些欄位都有缺失值

2.3 Age 年齡

使用中位數來填補缺失值

train["Age"] = train["Age"].fillna(train["Age"].median())
test["Age"] = test["Age"].fillna(test["Age"].median())

2.4 Sex 性別

male 男性轉為 0
female 女性轉為 1

train.loc[train["Sex"] == "male", "Sex"] = 0
train.loc[train["Sex"] == "female", "Sex"] = 1
test.loc[test["Sex"] == "male", "Sex"] = 0
test.loc[test["Sex"] == "female", "Sex"] = 1

2.5 Fare 船票價格

使用中位數來填補缺失值

train["Fare"] = train["Fare"].fillna(train['Fare'].median())
test["Fare"] = test["Fare"].fillna(test['Fare'].median())

2.6 Embarked 登入港口

將缺失欄位都設為 S 港口

train["Embarked"] = train["Embarked"].fillna("S")
train.loc[train["Embarked"] == "S", "Embarked"] = 0
train.loc[train["Embarked"] == "C", "Embarked"] = 1
train.loc[train["Embarked"] == "Q", "Embarked"] = 2
test["Embarked"] = test["Embarked"].fillna("S")
test.loc[test["Embarked"] == "S", "Embarked"] = 0
test.loc[test["Embarked"] == "C", "Embarked"] = 1
test.loc[test["Embarked"] == "Q", "Embarked"] = 2

三、預測結果

3.1 訓練集分數

預測特徵宣告

predictors = ["Pclass", "Sex", "Age", "Fare", "Embarked"]

使用隨機森林

RFC = RandomForestClassifier(random*state=2,n_estimators=100,min_samples_split=20,oob_score=True)
RFC.fit(train[predictors], train["Survived"])
print(RFC.oob_score*)

得到 oob score 為 0.8271604938271605,看似不錯呢…

3.2 Kaggle 分數

我們將測試集的結果保存到 submission.csv
然後將這 CSV 檔案上傳到 Kaggle

pred = RFC.predict(test[predictors])
submission = pd.DataFrame({
"PassengerId": test["PassengerId"],
"Survived": pred
})

submission.to_csv('submission.csv', index=False)
最後在 Kaggle 得到的分數為 0.76555 ( 落在 Top 68%左右)

這結果也不意外,我們只做簡單的處理而已…
要提升準確度,勢必要在特徵欄位多做一些處理
(待補程式執行圖)

後記:

這些都只是實務操作應用而已,真正難的是背後理論基礎…
像是為什麼要這麼做等等…
希望大家看完本篇內容都能有點收穫!

未完待續:

建立好模型之後,我們當然能希望能夠實際上有所應用…
下一篇預告(六月左右更新):為模型建立 WEB API (以鐵達尼號為範例)