---
tags: ai4kids 全華出版品系列第一冊
title: kaggle
slideOptions:
transition: fade
theme: white
---
# 六、國際AI競賽走一遭
經過前面幾個章節的學習,同學目前對於機器學習已經有了初步的認識,現在同學可能也躍躍欲試,想要投入機器學習的領域成為專家,很想要拿一個題目來練習。
但是首先會遇到的就是到底要做甚麼題目、挑選甚麼題目的思考;就算同學心裡頭已經有了一些題目的候選選單,但是也會懷疑這個題目難易度適不適合,會不會讓我們有很大的挫折,包含了能力與時間的挫折?或者這個題目訂的對不對?
我們建議同學在繼續學習同時前往成為資料科學家或人工智慧工程師之路邁進中,可以一邊學習一邊作一些題目一些專案。
這裏我們整理了一些可以供參考的執行專案或解題的程序。
底下,我們列出四個建議,給想要投入機器學習專題或競賽的同學參考,
**1.) 定義問題**:
目前大部分機器學習的應用都是分類工作與回歸工作,也就是都是具備有標籤資料的監督式學習。
如果我們設定的工作是在解一個設計好的題目,我們的工作就是讓機器學習能夠學習出資料與標籤之間的關聯性,也可以說機器學習是在處理資料、把資料準確地轉化成為目標標籤的一員。換句話說標籤是牽引資料與機器學習前進方向的指標。
如此一來我們會明白到我們一直都是在學習演算法、學習用演算法去解題,卻太少關心 "標籤是題目的方向" 的這個重要議題。
所以當我們不單純只是在考試時候驗證我們對演算法的理解與純熟度的時候,而是當我們想要把機器學習的知識應用到生活,幫助生活中的事物,可能會發現題目的定義與標籤的決定都是非常重要的事情。
所以我們第一個建議就是,同學在學習完前面的五個章節後,要應用我們的技能來解決生活中的題目時,需要動腦思考:
- 我們想要解決的問題到底是甚麼問題,
- 解決這個問題到底是需要甚麼答案(通常也就是標籤),
- 需要哪些資料?然後資料要哪裡來?標籤資料要如何產生?
藉由這些思考與反問來正確地定義問題、設定標籤與如何評估衡量結果才能有效地解決我們的問題。
而正確的定義問題就是入手機器學習專案的第一步。
另外,在尋找題目時,甚至是設計題目之前,同學最好能思考為什麼要作這個題目,動機是甚麼,
- 是有趣?
- 有用或者有貢獻?
- 還是可以解決自己或親友遭遇的問題?
- 又或者是單純為了練習為了競賽?
我們認為找到一個有動機的題目,會幫助你在學習與解題中把問題解得更好、學習得更好,同時也比較能持續。
我們也建議先從一個簡單有趣的題目開始。
**2.) 理解問題**
在前一個挑選題目設計題目過程中,我們還建議同學能夠思考兩個問題,
1. 我對題目很了解嗎?
2. 我是這個領域的專家嗎?
上述的第一個問題,多多少少在第一個步驟中有思考到,所以才能設計題目、決定標籤與資料收集,但是如果獨立出來思考,可能會更謙虛地重新蒐集資訊去驗證題目設計的專業性,同時,也可能會產生第二個問題的省思,我是不是這個領域的專家,我需不需與領域專家合作?
近期的機器學習被用在相當多的領域中,成果都十分出色,但是一些相對卓越的成果都是由領域專家與機器學習專家攜手合作才完成的。
在同學的專案設計中,可能無法聘請邀請領域專家的合作,但是同學可以多安排一些時間人力資源去作題目領域的研究。
**3.) 資料的收集與整理**
同樣的在第一個建議:定義問題時,對於問題的設計中有提到部分關於資料收集的想法。
這一個小部分就要來鎖定在資料來源上多作一些探討。
首先是如果決定自己收集資料,要考慮到兩件事,第一是資料收集以及標籤資料都要很花時間人力成本。
有人說,一個大型的機器學習的專案過程中,90% 的時間都花在資料收集、資料整理與資料標籤的製作。所以當我們察覺我們的專案中需要的資料非常多,請務必在進行資料收集前多花幾天時間再次確認這件事:我們對問題的理解與研究的程度能不能夠把所需的資料內容正確陳列清楚。否則等到資料收集完畢後,才發現還需要某些欄位的特徵資料,可能就要再多花上一倍的時間才能補齊資料。
也因為資料的收集與標籤需要大量時間,所以應該設計比較自動化與有效率的方法進行收集,比如利用電子感測器收集數位化的資料,或者PM2.5觀測台直接把資料時時刻刻填入電腦表格、又或者學習爬蟲程式上網收集。
當然在設計題目定義問題時,也應該多瀏覽網路世界,說不定我們需要的資料早就有人進行過了,甚至當初收集資料的人願意公開開放給大眾使用。
這裡有一些公開的資料網站,大家也可以多逛逛,除了可以尋找我們所需的資料,說不定也可以經由資料的研讀引發我們著手有趣的專案的機會。
- 政府資料開放平台 https://data.gov.tw/
- google 資料集去搜尋 https://datasetsearch.research.google.com/
如前面所述有了資料後還需要對資料進行整理,對於缺失或異常的資料作出判斷與處理。這些部分在本書中沒有介紹,不過在我們本章的第三節時,會有一個非常基礎入門的資料處理過程介紹。
**4.) 多練習多參加賽事**
學習機器學習或學習程式,都跟我們學習語言一樣,要多應用才能熟悉、通透。所以如果沒有很多專案實踐的機會,我們建議常常維持有一個賽事在手中練習。
國內有很多黑客松賽事 (Hachathon),國內外也有很多賽事網站,不過這些賽事與網站都比較少見到青少年參與。
在機器學習領域中還是入門等級的我們來說,想要參加這些賽事去拿到好名次爭取高額獎金可能有些困難。但是就學習的目的而言,這是十分有效而且更能成為專家的地方。
本章的第三節會介紹一個賽事(鐵達尼生存問題),透過簡短又基礎的二三十行程式,在賽事中已經有機會能夠站上總排比的前40%,我們鼓勵同學可以勇敢地來組隊參加這些賽事,一群人一起合作比較有趣。
在講述了一些專案的作法後,我們要來介紹全球最大的機器學習/資料科學競賽網站,Kaggle 網站、https://kaggle.com 。
## 6.1 Kaggle 網站介紹
我們現在就接續本章的前言,開始介紹Kaggle 網站。
最早 Kaggle是一家成立於澳洲的數據分析競賽網站,在 2011年的時候遷址到美國,漸漸發展成為全球最大的競賽網站,並且 2017年被 Google收購。
根據 Wiki 上的描述,"根據Kaggle官方提供的數據,Kaggle在全球範圍內擁有將近20萬名數據科學家,專業領域從計算機科學到統計學、經濟學和數學。"
Kaggle 常態性的與不同的公司或研究單位等合作舉辦競賽,提供獎金或其他報酬。吸引全世界的機器學習高手或資料科學家加入競賽、相互較量與學習。
根據維基百科 https://zh.wikipedia.org/wiki/Kaggle
**登入 Kaggle**
我們藉由網路連結 https://www.kaggle.com 初次進入 kaggle網站,可以透過三個子平台的介紹來認識 Kaggle的全貌以及主要的服務業務。
底下我們就分別對這三個子平台(競賽區、筆記本分享區以及資料集區)進行介紹。
**1.) 競賽區**:
在註冊並且登入 kaggle 網站 (https://www.kaggle.com)後,請按下頁面 左方的第二個小圖像(一個獎杯圖像)後,將會看到 Kaggle的網頁會如同下面的圖 1.所示,陳列出許多賽事,

##### 圖 1. kaggle 的競賽區會有需多種類的賽事。
圖 1.中我們會看到賽事分成上下兩個部分,上面是 "Your Competitions" 就是同學參加的賽事,同學第一次進來,這一區可能會是空的。
圖 1.下方就是 "All Competitions",這下方會有很多 Kaggle所提供的賽事供同學選擇參加。
這些賽事的難易度有所不同,我們可以將滑鼠移到畫面中央的 **" All Categories"** 旁的小三角形,停留在小三角形按下滑鼠右鍵展開下拉式選單,然後就可看到各式的題目種類,

##### 圖 2. 在競賽區競賽題目群上方點開種類的選單會看到多種類別可以選擇
這裡我們建議先從 **" Getting Started"** 或者 **" Playground"** 這兩類比較簡單、有趣的題目開始入門。
這裏我們先在**圖 2.** 中點選 **" Getting Started"** 就會出現這一個類別的題目 (圖 3.)。
每一個人的畫面出現的題目可能會有所不同,但是基本上 **" Getting Started"** 與 **" Playground"** 的競賽種類裡面的題目都比較容易上手。我們在第二節時會介紹幾個經典題目。

##### 圖 3. 在競賽區呈現的 **" Getting Started"** 競賽題目
**2.) 筆記分享:**
看完了題目後,我們要還介紹筆記本分享區 (Notebooks),這裡有非常多的寶藏,值得大家流連忘返。這一區也是我最喜歡的一個部分。
在我們進入 Kaggle網站後的任一網頁左側,除了剛剛看到的競賽區**Competitions**之外,也都隨時可以看到筆記分享區 **Notebooks**,也就是圖 3.左側的 **<>** 的小圖示,原本他的顏色應該跟所有小圖示一樣,但是因為我的點選,他會呈現藍色,這樣剛好可以讓同學看得比較清楚。真正點選後就會呈現圖 3.的畫面。
早期的 Kaggle分享文章稱為核心(Kernel),近期才改名字為**Notebooks**;所以很多在 Kaggle 打賽事的人還是很習慣的稱這些分享為核心 Kernel,而不是稱為筆記本 Notebooks。
不論是核心或筆記本,都是一些善心人士將自己的經驗、心得或者甚至是程式加上解說一起放上來,讓新手或其他參賽者參考,協助新手入門或者高手間的相互切磋。
也有一些賽事規定為核心賽事,規定所有成績上傳(第三節會介紹)的程式都必須以notebooks 的形式在 Kaggle 提供的網路環境跑過產出預測才能上傳成績,這些程式都是 jupyter notebook 格式的 python 或 R 程式碼,都可以直接以 notebooks 格式分享。

