Azure Machine Learning 分享 @ CS+X

上禮拜二 (11/15) 回台大擔任 CS+X 社團系列講座第一場的講者,題目是「利用 Azure Machine Learning 輕鬆預測」,在短短的一個半小時和大家分享機器學習的基本觀念還有好用的平台工具,也趁這難得的機會把分享內容跟一些心得整理下來和大家交流分享。

當 CS 遇上 X

什麼是 CS+X? CS+X 是希望透過結合電腦科學 (Computer Science) 以及專業知識領域 (X) 培養跨領域的人才,透過 CS 的知識解決其他專業領域的問題,目前在台大在共同教育中心開設了 CS+X 的學分課程,也另外成立了 CS+X 社團,每個月會辦講座以及工作坊的形式,讓非電資理工科系的同學可以掌握資訊領域的基本概念,進而用在其他專業領域上。CS+X 社團約一個月多前正式成立,一群熱血的老師及幹部馬上熱血籌辦系列講座跟工作坊,所以才有了這次的講座。

CS+X 月月系列講座(一) Machine Learning

這次分享的是機器學習 (Machine Learning) 的基本概念以及如何利用 Azure Machine Learning Studio 快速嘗試機器學習的實驗。

首先我們看一個很經典的數據集 (dataset) --鐵達尼號,裡面包含了當年遇難者1514人其中891筆資料,包含最後生還與否、年齡、性別、姓名、艙等等等。我們想要嘗試透過機器學習的方法預測出其他乘客、或是假想如果當年我們也在船上能否生還。

首先可以透過這個網站來做一些簡單的測試,輸入乘客資料後便可以預測生存的機率。它是怎麼做到的呢? 背後是利用資料集裡面乘客的各項數據來訓練模型,模型可以描述這些資料,同時也能對我們輸入的數據做出預測。透過已知資料訓練模型,來對預測未知的資料進行預測,這正是機器學習的精神。這邊我們稱資料集裡面已知的資料為訓練資料(training data),而沒看過的資料則為測試資料(testing data)。

依據手上的資料以及想要解決的問題,我們常將機器學習問題分成以下三類:

  1. Classification 分類
    當手上的資料跟以及要回答的答案是某個已知的類別,通常會再分為只有兩類問題的 binary classification 跟多纇別的 multi-class classification。
  2. Regression 迴歸
    當手上的資料跟以及要回答的答案是一個數值,這時就會是迴歸問題。例如:明天的氣溫、某間公司的股價等等。
  3. Clustering 分群
    如果資料沒有明確類別 (label),依然可以照他們的特徵表現將行為相似的資料分成一類。
    最常見的演算法是 K-means,首先要決定好要分的群數 k,演算法會隨機挑 k 個點作為資料群中心點,接著將所有資料點依照離各資料群中心的距離,歸類成距離中心最近的該群資料,再重新找出各資料群的中心點,如此便完成一輪,一直跑直到資料群收斂不再改變或是足夠多輪時便結束得到最後分群的結果。

Azure Machine Learning Studio

這裡我們用 Azure Machine Learning Studio(以下簡稱 AML Studio) 作為機器學習範例的平台,為甚麼選擇它呢? 因為透過AML Studio 我們可以透過元件拖拉的方式快速處理資料、建立模型進而發布成應用,對於初次接觸機器學習或是程式設計的朋友相對容易入門,而對於有一定基礎的朋友也可以透過這樣的工具加速驗證想法,甚至可以更進階地加入 Python 或 R 腳本來更可製化自己的數據實驗。

同時可以在 Cortana Intelligence Gallery載入官方的示範案例,或著將自己的發佈到分享實驗。

透過 AML Studio 的實驗流程大概如下:

  1. 下載並檢查資料 Data Inspecting
    我們從 Kaggle 官網下載 Titanic Dataset ,train.csv 裡面總共891筆乘客資料,包含以下欄位:
欄位 性質 描述
PassengerId numeric(not used as feature) 在資料集裡面我們給的編號
Survived categorical label 乘客最後生還與否 (0=罹難; 1=生還)
Pclass categorical feature 艙等 (1=頭等艙; 2=商務艙; 3=經濟艙)
Name string 乘客稱謂及姓名
Sex categorical feature 性別 (0:男性 / 1:女性)
Age numer feature 年齡
SibSp numeric feature Sibling + Spouse,同行兄弟姊妹以及配偶的總數
Parch numeric feature Parent + Children,同行父母以及小孩的總數
Ticket string(not used as feature) 船票編號
Fare numeric feature 總共支付的費用
Cabin string(not used as feature) 船艙座位
Embarked categorical feature 上船地點 (C=Cherbourg; Q=Queenstown; S=Southampton)
  1. 資料預處理 Data preprocessing
    若資料沒有做過適度的預處理直接丟下去訓練模型,除了資料格式的問題,也可能會數據缺失 (missing data) 或是雜訊 (noise)等等問題。我們發現這個資料集欄位中有不少缺失,過於嚴重的欄位包含 Cabin 及 Ticket 選擇直接拿掉不用。而像是 Name 較不具鑑別度的欄位我們也是直接拿掉。另外,Age 欄位有將近 1/4 的資料沒有資料,但是 Age 相對有重要性而也不可能拿掉那 1/4 的資料,因此在這邊我們把遺失的欄位補上平均的年齡作為訓練資料。
    P.S. 一般而言姓名與生存機率並無太大相關,而且將姓名作為特徵一起訓練也非常容易造成過適 (overfitting),例如決策樹中可能會出現名叫 Rose 的都會存活等等。值得注意的是直,Name 欄位包含特殊稱謂例如 Captain 船長等可能與存活機率有關的稱謂,在這邊就暫時不討論而把姓名欄位刪除。

    • 作法
      將下載來的 train.csv 檔上傳到 AML Studio dataset,開啟新的實驗 (experiment) 便可以直接拉進資料集。
      透過"Select Columns in Dataset" 把 Cabin、Ticket、Name欄位拿掉。“Clean missing data” 把年齡遺失的欄位補上平均年齡,再透過"Edit metadata"元件,把Survived、Pclass、Sex、Embarked這些特整該為類別(categorical)欄位。以上步驟便完成了資料預處理,得到乾淨的資料集。
  2. 模型建立 Model Training
    在這個例子中我們要預測的是乘客最後的生還與否,屬於二元分類 (Binary Classification) 的問題,在 AML Studio 中共有10幾種模型提供直接使用,模型的選擇可以參考這篇文章,針對不同的特徵數量及屬性選擇適合的模型。這邊我們先使用 Two-Class Logistic Regressin 作為例子來訓練模型。

    • 作法
      這邊我們保留 80% 的資料作為訓練用,剩下 20% 保留作為測試模型表現用。因此拉進 “Split Data” 元件,將資料依比例分成兩類。
      把 Initialize model 與 training data 連上Train model 元件,便可以開始訓練模型,訓練完的結果可以在 Train model 按右鍵視覺化出來,如下圖:
  3. 模型表現評估 Model Evaluation
    透過 Evaluation Model 我們可以拉近 Score Model 的結果視覺化呈現,或是拉進並同時拉進至多兩個 Score Model 的結果進行比較,點進 Score Model 可以看到多了兩個 label 及 label probablity。以分類問題為例,Evalation Model 幫助我們直接得到 Accuracy、Precsion、Recall 甚至 f1 score 等等資訊,同時可以畫出混淆矩陣 (Confusion Matrix),二元分類的 ROC 曲線等等。

    • 作法
      在 “Evaluated Model” 右鍵選擇 “visualize” 視覺化模型的表現,如下圖包含 ROC 曲線、Accuracy、Precision、Recall、F1 score 等等數值。
  4. 發佈應用 Deploy to web service
    比較過不同模型的表現後,就可以選擇表現較好的模型發布成應用,AML Studio 可以將模型發布成 web service 讓自己的 app 可以透過 HTTP Request 的方式將資料上傳,得到回傳預測的結果。

    • 作法
      當我們選擇好最終要使用的模型,選擇以後點選 “Set Up Web Service”,這時候會把 data preprocessing 相關元件變成 transformation、把 train model 相關元件變成 trained model,畫面中會出現 “Web service input” 及 “Web service output”。

    重新 Run 一次點選 “Deploy to web service” 便會跳到 Web Service 的頁面。我們可以透過 Request/Response一次處理一筆資料或是透過 Batch Execution 配合 Azure Storage 上傳大量資料批次處理。網頁上可以看到透過C#、python、R 等語言將資料整理成 json 格式透過 HTTP request 取得模型預測的結果。

透過以上這些步驟,我們便做完了一個完整的機器學習。從資料的預處理、模型訓練、評估模型表現到最後發佈成應用。同時也可以把自己的實驗發佈在 Cortana Intelligence Gallery 與其他人分享。

Q&A 補充

整理一下當天的問題,問題大致分成以下兩類:一是機器學習理論問題,這部分建議看軒田老師的機器學習課程;二是 Azure Machine Learning Studio 相關,在以下回答:

  1. 資料集裡面 Age 這個欄位有1/4左右的 missing data ,直接填入年齡的平均值是好做法嗎?不管填入中位數、平均值或 PPCA (probabilistic PCA) 都只能說這是委曲求全的作法,Titanic 這個資料集有趣但並不完整有過多的 missing data,針對年齡這樣的生物特徵我們也不容易從其他特徵推論得知,但我們又不想把欄位整個刪除的情況下,只能藉由這樣的方法減少 missing data 造成的影響。
    若為類別資料,我們可以將。類似的問題像是我們把 Cabin 座艙欄位拿掉究竟正不正確?鐵達尼號因為撞擊的位置,在右舷獲救的人數比在左舷獲救的多,所以全知的我們當然知道 Cabin 應該與生存率有關係等結論。但當資料筆數過少,很容易造成過適的問題,因此在這邊我們選擇把它拿掉,
  2. 如果想要自己寫 model 或是改 model 的 cost function 該如何在 AML Studio 裡面做到?
    AML Studio 裡面可以插入元件撰寫自己的 python 或 R的腳本,但而若要自訂 cost function 則沒辦法拿 AML Studio 現有的 model 來使用。
  3. 所以 Titanic Dataset 到底是二元分類問題還是迴歸問題?
    看怎麼定義,如果今天問題是生存與否,那是二元分類問題;如果今天問題是存活的機率,那便是迴歸問題而答案正是我們算出來的 label probability。但剛好在二元分類問題中,我們可以依照 label probability 把0.5以上回答 yes,反之0.5以下回答 no。

Last but not least

上一次走進博雅202應該是大二的通識課,這次一走進202發現整個大爆滿不少人坐到地上,台下除了正在準備期中考周的台大學生,也有不少外校及業界人士,真的很開心大家晚上的時間一起來討論交流,也希望之後有機會能繼續和大家分享。

最後非常感謝熱血的 Pecu 學姊、很罩的同事 Jade 一起推動 CS+X 這麼棒的社群,也謝謝社團非常有熱誠有理想的幹部們付出的努力,希望這個社團能夠一直持續下去。

Reference

Azure Machine Learning Studio Azure Machine Learning 免費電子書 CS+X 講座投影片 CS+X Facebook Fan Page