##### 圖 4. 進入了筆記本分享區,我們看到很多人的分享。
**3.) 資料集:**
如同競賽區 **Competitions** 與筆記本分享區 **Notebooks** 一樣,在我們進入了Kaggle網站後的任一個網頁左側都可以看到 Kaggle 的資料區 **Datasets**,左側由上數下來第三個小圖示,競賽區與筆記本區的圖是中間。
資料區擺放了很多資料,可以供大家研究,請大家自己瀏覽,這裏我們不多作說明。

##### 圖 5. 資料區可以找到很多資料!!
## 6.2 經典賽事介紹
### 6.2.1 經典題目介紹
上一節在介紹賽事時有提到選擇 **Getting Started** 或 **Playground** 的賽事會比較容易上手或比較有趣,我們這裡介紹幾個容易入門、有趣的賽事。
**1.) 怪異作者識別 Spooky Author Identification**
https://www.kaggle.com/c/spooky-author-identification
我們有兩個辦法找到這個賽事,
- 第一種方法是參考 6.1 節的圖 1. 上方有一個標示 “放大鏡與search字樣”的長吧,同學可以輸入 “Spooky Author Identification” ,就可以找到這個賽事,
- 第二種方法是直接在瀏覽器上方輸入 https://www.kaggle.com/c/spooky-author-identification。

##### 圖 6. 怪異作者識別競賽
進入這個賽事後,我們看見了圖 6.,這是在對整個題目作整體的概要說明 (Overview)。
底下我們將對這個畫面的內容作一些說明,
* 首先上圖的截圖畫面是在作總體介紹,描述題目 (Descrpiton),
我們利用 google 翻譯可以看到,這個賽事很有畫面地給競賽一個故事設定,他說,
"當我在燭光的房間裡匆匆忙忙地摸著手稿時,我以為自己做到了。沒有什麼能再傷害我了。我幾乎不知道在拐角處有最後的恐懼。丁!我的電話向我發出令人不安的通知。 Kaggle主持人中最恐怖的是Will,他分享了另一個數據洩漏的消息。“ ph’nglui mglw’nafh Cthulhu R’lyeh wgah’nagl fhtagn!”當我笨拙地放下未裝訂,怪異的書箱時,我哭了。頁面分散在整個處理室地板上。我將如何找出如何根據編寫它們的作者將它們重新組合在一起?還是他們永遠迷路了?等等,我想...我知道,機器學習!在今年的萬聖節遊樂場比賽中,您將面臨挑戰,以根據Edgar Allan Poe,Mary Shelley和HP Lovecraft的恐怖故事來預測摘錄的作者。我們鼓勵您(以現金獎!)在競賽的討論論壇和Kernels代碼中分享您的見解。我們指定了一些獎項來獎勵對社區特別有價值的內核和討論線程的作者。單擊此概述頁面上的“獎賞”選項卡以了解更多信息。"
* 如果我們繼續點選 Description (描述)下方的 Evalution ( 賽事評估方式) 會看到上面描述的獎金提供與計分方式的說明,
* 再往下去點選 Prizes(獎項) 可以看到這個賽事有兩個獎金:核心分享/筆記本分享投票獎金 20000美金,參與討論獎項 5000美金。總額 25000美金的賽事不是一兩個人獨得,而是拆分給多人,如何拆分地說明就在這個獎項區說明了,同學可以研究!
**2.) 鐵達尼生存預測** https://www.kaggle.com/c/titanic
在上一個跟萬聖節有關的怪異作品分類中,我們除了看到機器學習的題目,也稍稍感染了一點文學氣質與詭異氛圍,增加了一些趣味性,同時我們也藉由這個題目介紹了競賽的概要說明,**Overview**
接下來我們要藉由第二個經典題目 **鐵達尼生存預測** 來介紹題目資料資訊 **Data**。
首先讓我們想辦法找到題目所在,不論如同前面的辦法回到競賽區 (**Competitions**) 輸入關鍵字 "Titanic" 或者直接連結到這個網址 https://www.kaggle.com/c/titanic 都可以找到我們經典中的經典題目 **鐵達尼生存預測**。
在找到這個賽事,進入賽事網頁後,我們先點選中間行的第二欄的 **Data**,就會看到資料說明與下載。

##### 圖 7. **鐵達尼生存預測**競賽資料
上圖 (圖 7.) 的畫面是在說明資料的組成,
* 資料集:總共有兩個資料集
* 第一個資料集是訓練資料 (train dataset) 總共有891筆,每一筆資料有12個欄位:也就是每一筆資料都記載著一個相對應乘客的12欄資料。分別是乘客在題目中的++編號++、乘客在船難中的++存歿++、乘客搭乘++船票的等級++、乘客++姓名++、乘客++性別++、乘客++年紀++、跟該乘客一起++上船的兄弟姊妹與配偶總數++、跟該乘客一起++上船的直系親屬的總數++、乘客的++船票號碼++、購買的++船票價格++、乘客的++船艙編號++以及該乘客++登船港口++。
* 第二個資料集是測試資料集(test dataset),總共有417筆資料代表417位乘客,但是只有11個欄位資料,筆訓練資料少一個欄位,也就是沒有乘客在船難中存歿的欄位資料。
其實,測試資料集所缺少的欄位,是一個 ++存歿++ 欄位 (同學可以用 python 程式去比對,或等到下一節我們的介紹。),就是我們要藉由機器學習推測出來的資料,也就是去推估測試資料集中的人物在船難中是生是死。
所以我們要把 "訓練資料集" 當中的乘客存歿資料當作答案標籤 (label),利用其他欄位組成的訓練資料與這個欄標籤資料來訓練機器作好乘客的存歿預測;訓練好機器後,我們會餵測試資料集到機器去預估資料集裡乘客的存歿,最後存起來上傳。
下載這些資料的方法是在圖中的圖 7. 的畫面往下拉,一直到下圖(圖 8.) 的這個畫面後,接著點選右方的 **" Download All"** 到自己的電腦,解壓縮就可以有訓練資料集 (train.csv)、測試資料集 (test.csv) 還有上傳達案的檔案格式 (gender_submission.csv)

##### 圖 8. 下載鐵達尼生存預測的資料
**3.) 手寫數字辨識 Digit Recognizer** (**第三章的 Kmean?**)
https://www.kaggle.com/c/digit-recognizer/overview
仿造上述的過程,大家一起來看第三個題目: 要利用機器學習來解決手寫數字圖案。
這組手寫數字圖片資料集非常有名,叫做 MNIST,是公認電腦影像識別領域裡的 "Hello World" ("Hello World" 通常是各種程式語言學習過程中的第一個程式與第一個輸出的結果,所以稱為 "Hello World" ,也就是門必練習必經的範例。)
同學可以參考 http://yann.lecun.com/exdb/mnist/ 網頁的下方有一個表格,紀載著多種處理這個資料集的方法,有線性分類器、以及我們第四章介紹過的K近鄰演算法,然後可以觀察第三欄位的誤判率資料與搭配第四欄位資料內的年度,藉由這些資料了解機器學習這二十年方法的演進與成果的進步。

##### 圖 9. 手寫數字辨識是深度學習的入門題目
**4.) 房價預測 House Price** https://www.kaggle.com/c/house-prices-advanced-regression-techniques
前面介紹了三個題目都是作分類,這裡我們來介紹一個回歸的競賽題目。
這個競賽的訓練資料集總共有 1460筆房子的資料,每一筆資料都有81欄位資料,包含了一欄是該房子的房價,也就是這個題目的標籤(label)。
跟第二個題目對資料集地介紹一樣,我們是利用81欄位中的80欄資料去訓練機器讓機器學會推估房價那一欄的資料(label)。
由於欄位數多,我們就不多介紹,請同學自行在這個競賽的解說中研究。
### 6.2.2 推薦的筆記本
這個小節我們要來對前一節一些經典競賽推薦 Kaggle上的筆記本分享 **notebooks**。
首先要先說明,當我們進入了競賽頁面後會有兩個 **notebooks**區域,這兩個 Notebooks 區域到底有什麼不同呢?

##### 圖 10. 手寫數字辨識競賽的介紹頁面。
首先,不論我們身處 kaggle網頁的那一個頁面,我們都可以點選圖左側的 **Notebooks**,也就是左側的 **<>** 的小圖示,畫面會進入Kaggle網站裡頭所有競賽的分享 Notebooks 資料,這些分享是不分賽事的分享,也就是所有賽事的分享區。

##### 圖 11. 點選上放的 **Notebooks** 呈現的是所有競賽的分享筆記本。
接著,我們用連結到 https://www.kaggle.com/c/digit-recognizer 手寫數字辨識競賽,然後點選中間部分的 **Notebooks**,則陳列出來的筆記本都是關於這個競賽的分享筆記本。大家可以觀察 **圖 12.** 陳列的筆記本都跟手寫數字辨識(Digit Recognizer)賽事相關。

##### 圖 12. 從賽事介紹中的 Notebooks 進去的資料,都會是跟這個賽事有關的筆記本分享。
請同學回到上一小節的四個題目裡去找一些分享的筆記本,好好研究,參考別人的作法,學習如何進入 Kaggle 的賽事,甚至是從學習寫 **Notebooks** 分享開始,協助別人學習機器學習也是學習機器學習的一個方法。
底下我們也推薦幾篇比較簡易的筆記本給同學
1. 在鐵達尼號生存預測的競賽中,我們推薦這篇 Notebook,其中可以看到我們第四章教過的方法 KNN 只能獲得 80% 的準確率,而決策樹可以達到98%、隨機森林達到 96%,同學可以試著分析不同準確率的嗎?
https://www.kaggle.com/aamir222686/titanic-dataset-prediction
1. 在手寫數字辨識的題目裏頭,我們介紹這篇,作者採用的是隨機森林的方法,可以達到96%的準確率,
https://www.kaggle.com/arunmastermind/digitrecognition-randomforest
1. 在房價預測的題目中,我們建議同學研究這一篇
https://www.kaggle.com/dansbecker/submitting-from-a-kernel
對於怪異作者識別 Spooky Author Identification這個競賽,我們沒有推薦分享的筆記,原因在於作這個題目需要有自然語言模型的知識,目前我們沒有介紹過自然語言模型,所以就沒有推薦的筆記本。至於沒有學過自然語言模型卻介紹題目的原因,是希望提同學能夠看到多一些不同的機器學習類型!
## 6.3 Kaggle 資料上傳與排名: 鐵達尼號範例程式解說
這一章裏頭,我們介紹了很多 Kaggle的內容,同學應該有了一些概念、對Kaggle 有了一些的認識。但是光聽不練,可能還是有模糊的成分,所以我們馬上來一起實作一個題目,可以讓同學完全熟悉 Kaggle競賽,同時也讓同學從此有了Kaggle成績,這是一件很酷的事。
手續有點瑣碎,同學第一次操作,要有耐心,只要有耐心,一步一步地跟著作,一定可以完成。
開始前,請同學先進入 https://www.kaggle.com 登入 Kaggle 網站,沒有 Kaggle 帳號的同學,請先註冊一個帳號。
我們建議大家都用 google 帳號去註冊 kaggle 帳號,會比較簡單不複雜。
也就是我們這一節的手把手操作,會需要有 google 帳號來啟動 google 雲端硬碟與 kaggle 帳號。
### 6.3.1 了解題目與下載資料
關於鐵達尼生存預測的題目,我們在上一節中有介紹,這裡就不再贅訴。
同學登入了 kaggle 後,再請同學連結 https://www.kaggle.com/c/titanic/data 進入鐵達尼號生存問題競賽的資料區,將網頁往下捲動到如下圖的部分,點選右方的全部下載 (Download All),就會把資料用壓縮檔的格式傳送到你的電腦。

##### 圖 13. 按下中間排右方藍色字樣的 Download All,把三個資料一起下載。
下載後,我們可以在我們自己的電腦的下載區解壓縮剛剛下載的 titanic.zip 檔,


##### 圖 14. 上圖可以看見我們下載了 titanic.zip;下圖經過解壓縮後,我們會有一個 titanic 的資目錄。
進入titanic 的子目錄後,會看見三個檔案,其中的train.csv 與 test.csv 就是我們的資料檔案,gender_submission.csv 是一個回傳推估答案的格式檔。
這三個檔案的應用與介紹都會在後面說明。

##### 圖 15. titanic 子目錄的內容。
### 6.3.1 Colab 環境準備與設置
在本書附錄二介紹了用 Colab的環境來寫 python程式,現在即要使用 Colab 的環境進行這次的鐵達尼號的解題。
首先,請依圖 16.1 ~ 圖 16.3 的指示,在自己的google 雲端印碟裡開一個子目錄,同時把子目錄命名為 kaggle (全部小寫)。

##### 圖 16.1 進入 google 雲端硬碟的根目錄按下新增。

##### 圖 16.2 在新增選單中點選資料夾。

##### 圖 16.3 在跳出的窗框中填入 kaggle (全部小寫),然後按下建立按鈕。
接著請同學再跟著圖 16.4 ~ 16.9 的說明,一步一步的把資料上傳到雲端硬碟裡剛剛建好的 kaggle 子目錄。


##### 圖 16.4 (上圖)然後你會在你的雲端硬碟裏頭看到新建立的子目錄: kaggle,請點選 kaggle,(下圖)點了 kaggle 後,我們就進入這個剛建立好的子目錄,我們要來把個人電腦裡的資料傳到這裡。

##### 圖 16.5 接著我們在畫面上點選圖 15.4左上方的新增,會出現這個畫面。這次我們選擇資料上傳。

##### 圖 16.6 畫面會跳出我們自己的電腦的檔案管理的畫面,資料有可能在下載區,或被我們移動到其他的檔案夾裏頭。我們剛剛是把資料從下載區移到了文件區,所以我們到文件區裡的 titanic 子目錄裏頭尋找資料。

##### 圖 16.7 選擇要上傳到 google 雲端硬碟的檔案,同學可以一次選三個,然後按下右下角的 **"打開"**;同學也可以一次一個上傳,如果是一次一個上傳,就要多做幾次圖 15.5 與圖 15.6 的動作。

##### 圖 16.8 當我們在圖 15.7的檔案管理區選完檔案,按下了打開或上傳鍵後,檔案管理區就會消失,我們又會回到圖 15.4 的雲端硬碟的 kaggle 子目錄工作區,下方會出現這個圖指示檔案正在上傳中。

##### 圖 16.9 當資料檔都上傳了之後,我們可以在我們的 kaggle 子目錄下看到三個資料檔。
同學完成上面的操作後,每一個同學的雲端硬碟的畫面都要跟圖16.9一致,也就是ˊ中間顯示路徑的資訊是 **我的雲端硬碟 > kaggle**
,檔案區都要有 train.csv, test.csv 以及gender_submission.csv 三個檔案。
只有上述操作正確,把資料放到對的路徑,下一個小節的程式才能找到這些檔案,才能完成程式的運作。
### 6.3.3 程式
接著我們要開啟 colab,請同學在圖16.9 的畫面中按下左上方的新增(如同圖 16.4與圖 16.5的步驟),會跑出圖 17.1 的選單。
然後接著圖 17.2, 17.3 來開啟一個 colab 程式。

##### 圖 17.1 我們在 kaggle 子目錄下按下新增,會有選單出現。這次我們要點選更多。
.

##### 圖 17.2 在圖 17.1按下更多後,會再次展開更多的選項,我們點選 "Google Colaboratory" 的選項。
.

##### 圖 17.3 這時候我們就進入了 colab 的程式環境。
【開始程式編寫】
首先,讓我們仿造第三章的介紹的 colab 操作內容,先裡用 google.colab 套件把 colab 與你的雲端硬碟對齊(連接),請輸入下面的程式,
```
from google.colab import drive
drive.mount('/content/drive/')
kaggle_dir = 'drive/My Drive/kaggle/'
```
##### 上方是程式第一格
執行這一格後,我們的路徑變數(一個字串變數)就會存放了我們雲端硬碟裏頭 kaggle 子目錄的路徑。
接著我們的程式會用到試算表與資料框的功能,所以要匯入 pandas 套件;也會用到矩陣的功能,所以要匯入 numpy 套件,然後會用到一個叫作標籤編碼的功能,所以我們從 sklearn.preprocessing 中匯入 LabelEncoder 的功能。
```
# 載入會使用到的套件
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
```
##### 上方是程式第二格
有了上面的套件與功能的匯入後,我們的程式區就具備了基本的資料運算與資料處理的能力,我們就可以開始寫程式了。
【匯入資料】
我們的資料存放在 我的雲端硬碟下的 kaggle 子目錄,我們已經在第一格中存放了這個路徑在變數 kaggle_dir裏頭,我們現在就可以拿來使用。
1. 首先,我們用 pd.read_csv來把 train.csv 放進 titanic_train 的變數裏頭。
這是我們第一次正是使用 pd.read_csv,但是我們可能會很快上手,原因是他很直覺,pd/pandas 是處理試算表的套件,他的子功能 ^*^ read_csv 更是直覺,英文就是直譯成讀取 csv 檔。
對了,要補充一下 csv 是excel 的一種格式,也是一種試算表格式,所以要用 pd/pandas 套件的功能。
1. 接著我們同樣用 pd.read_csv的功能來讀取測試資料。
2. 然後我們用 titanic_train.shape 搭配 print 來印出訓練資料的筆數與特徵值
```
# 利用 pd.read_csv 把資料載近來用,利用 df_train.shape 觀察資料的筆數與每一筆的特徵值數目
titanic_train = pd.read_csv(kaggle_dir + 'train.csv')
titanic_test = pd.read_csv(kaggle_dir + 'test.csv')
print(f'訓練資料的筆數與特徵值數目:{titanic_train.shape}')
print(f'測試資料的筆數與特徵值數目:{titanic_test.shape}')
```
> 訓練資料的筆數與特徵值數目:(891,12)
> 測試資料的筆數與特徵值數目:(418,11)
##### 上方是程式第三格與他的輸出
【為什麼會少一個欄位】
拿到資料,要先了解資料,尤其是上一格的輸出中發現訓練資料有 12個特徵值,測試資料有11個特徵值,我們相信測試資料缺少的欄位應該是我們要預測的目標,也就是標籤。所以我們用下面兩行來觀察訓練資料與測試資料欄位
```
print(list(titanic_train))
print(list(titanic_test))
```
>['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked']
['PassengerId', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked']
##### 上方是程式第四格他的輸出
可以發現訓練資料集除了資料筆數多,而且每一筆資料都比測試資料集多一個特徵,也就是多了一個叫作 存活與否 ('Survived')的特徵/欄位資料。
這是很合理的,我們訓練時會有一個類別標籤資料(label data)協助機器學習訓練過程中知道推測對不對,根據推測的答案跟類別標籤答案比對來進行修正,讓機器的推測能力愈來愈高愈來愈好愈來愈精準。這些都是在學習過程中的動作。
所以我們把原始的資料利用下方的程式碼拆解成為 訓練資料train_x與訓練資料標籤集 train_y
```
# 資料集比測試集多一個特徵值,Survived,這個就是我們訓練集的標籤
train_y = titanic_train['Survived']
# 我們把訓練資料中的存活與否 ('Survived')這一欄摘選出來,存入了 train_y 這個變數裡。
ids = titanic_test['PassengerId']
# 我們把測試資料中的乘客編號的欄位 ('PassengerId')這一欄摘選出來,存入了 ida 這個變數裡。這個跟最後的上傳格式有關!
train_x = titanic_train.drop(['PassengerId', 'Survived'] , axis=1)
# 我們在作機器學習時,訓練資料通常有資料本身跟標籤資料,所以我們決定將訓練資料裏頭的標籤資料丟掉,將資料放進 train_x。
# 也就是我們有 train_x 存放資料,train_y 存放類別標籤。
test_x = titanic_test.drop(['PassengerId'] , axis=1)
# 其實在製作 train_x 時候,我們也把乘客編號PassengerId 丟掉,因為沒有用處,我們訓練資料與測試資料的特徵也就是欄位必須保持一致,所以測試資料也是把乘客編號PassengerId 丟掉。
df = pd.concat([train_x, test_x])
# 這裡,我們用一個 concat 的功能,把訓練資料與測試資料串在一起,前面的 891 筆資料就是訓練資料,後面的418筆資料就會是測試資料,這樣的串接功能,會讓筆數增加,但是欄位會是一樣不變,都會是 10個欄位對齊。為什麼要作串接呢? 等我們作了特徵工程再來說明。
df.head()
```
##### 上方是程式第五格
當資料切割完,整理好之後,如果同學花時間一筆一欄的檢查,將會發現有很多資料是空的,空的資料送進機器學習的模型很可能會被打槍,會讓模型傻掉不知道如何反應。這一類沒有缺失的資料,我們稱為缺失值。
除了資料遺失或當初沒有填寫的資料,讓資料空白之外,我們還面臨一個很大的問題,就是電腦程式看不懂文字符號,電腦程式只認得數值,如果要讓電腦程式能夠運作,文字型資料在送進電腦程式前就要先作編碼處理,比如說,如果我們要作一個剪刀石頭布的類別輸入,我們可以把剪刀編成 0, 石頭編成 1, 布編成 2,這樣就可以送進去讓程式處理了。
| 原始資料 | 第一種編碼 |第二種編碼|
| ------------------------ | ---------- |----|
| 剪刀 | 1 | 001 |
| 石頭 | 2 | 010 |
|布 | 3| 100|
|電腦不懂|電腦很熟|電腦很熟|
在下面的程式中,我們首先把乘客人名去掉,因為我們假設乘客生存與否跟姓名無關。
然後我們檢查我們每一個欄位,如果該欄為是一個物件變數(object) 也就是說該欄位特徵是一個字串不是數值,我們必須要編碼。 底下的程式中的 le.fit, le.transform 都是在作編碼的工作。
除了編碼,我們也要把缺失值補上值,才不會讓電腦傻掉不知道如何處理。
補值的動作是由 fillna 來進行。
當我們偵測到欄位是物件型式的資料,他的缺失值一律標示為 "None",也是補文字型的資料。
當我們偵測到欄位不是物件型式的資料,他就是是一個數值型資料,可能是整數,或者是有理數等,我們就把他補成數值 0。
"None" 跟 0 都是你可以決定的,比如你不想要補 0,想補 -1,也是可以的。
我們在這裡有一個觀念,訓練資料補 0,測試資料也要補 0,否則當我們用補0值的訊練資料去教會機器學習判斷後,用補 -1值的測試資料去試驗機器能力,會讓機器的能力無法展現出來。
這也就是為什麼我們在進行資料處理、特徵工程之前,我們必須在第五格裡頭把訓練資料跟測試資料串接在一起的原因。
```
# 基本的特徵工程
df = df.drop(['Name'], axis=1)
le = LabelEncoder()
for c in df.columns:
if df[c].dtype == 'object':
df[c] = df[c].fillna('None')
le.fit(df[c])
df[c] = le.transform(df[c])
else:
df[c] = df[c].fillna(0)
df.head()
```
##### 上方是程式第六格
剛剛作特徵工程時,訓練資料與特徵資料,要編碼,大家的編碼原則要一致,要補空缺值,補的值也要一樣,我們說這樣訓練好的機器對測試資料的估測才會準。現在特徵工程作完了,訓練資料與測試資料的處理原則都一樣,我們就可以再次拆分他們,就有點像我們在第三章裡頭用train_test_split 來拆分資料的概念。
```
# 資料重新切割成訓練與測試集
train_x = df[:train_num]
test_x = df[train_num:]
```
##### 上方是程式第七格
【跟第三章比較,少了一組資料!!】
我們現在有 train_x, train_y, test_x 基本上我們就可以仿造第三章的動作來建模型,作預測。
同學會疑惑,跟第三章比較,我們沒有 test_y,怎麼辦?
這是不打緊的事情,沒有 test_y 我們只是無法知道模型對於 test_x 的估測準確度,但是模型還是可以對 test_x 作出估測值,至於要如何知道我們對 test_x 的估測準確隊呢?就是把估出來的值上傳給 kaggle 來評分了!
好了,這個題目我們用一個叫作羅吉斯回歸 (Logistic Regression) 的線性模型來處理,對於羅吉斯回歸有興趣的同學,請自行上網搜索研究。不過要強調的是,羅吉斯回歸雖然名字裏頭有回歸兩個字,但是他是一個分類模型,一個分類器!
```
from sklearn.linear_model import LogisticRegression
estimator = LogisticRegression()
estimator.fit(train_x, train_y)
pred = estimator.predict(test_x)
```
##### 上方是程式第八格: 產出我們的估測答案!存放在 pred 裏頭。
```
# 提交檔生成
sub = pd.DataFrame({'PassengerId': ids, 'Survived': pred})
sub.to_csv(kaggle_dir +'titanic_baseline.csv', index=False)
```
##### 上方是程式第九格,執行後會在我們的 kaggle 子目錄產生一個 titanic_baseline.csv 的檔案,這個就是我們要上傳給 kaggle 的答案券!

##### 圖 18. 程式執行完畢後在 我們的雲端硬碟的 kaggle子目錄下產生了答案檔案: titanic_baseline.csv
## 存進雲端硬碟,我們將這個檔案下載到自己的電腦
在圖 18. 的畫面下,將滑鼠移到 titanic_baseline.csv 檔案,按下右鍵,在出現的選單中點選下載,將資料下載到同學電腦的下載區中 (如果不是存放在下載區,同學一定要記下路徑位置)

### 6.3.4 將資料上傳到 Kaggle
現在我們回到 Kaggle 的畫面,比如圖 12. ,我們按下左方的 **Submit Predictions**

##### 圖 20. 回到 kaggle.com/titanic/data, 跟圖 13.一樣的鐵達尼生存預測競賽的資料區,這次我們要點選繳交預測 Submit Predictions
#### 在按下 Submit Prediction 後顯現的畫面中,往下拉到可以上傳的畫面,點選中間的上傳符號 (如下圖,圖21),可以在自己的電腦中找到剛剛的答案檔案 titanic_baseline.csv,將他上傳到 kaggle (圖 22)

##### 圖 21. 預測檔案上傳區。

##### 圖 22. 資料上傳中,可以看見中間的藍色長條顯示上傳狀態,它的上方也有一行已 uploading開始的小字,表示還在上傳。
## 等待完全上傳後,按下 Make Submission

##### 圖 23. 上傳後,再確定繳交 (Make Submission) 後,kaggle 就會開始估測你的成績,然後顯示你的成績。
再上圖的綠色長條的左下方,有一行藍字, ++jump to your position on the leaderboard++,按下這一行小字,會跳到我們的排名。

##### 圖 24. 成績排名。
5940/15837 排名在 前 40% 感覺還可以。
其他的演算法成績,看起來我們學過的 KNN表現得不算理想,隨機森林(rf) 還可以。



##### 圖 25. 其他演算法/模型的成績,有上而下分別是: KNN,隨機森林與 xgb
## 6.4. 章節回顧
當作本書的最後一章,我們在本章一開始提供給想要進行專案的同學一些建議,分別是:
1. 定義問題、
2. 理解問題、
3. 資料的收集與整理、
4. 多練習多參加賽事。
前三個建議基本上跟機器學習模型的專長沒有太多相關,反而是比較形而上的題目意義討論以及比較事務性比較實際的專案執行的清晰度的思考,第四項就是建議同學要常常練習、要常常處在機器學習與資料處理的環境中。
接著,我們延續這四個建議中最好實踐項目,第四項開始介紹 Kaggle,透過我們的介紹,同學不再僅僅認為 kaggle只是一個提供題目與獎金的網站,同學可以了解我們可以找到很多資料還有大家的技術分享,這些都是我們可以獲得更多學習與精進的地方,同時跟著國際高手交流以及了解題目關注趨勢也可以讓同學國際接軌。
為了降低進入 kaggle的門檻,我們也介紹了 getting started 與 play ground 兩組類別題目以及四個入門題目,最後更是深入的手把手帶同學實際操作鐵達尼存亡預測題目,從進入賽事網頁到成績上傳,確保大家能夠進入 kaggle賽事也獲得成績紀錄。
雖然步驟很多,有點煩雜,但是卻是很有成就的工作。
總結,本章的內容與同學學到的事物有,
* 正確認識專案的執行態度與發法
* kaggle 的三種服務:賽事、技術分享、資料集
* 賽事參與的步驟
程式
https://drive.google.com/file/d/1ElPvERJeBpYOU9-ee_LcPt__QuZPKoDe/view?usp=sharing