機器學習的生命週期作業:Machine Learning Operationalization

這篇文章會帶您透過幾個簡單的指令,快速的將 TensorFlow, CNTK 或是 Python 所建立的預測模型,部署到 Azure Container Service (ACS)HDInsight Spark 上,以達到高擴充性的需求。

AML CLI (Azure Machine Learning Command Line Interface) 是個全新的 Azure 機器學習指令集,目前是 preview 版本,目的在將機器學習的生命週期,例如 Experiment, Model training, Deployment, Management 等.能透過指令自動化流程處理。同時支援 CNTK, TenserFlow 等不同的機器學習框架,未來也將支援如 GPU/FPGA 等機器,協助資料科學家們對模型生命週期的訓練及管理。

GitHub 上有完整範例及文件並隨時更新,已可在 Linux Data Science Virtual Machine (DSVM) 上使用。

環境準備

首先你需要有 Azure 訂用帳戶 (取得訂用帳戶),然後依說明文件建一個 DSVM 出來 (要完成以下練習,只要選擇最便宜的機器即可)。

透過 SSH 連線至 DSVM (可使用 X2Go Putty )後,執行以下指令:

$ wget -q http://amlsamples.blob.core.windows.net/scripts/amlupdate.sh -O – | sudo bash –

$ sudo /opt/microsoft/azureml/initial_setup.sh

注意: 請登出再重新登入以讓改變有效

接下來執行以下指令來設定 AML CLI 環境:

$ az login

$ aml env setup

以上指令會在這個 DSVM 中新增以下這些服務:

  • A resource group
  • A storage account
  • An Azure Container Registry (ACR)
  • An Azure Container Service (ACS)
  • Application insights

注意:

  1. 首先你會被要求到 https://aka.ms/devicelogin 輸入一組代碼,再登入您的 Azure 帳號,確保你有足夠的權限新增服務。
  2. 得輸入小於20個字元、只能包含小寫字母及數字的環境名稱 (Environment names)。

之後你隨時可以執行以下指令來了解所有的環境設定:

$ aml env show

amlenv1

使用 Jupyter

身為資料科學家,您可以使用喜歡的 IDE 來寫作。若使用 Jupyter,在 DSVM 中是跑在 https://<machine-ip-address&gt;:8000 ,請直接以瀏覽器打開並以登入 DSVM 的帳密登入。

在以下資料夾中可分別找到即時及批次服務的範例:

即時: azureml/realtime/realtimewebservices.ipynb notebook

批次: azureml/batch/batchwebservices.ipynb notebook

jupyter1-1

照著步驟即可訓練出一個預測模型:

jupyter2-1

CNTK, TensorFlow 及 Python 範例

利用 AML 部署

若是即時服務 (realtime),會部署到 Azure Container Service (ACS),若是批次服務 (batch) 會部署到 HDInsight Spark,以達成高擴充性及高可用性的目標,無論您的預測模型是由 TensorFlow、CNTK 或 Python 所建制的。

以 realtime 服務範例。SSH到DSVM後,切換到訓練出來的預測模型所在資料夾:

$ cd ~/notebooks/azureml/realtime

接下來執行以下指令,就能部署 realtime service 至所在的 DSVM:

$ aml env local

$ aml service create realtime -f testing.py -m housing.model -s webserviceschema.json -n mytestapp

部署成功後的畫面:

amlenv2

你也可以執行以下指令,部署到 Azure Container Service (ACS) cluster 中:

$ aml env cluster

$ aml service create realtime -f testing.py -m housing.model -s webserviceschema.json -n mytestapp

了解更多 AML CLI 指令

https://github.com/Azure/Machine-Learning-Operationalization/blob/master/aml-cli-reference.md 可看到所有的指令,例如可以執行

$ aml service list

會看到所有已部署的 realtime 或 batch 服務

在 Azure Machine Learning 中處理影像資料 (以辨識人臉為例)

本文將使用 Azure Machine Learning Studio,一次匯入數張影像檔,再經由一個預先訓練過的模型,偵測這些影像中是否含有人臉。

步驟一:開通 Azure 「機器學習」帳號

1. 不需要信用卡就可以免費開始使用 Azure Machine Learning (https://studio.azureml.net/):擁有 10GB Azure Storage 的 Datasets 空間、最多建制 100 modules 以及一小時的 Machine Learning experiments 時間。

image

2. 如果你是成立不到五年的新創公司,可以免費申請 BizSpark 方案,享有每個月 NT$4,700 額度的 Azure credit。開通時亦無需輸入信用卡,所以沒有付費的風險。

3. 如果你是 MSDN 訂閱用戶,本來就有 Azure 免費額度,只要開通即可。

4. 當然你也可以直接申請免費試用一個月,取得 NT$6,300 元的 Azure 信用額度。

(如果你是學校老師或學生,有更多 Azure 免費資源)

步驟二:選擇合適的照片上傳至 Azure Blob 儲存體

影像、音樂、影片等檔案通常較大,Azure Blob 儲存體提供了便宜彈性的儲存空間,可作為 Azure Machine Learning 連結使用。

首先我選擇了以下 4 張照片:

image

然後將它們上傳至 Azure Blob (可見此文有詳細的上傳步驟):

image

步驟三:匯入影像、偵測人臉

接下來我們要使用一個預先訓練過、用來偵測人臉的分類模組,並將影像檔作為資料源,逐一分析各影像裡是否含有人臉。當然未來你也可以利用 “Import Images” 模組所匯進來的影像,訓練出你自己的預測模型。

登入 Azure ML Studio,在空白的 Experiment 裡拉進”Pre-trained Cascade Image Classification”、“Import Images”、”Score Model”以及 “Execute R Script” 模組,並連結如以下:

image

在 “Import Images” 中設定你剛剛上傳影像的 Blob URL 位址。若你的 Blob 是設定為非公開存取的話,則需要再輸入帳號密碼。以 Public URL 為例:

image

然後在 “Execute R Script” 模組中,貼入以下 R Script。其重點在 Line 4,這行程式是把偵測人臉預測結果的三個欄位取出來。

   1: # Map 1-based optional input ports to variables

   2: dataset1 <- maml.mapInputPort(1) # class: data.frame

   3:  

   4: data.set = data.frame('Image Name'=dataset1['Image Name'], 'Score Labels'=dataset1['Scored Labels'], 'Label Probabilities'=dataset1['Scored Probabilities'])

   5:  

   6:  

   7: # Select data.frame to be sent to the output Dataset port

   8: maml.mapOutputPort("data.set");

步驟四:執行結果

按下 Run,等待執行結束。

我們先來看 “Import Images” 幫我們作了什麼事,選擇 Visualize 之後,會發現它幫每一個影像的每一個像素都轉換為 RGB 數值。觀察以下可發現,我們共匯入了 4 個影像,而因為每個影像是 640*427 像素,每一像素有 R, G, B 3 個值,所以每個影像後面有 640*427*3 = 819,480 個欄位:

image

我們再到 “Execute R Script” 觀察最後執行結果。

image

看來這個預先訓練的人臉辨識模型準確度不錯,第 1 張小狗照片判斷沒有人臉 (false),第 2 到 4 張都成功判別出有人臉 (true)。

image

備註:

1. “Import Images” 支援下列的影像格式:

  • Windows 點陣圖檔案:*.bmp、*.dib
  • JPEG 檔案:*.jpeg、*.jpg、*.jpe
  • JPEG 2000 檔案:*.jp2
  • 可攜式網路圖形:*.png
  • 可攜式影像格式:*.pbm、*.pgm、*.ppm
  • Sun 點陣:*.sr、*.ras
  • TIFF 檔案:*.tiff、*.tif

2. 請注意影像檔及 Blob 的技術細節,匯入過程中出現的錯誤通常來自這些規範:

  • 所有影像必須相同大小。
  • 所有影像必須具有相同的色頻。例如,您不能混用灰階 與 RGB 影像。
  • 每個影像的像素數目有其上限 (實際測試發現其上限數目其實遠大於官方文件說的 65536)。 不過,影像數目不受任何限制。
  • 如果您是將 Blob Container 作資料來源,則此 Container 中不能包含 Blob,只能包含影像檔。

3. “Import Images” 在第一次執行時會花較久的時間,但在影像 cached 之後即可省略匯入的動作。

延伸閱讀:

Azure 「機器學習」初體驗
Azure 「機器學習」FAQ
Azure 「機器學習」:我該用哪種演算法 (algorithms)?

在 Excel 裡使用 Azure 「機器學習」預測服務

不需要會寫程式,現在只要打開 Excel 就能直接呼叫 Azure 「機器學習」的服務來作預測。

步驟一:到 Office 市集中下載免費的 Excel Azure ML 增益集 (Add-in)

安裝時需要登入您的 Microsoft Account 帳號,日後不論您是使用 iOS、Android、桌面、甚至網頁版本的 Excel,就都能直接使用。

image

(是的! 現在增益集可以發佈至 Office 市集進行銷售囉! 有興趣開發的人可以到 Office 開發官網了解)

步驟二:打開 Excel 並選擇此 Add-in

image

步驟三:執行 (以「鐵達尼號生還率預測」為例)

各位可以先把以下資料複製後貼到 Excel,作為我們的預測資料。

PassengerClass Gender Age SiblingSpouse ParentChild FarePrice PortEmbarkation
2 female 40 2 1 50 C
1 male 20 1 3 200 C
2 female 55 0 1 50 C
3 female 90 4 2 50 C
1 male 20 2 1 90 C
1 male 2 2 2 80 C

 

選擇「鐵達尼號生還率預測」服務 (Titanic Survivor Predictor) 後:

  1. 在 Input 選取以上這個表格
  2. 在 output 輸入 H1 欄位
  3. 然後按下 Predict,就可看到預測結果了!

image

(女生生存率超高的! 男生只有 2 歲的小孩有高生存率。原因當然是當時以婦女及小孩為優先逃生)。

使用你自已的 Web Service

當然你可以使用自已設計出來的 Azure 機器學習服務,只要依此文的步驟取得 Web Service 的 URL 及 API Key 再貼上即可。

批次執行 (Batch Execution)

你可以在 Predict 的下拉選擇中選擇 As a batch,即能讓你在 Excel 中測試大量批次執行。

分享您的 Excel 工作表

許多公司及個人都已在使用 Excel 儲存及處理資料,如銷售紀錄、客戶資訊等等。只要透過這個 Excel Add-in 加入 Web Service 並儲存後,所有打開這個 Excel 檔案的人即能直接使用這個服務來預測自己的資料,無需知道背後其實使用了「機器學習」的服務,整個過程不需寫程式且操作方便。

其他功能及應用:

  • 打開 VIEW SCHEMA,即可了解 input 及 output 的所有資料欄位及格式

image

  • 自動預測

如果勾選 Auto Predict 的話,只要選取的表格資料有變動,就會自動更新預測結果。

image

延伸閱讀:

General Availability of Free Excel Add-In for Azure ML

如何利用 Azure 「機器學習」贏得黑客松 (Hackathon)?

預測某個 YouBike 租借站在某個時間點是否還有車可以借、是否還有車位可以停;預測某個城市在不同的時間發生犯罪的機率;依據下眼瞼的照片判斷貧血的程度;找出不同的開車模式和車禍發生機率的關係。以上都是你可以利用 Azure  Machine Learning「機器學習」贏得一場黑客松 (Hackathon) 的題目,甚至成為你開始新創公司的契機!

本文將介紹使用 Azure 「機器學習」的步驟及各種資源,方便你在黑客松活動中使用。其中前二個步驟可以在參加之前即先行完成。

步驟一:開通 Azure 「機器學習」帳號

1. 不需要信用卡就可以免費開始使用 Azure Machine Learning (https://studio.azureml.net/):擁有 10GB Azure Storage 的 Datasets 空間、最多建制 100 modules 以及一小時的 Machine Learning experiments 時間。

image

2. 如果你是成立不到五年的新創公司,可以免費申請 BizSpark 方案,享有每個月 NT$4,700 額度的 Azure credit。開通時亦無需輸入信用卡,所以沒有付費的風險。

3. 如果你是 MSDN 訂閱用戶,本來就有 Azure 免費額度,只要開通即可。

4. 當然你也可以直接申請免費試用一個月,取得 NT$6,300 元的 Azure 信用額度。

(如果你是學校老師或學生,有更多 Azure 免費資源)

步驟二:學習使用 Azure Machine Learning Studio

如果你是機器學習的完全初學者,除了可先閱讀專門爲初學者所寫的二篇文章之外:

Azure 「機器學習」初體驗
如果你搭上了鐵達尼號,有機會生還嗎?

強列建議走一遍官方中文教學:在 Azure Machine Learning Studio 中建立您的第一個實驗

步驟三:尋找合適的訓練資料

如同文章一開始所提出的各種問題,Azure 「機器學習」的強項即是能根據歷史資料作數值預測 (Regression)、分類  (Classification) 或是分群 (Clustering),成為解決這些問題的強力工具。請記得,能問出一個好問題、進而定出一個好題目,常常是贏得一場黑客松非常重要的關鍵!

定出題目之後,就要尋找合適的資料作為機器學習模組的訓練之用了。資料集 (datasets) 的提供可以透過直接上傳(如 .csv 格式)、或是提供連結 (如 OData feed provider) 的方式。若要使用公開資料,以下是幾個常用的國內外站點:政府資料開發平台美國政府開放平台KaggleUC Irvine Machine Learning Repository 等。

步驟四:建構你的學習模型

「機器學習」之中,若是作為數值預測 (Regression) 或分類 (Classification) 之用途.皆是屬於監督式學習 (Supervised Learning) 的範疇。監督式學習基本上會遵守以下的流程:

image

別小看了其中”資料清理”的工作喔! 因為你所選擇的訓練資料,可能有缺漏或不全之處需要補全或是移除、有些欄位 (如姓名、ID等) 不應該作為訓練之用、有些資料需要先”類別化” (Categorized) 以作為訓練之用並讓使用者選擇 (如性別、鐵達尼號的上船港口等)。建議大家可看看”鐵達尼號”的模型如何作資料清理,並據此學習。

步驟五:選擇合適的演算法

在此文章中有介紹各種不同演算法,及各自的使用時機,大方向如下:

  • 如果您期望的解答是一個數值的話 => Regression (迴歸分析)
  • 如果您的問題能夠以 Yes/No 來回答 => Classification (分類)
  • 如果您想將具相同特性的資料群集分類 => Clustering (分群)

微軟也製作了一個 PDF 小抄可供下載,方便大家依步驟判斷,以選擇最合適的演算法:

Machine Learning Algorithm cheat sheet: Learn how to choose a Machine Learning algorithm.

步驟六:優化你的訓練模型

個人覺得 Azure Machine Learning Studio 這個工具最酷的地方,就是可以自動找到最適合的演算法設定參數了。例如,我用了決策樹 (Decision Tree) 演算法,但我怎麼知道節點或是葉子的數目該設為多少呢?

預設的單一參數 (Single Parameter) 設定:

image2

你只要更改為參數區間 (Parameter Range),就能設定參數範圍 (以等差或等比遞增)、指定數個參數、或是混合設定。訓練模型就會自動根據你的設定找出最佳的參數!

image3

選擇參數來最佳化 Azure Machine Learning 中的演算法

同時也不要忘記,可在 “Score Model” 及 “Evaluate Model” 中檢視你的模型預測準確度。

多元分類評估結果

在 Azure Machine Learning 中評估模型效能

在 Azure Machine Learning 中解譯模型結果

步驟七:發佈為 Web Service

模型優化之後,就可以發佈為 Web Service 以進行預測了。在下方選擇 “SET UP WEB SERVICE” => “Predictive Web Service” ,再點選 “DEPLOY WEB SERVICE” 即可佈署使用。

Convert to scoring experiment

Deploy the web service

部署 Azure Machine Learning Web 服務

步驟八:使用 Web Service

最貼心的是,還提供 C#, Python 及 R 語言的 sample code,協助大家節省時間贏得比賽!

image

Web Service 提供了兩種呼叫方式

1. Request/Response: 提供快速可延展的呼叫服務,接受一或多筆資料作為輸入、也可輸出一或多筆結果,適合用在單筆且快速回應的需求,例如即時回應使用者對股市收盤行情的預測。

2. Batch Execution:適合處理批次、大量、非同步的資料,例如批次性的處理 IoT 在一段時間之中收集的所有資料。

希望以上對大家有幫助,值得一提的是,2015 年 8 月舉辦的台大 HackNTU 中,前 2 名都是與 Azure Machine Learning 有關的喔!

image

其中第一名使用了Project Oxford 服務,包括 Speech APIs (Speech recognition + Text to Speech Conversion 等),其背後機制即是微軟的「機器學習」;第二名則是運用 Azure 機器學習來訓練六種手語手勢。

千人黑客松HackNTU得獎團隊揭曉 語言學習App、手語辨識系統、救災無人機獲獎

image

延伸閱讀:

1. How to win a hackathon using Azure Machine Learning – 作者為微軟總部高級主管 Jennifer Marsman,本篇主題及內容來自她的文章,並已取得她的同意作適當的翻譯及在地化。

2. 本部落格所有機器學習相關文章: http://blogs.msdn.com/b/mengtsai/archive/tags/machine+learning/

我看起來幾歲 How old do I look? 幕後花絮

【原文來自: 台灣微軟雲端與企業平台事業部副總經理葉怡君網誌

這幾天有款 App (or 網站?) http://how-old.net/# 爆紅 – “How Old Do I Look?” (我看起來幾歲?), 短短 48 個小時就有一百萬人上去 PO 照片測試. 我的臉書幾乎被大家的自拍照片洗版, 大部份的人都很滿意他們的測試結果, 因為都比實際年齡少了許多, 連我 91 歲的阿嬤也立馬叫她的朋友來試, 因為她有一張笑開懷的照片看起來只有 76 …

當然囉, 也有一些例外, 但基本上是款相當討喜的軟體,所以也被瘋狂轉載. 也因為基本上蠻準的(特別對老人及小孩), 也或是很不準(特別是涷齡的東方女生), 所以引起很多討論, 包含:

  • 這到底怎麼猜的? 怎麼這麼準?
  • 這到底怎麼猜的? 為什麼我表情不一樣, 猜的年齡也不一樣?      
  • 這到底怎麼猜的? 為什麼我一直被猜出是女生? 我明明是男的? (Who knows?)       
  • 這到底怎麼猜的?我PO上去的照片會不會被Microsoft拿去使用?

由於這個網站是敝公司做的, 當初只是為了開發者大會 (//Build) 做的一款 demo, 用了蠻多物聯網及大數據的技術, 所以我就去查了一下幕後花絮, 結果發現一些有趣的故事.

樣本那裡來?

一開始那個開發團隊只想找 50 個人, 結果最後弄到了3萬5仟個人參加 (而且2萬9仟人來自土耳其, 土耳其!!!! 只能說要讓全世界看到, 一定要積極參與國際事務). 總共上傳了21萬張照片, 再用Microsoft Azure 雲端服務上的 Face detection APIs 去找到人臉, 去分類, 去看是不是同一個人。

個人覺得很準, 因為我拿我們家阿布的臉去測, 即使他很帥, 還是測不出來的.

性別跟年齡怎麼猜出來

要在一兩天就寫出這款討喜的App, 當然不能不能從研究演算法開始, 當然也站在巨人的肩膀上摘水果, 所以這個開發團隊用了微軟的機器學習套件 – Azure Machine Learning Gallery 中, 由一個叫 “牛津專案” (Project Oxford) 所做出來的雲端智能服務, 包含Face, Speech, and Vision. 另外, 考量大家除了測自已跟家人的年齡外, 也一定想惡搞一番, 去找名人或古人的照片, 所以再用了Bing Search API 去搜尋網路上的有趣照片.

Microsoft 到底會不會把上傳的照片存下來?

真的不會. 這是官網上的說明:

We’ve had some questions so we updated this post to be more clear. To answer the top one: No we don’t store photos, we don’t share them and we only use them to guess your age and gender. The photos are discarded from memory once we guess. While the terms of service very common in our industry, and similar to most other online services, we have chosen not to store or use the photos in any way other than to temporarily process them to guess your age.

那大家一定會問, 真的嗎? 照片一直不斷的傳上來, 你不存起來怎麼分析, 怎麼學習?

問的好, 重點來了, 這就是大數據即時分析的神妙之處啊啊啊. 別忘了有 Azure 啊.

資料的匯集跟派送可以用 Azure Event Hubs, 可以一秒鐘進出幾百萬份資料, 你的照片不會被存下, 我們存下的是從照片萃取出來的資料, 是什麼資料呢? 我同事說是叫”顏值” 的資料, 也就是青春的軌跡吧. 所以大家放心. 你的照片不會被留下來.

但對於寫程式的人來說, 怎麼抽出這些像是性別, 年齡資料, 來做即時呈現呢? 大家上傳照片一定想要立馬知道結果, 没有人想過幾天再開獎, 又不是全身健檢… 當然, 又得靠工具了. Azure Stream Analytics 可以讓開發者用簡單的 SQL query 語法捉到即時的串流資訊, 立馬回報.

比起別的國家來, 台灣人是不是看起來比實際年齡年輕?

我不確定, 但根據這幾天我所看到的結果, 好像我們普徧看起來年輕很多 (只要不要亂做鬼臉, 拍太暗…). 但如果你真的有心想要開發新的App來統計一下, 也有好用的工具來做圖表分析, 那就是(噹噹噹…) PowerBI http://www.powerbi.com!

還是那句話, 實際幾歲不重要, 看起來幾歲比較重要, 去玩玩看吧, 或許你會找到讓自已看起來年輕的秘訣. 還有, 如果你是開發者, 發揮想像力吧, 利用 Azure 這些 API,

看你可以寫出什麼讓大家瘋傳的 App!

原文參見 http://blog.how-old.net/

初探「機器學習」投影片下載

分別於今年 2 月及 4 月於松山文創美國創意中心演講的課程投影片,簡介 Azure Machine Learning 以及微軟提供的各項創業所需要的資源,如 BizSpark 等:

[AIC課程] 初探「機器學習」與創業資源

相關閱讀:

1. 本部落格 Machine Learning 系列文章 (中文): http://blogs.msdn.com/b/mengtsai/archive/tags/machine+learning/

2. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件): http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/

3. 美國創意中心 (American Innovation Center) FB: https://www.facebook.com/twaic?fref=ts 

如果你搭上了鐵達尼號,有機會生還嗎?

image

有個網站可以讓你作測試。只要依次選擇艙等、性別、年齡、有幾個同行親屬、購買的票價、由哪個港口出發 (不知道的話就隨便選):

image

然後 Submit,就能得到你的生還機率了:

image

是的! 11.11% 就是我照實填寫之後得到的生還機率,還幫我加註解說我的生存機會渺茫…><~

反正這預測是免費的,所以您可以多方嘗試,看看哪一種乘客是最有可能存活的。首先,我把性別由 Male 改成 Female:

image

是的!! 只要變性為女生我就 100% 可以存活了~ XD

(以下開始包含技術內容)

所以這網站是怎麼作預測的?

簡單來說,即是利用了「機器學習」這方式。先將所有鐵達尼號乘客的資料 (data) 拿來作輸入,經過 ML (Machine Learning) 的學習之後,即得到新的預測技能 (skill):

image

(想先了解一下何謂「機器學習」? 請見 「機器學習」FAQ)

一、取得乘客資料

首先,Kaggle 這網站可以取得當年所有 891 個鐵達尼號的乘客資料 (“train.csv” 檔)。免費下載,以 Excel 打開後如以下:

image

檢視一下可以發現…

  1. 有個 “Survived”欄位代表是否生還 (1 表示生還)。
  2. 各位可先想想,如編號 (PassengerId)、姓名 (Name)、船票序號 (Ticket) 等資料,與最後存活與否,有關連嗎?
  3. 有些資料是不完整的,如編號 6 的 Age,這部份要如何處理?

二、使用「機器學習」的線上工具 (Azure ML Studio)

各位可直接以瀏覽器打開看看鐵達尼號生存機率的 ML 學習機制,以下我即會簡單介紹一下這張圖。

image

(想學習如何使用這工具? 請見 Azure 「機器學習」初體驗)

三、資料整理

所謂 Garbage in, garbage out! 原始資料之中有些對預測沒有幫助、或是不完整的地方,我們都可以用簡單拖拉、設定的方式作資料整理。

如:無視 PassengerId, Name 等欄位: (Exclude column names)

image

又如:將不完整的資料 (missing values) 以中位數 (median) 來代替: 

image

四、建立學習模型

資料整理完後就可開始學習了! 工具內建了不少微軟研究院開發出來的機器學習演算法,使用者只要拖拉合適的演算法進來即可。

如以下鐵達尼號的例子中,用了 2 種演算法來比較哪一個的正確率比較高:

image

(想了解更多演算法? 請見: 我該用哪種演算法 (algorithms)?)

五、檢視學習成果

就像我們上學要考試一樣,我們也要來檢查這個預測模型的學習績效。

如以下我們可以檢查所有的預測 (Scored Labels) 相對於實際是否生還 (Survived) 的對照圖:

image

也可利用如 ROC 等方法,以曲線表示相較於亂猜 (45度對角線) 的準確程度:

image

六、發佈為 Web Service

最後我們當然想作成網站或是 App,讓其他使用者使用。透過發佈為 Web Service 的方式即可讓其他開發者使用你的預測。

image

同時還會提供 C#, Python 及 R 語言的 sample code:

image

註:Azure ML Studio 是微軟所開放出來的「機器學習」工具,主要是設計讓非資料科學家也能輕鬆學習使用。任何一種瀏覽器上都可執行,無需信用卡,登入 Microsoft Account 之後即可。

延伸閱讀:

1. Tutorial: Building a classification model in Azure ML

2. BUILDING AND DEPLOYING A CLASSIFICATION MODEL IN AZURE ML: A Step-By-Step Tutorial

3. 本部落格 Machine Learning 系列文章 (中文): http://blogs.msdn.com/b/mengtsai/archive/tags/machine+learning/

4. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件): http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/

 

R 語言初體驗- 使用於 Azure Machine Learning Studio 中

“R 語言,一種自由軟體程式語言,主要用於統計分析、繪圖及資料探勘。”

維基百科: R 語言

本文將帶您檢視 410 個預裝的 R packages、展示如何直接使用既有的 R script,或直接在 Azure ML 中撰寫、透過 R 作資料清理進而建立預測模型、以及如何極大化 R 語言在「機器學習」上的應用。

使用 Azure ML Studio

微軟所開放出來的「機器學習」工具 Azure ML Studio,可以在任何一種瀏覽器上執行,無需信用卡,登入 Microsoft Account 之後即可免費開始使用: https://studio.azureml.net/

Azure ML Studio 包含 “Execute R Script” 及 “Create R Model” 模組可供使用:

image

檢視預裝的 R packages

目前支援 410 個 CRAM R packages, 包括 plyr and dplyr, car, datasets, HMisc, MASS, Intel Math Kernal Library,及 rpart, nnet, survival, boot 等資料探勘工具。

要檢查哪些預建的 R packages 可供使用,請先開啟一個 Experiment,拉入 “Execute R Script” 模組,並貼入以下命令:

 

data.set<-data.frame(installed.packages()) 

 

maml.mapOutputPort("data.set");

image

按下執行 (Run) 後,點選左下角圈圈並選擇 Visualize,即可看到所有預先安裝的 410 個 R packages:

image

使用 ggplot2 繪圖

開啟一個全新的 Experiment,並拉進 “Adult Census Income Binary Classification dataset”、以及 “Execute R Script” 模組如以下:

image

[小技巧] 善用左上角的 Search 功能,可直接找到這些模組!

其中 “Adult Census Income Binary Classification dataset” 這份普查資料即是我們的資料來源,這份資料收集了 3 萬多人的 age, race, sex 、並標示年薪是否大於 5 萬美金 (50K):

image

點選 “Execute R Script”,鍵入以下命令以匯入 ggplot2 及 data.table:

library(ggplot2)

library(data.table)

接下來我們要用 ggplot2 畫兩張圖:一張是 sex 相對於 income 的長條圖;另一張是 age 相對於 income 的 density graph:

foo = qplot(x=sex, data=dataset1, geom='histogram', fill=income, position='dodge'); print(foo) 

foo = qplot(x=age, data=dataset1, geom='density', alpha=0.5, fill=income); print(foo) 

最後的 R 程式如下:

image

執行 (Run) 之後,點選其右下角小圈選擇 Visuallize,即可見到我們畫的二張圖 (看來是男生賺的多、老的賺的多):

image

image

利用 R 作資料整理

原始資料的各個欄位中,含有許多的 ‘-‘  (dash) 符號,我們可以加入以下命令,將所有的 ‘-‘ 換成 ‘.’ (dot):

names(dataset1) <- 

sub(pattern='-', replacement='.', x=names(dataset1))

再將處理後的資料指定回 “dataset1:

maml.mapOutputPort("dataset1");

最後的 R 程式:

image

執行 (Run) 之後,點選其左下角圈圈選擇 Visualize,即可注意到原本的 ‘-‘ 皆已被替換成 ‘.’:

image

建立預測模型

假設我們想要以 age, sex, race 等資料,來預測其年收入 (income) 是否大於 5 萬美金 (50K)。

預測模型的建立有類似的模式,我們使用 “Two-Class Boosted Decision Tree” 演算法, 再拉入 Split, Train Model, Score Model, Evaluate Model 並連結如下:

image

並記得在 “Train Model” 中選擇我們想預測的欄位: “Income”

image

執行 (Run) 之後,查看 Score Model,即可看到這個模型預測 income 大於 5 萬美金 (50K) 的機率:

image

當然我們也可查看 Evaluate Model,觀察如 ROC 等模型評估數值:

image

發佈為 Web Service

若我們滿意這個預測模型,按下  “CREATE SCORING EXPERIMENT” ,就可自動產出 Web Service ,還會出現一段動畫,將你的模型變成以下:

image

同時提供 C#, Python 及 R 語言的 sample code:

image

極大化 R 程式在 Azure ML 的價值

image

“Excute R Script” 模組不但可接受二組不同的 dataset 作為資料來源,同時也提供 ZIP 的方式作輸入,例如,若有套件並未包含在預裝的 410 CRM packages 當中,即可透過 ZIP 的方式引入。

輸出的方式則如本文範例所示,不但能將結果透過 R Devices (如 ggplot2) 顯示,也能輸出為 dataset 作後續使用。

在 Azure ML 也提供 “Create R Model”,讓您直接應用 R 語言於預測模型建制,包含 Training Model 及 Scoring Model,再進而發佈為 Web Service 供其他人員使用:

image

延伸閱讀:

1. Using R in Azure Machine Learning Studio

2. 本部落格 Machine Learning 系列文章:http://blogs.msdn.com/b/mengtsai/archive/tags/machine+learning/

3. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件): http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/

Net# 簡介:透過 Azure ML 實作多層網路及卷積神經網路 (Convolution Neural Network)

Net# 是在 Azure ML 中設定類神經網路的簡單 script 語言,讓使用者能在預設的 full bundle 之外 (即,各層間的節點是完全連接的),作出以下的變化,以進行機器學習並建構模型:

    • Filtered bundles. The user can define a predicate by using the locations of the source layer node and the destination layer node. Nodes are connected whenever the predicate is True.
    • Convolutional bundles. The user can define small neighborhoods of nodes in the source layer. Each node in the destination layer is connected to one neighborhood of nodes in the source layer.
    • Pooling bundles and Response normalization bundles. These are similar to convolutional bundles in that the user defines small neighborhoods of nodes in the source layer. The difference is that the weights of the edges in these bundles are not trainable. Instead, a predefined function is applied to the source node values to determine the destination node value.

以下所介紹的範例,各位可在瀏覽器中直接打開 (登入 Microsoft Account 即可)。

範例的資料是來自著名的 MINST 網站,當中收集了 7 萬筆手寫阿拉伯數字的影像資料,每個影像都是 28*28 像素。

figure_1

在 Azure ML Studio 中建制的學習模型如下,目的是讓機器判讀這些手寫數字。其中:

  • 我們使用 Multiclass Neural Network 作為學習演算法。
  • 以 6 萬筆資料作為模型學習、另 1 萬筆資料作驗證。

image

一、首先實作單一隱藏層、且各層間節點完全連接的網路設定

image

雖然 one hidden layer, fully connected 是 Azure ML 的預設值,我們還是可以用 Net# 來描述它:

image

呃…很簡單吧,亦即是以 input, hidden, output 分別定義各層的節點個數。也能加入如 C#/C++ 的註解喔!

input Picture [28, 28]; 

// 也可以寫成: 

// input Picture [28 * 28]; 

// 或直接幫它算出來: 

// input Picture [784]; 

// Net# compiler 能自動根據資料格式編排出適當的矩陣.

hidden H [100] from Picture all; 

// 其中 “all” 是指 fully-connected

output Result [10] softmax from H all;

// “all” 即表示與 “H” 層 fully-connected, 

// softmax 是所指定的 activation function. 

這個實驗可以在 2 分鐘之內執行 (Run) 完畢 (30 iterations)。之後點選 Evaluation Model 下的圓點選擇 Visualize,即可見到每一個數字的判讀準確率:

image

而整體準確率為 0.9772 (97.72%):

image

二、實作 2 個隱藏層

我們把 2 個隱藏層的節點數都增加到 200,則 Net# 如以下 (看起來還是很簡單!)。請各位注意層與層之間的對應關係即可 (Picture –> H1 –> H2 –> Result)。

此實驗的學習時間約 4 分半鐘 (30 iterations),準確率會是 0.981 (98.1%)

input Picture [28,28];

hidden H1 [200] from Picture all;

hidden H2 [200] from H1 all;

output Result [10] softmax from H2 all;

若各位要進一步實作 CNN 等較進階的設定,即需有類神經網路的知識背景,才能了解各參數如 Stride 等之意義,另請參閱 Net# 官方文件的說明。

以下我仍列出 CNN 及 Deep Net 的 Net# 設定,以及其所達到的準確率給大家參考: (來源: Microsoft Azure Machine Learning Gallery)

三、實作一個簡單的 Convolution Neural Network (CNN):

如以下,跑出來的準確率會是 0.9841 (98.41%)

const { T = true; F = false; }

input Picture [28, 28];

hidden C1 [5, 12, 12]

  from Picture convolve {

    InputShape  = [28, 28];

    KernelShape = [ 5,  5];

    Stride      = [ 2,  2];

    MapCount = 5;

  }

hidden C2 [50, 4, 4]

  from C1 convolve {

    InputShape  = [ 5, 12, 12];

    KernelShape = [ 1,  5,  5];

    Stride      = [ 1,  2,  2];

    Sharing     = [ F,  T,  T];

    MapCount = 10;

  }

hidden H3 [100]

  from C2 all;

output Result [10] softmax

  from H3 all;

四、實作 Convolution + Pooling Deep Net

如以下,跑出來的準確率會是 0.989 (98.9%)

const { T = true; F = false; }

const {

// input image size

ImgW = 28;

ImgH = 28;

 

// first convolutional layer parameters

C1Maps = 5;

C1KernW = 5;

C1KernH = 5;

C1StrideW = 1;

C1StrideH = 1;

// formula computes dimensions with padding enabled.

C1OutW = (ImgW - 1) / C1StrideW + 1;

C1OutH = (ImgH - 1) / C1StrideH + 1;

 

// first pooling layer parameters

P1KernW = 2;

P1KernH = 2;

P1StrideW = 2;

P1StrideH = 2;

// formula computes dimensions with no padding.

P1OutW = (C1OutW - P1KernW) / P1StrideW + 1;

P1OutH = (C1OutH - P1KernH) / P1StrideH + 1;

 

// second convolutional layer parameters

C2Maps = 10;

C2KernW = 5;

C2KernH = 5;

C2StrideW = 1;

C2StrideH = 1;

// formula computes dimensions w/ padding enabled.

C2OutW = (P1OutW - 1) / C2StrideW + 1;

C2OutH = (P1OutH - 1) / C2StrideH + 1;

// Since Z dimension of the kernel is 1 & sharing is disabled

// total # of maps is a product of input maps and layer maps.

C2OutZ = C2Maps * C1Maps;

 

// second pooling layer parameters

P2KernW = 2;

P2KernH = 2;

P2StrideW = 2;

P2StrideH = 2;

// formula computes dimensions with no padding.

P2OutW = (C2OutW - P2KernW) / P2StrideW + 1;

P2OutH = (C2OutH - P2KernH) / P2StrideH + 1;

}

 

input Picture [ImgH, ImgW];

hidden C1 [C1Maps, C1OutH, C1OutW]

  from Picture convolve {

InputShape  = [ImgH, ImgW];

KernelShape = [C1KernH, C1KernW];

Stride  = [C1StrideH, C1StrideW];

Padding = [T, T];

MapCount = C1Maps;

  }

hidden P1 [C1Maps, P1OutH, P1OutW]

  from C1 max pool {

InputShape  = [C1Maps, C1OutH, C1OutW];

KernelShape = [1, P1KernH, P1KernW];

Stride  = [1, P1StrideH, P1StrideW];

  }

hidden C2 [C2OutZ, C2OutH, C2OutW]

  from P1 convolve {

InputShape  = [C1Maps, P1OutH, P1OutW];

KernelShape = [1, C2KernH, C2KernW];

Stride  = [1, C2StrideH, C2StrideW];

Sharing = [F, T, T];

Padding = [F, T, T];

MapCount = C2Maps;

  }

hidden P2 [C2OutZ, P2OutH, P2OutW]

  from C2 max pool {

InputShape  = [C2OutZ, C2OutH, C2OutW];

KernelShape = [1,  P2KernH, P2KernW];

Stride  = [1,  P2StrideH, P2StrideW];

  }

hidden H3 [100]

  from P2 all;

output Result [10] softmax

  from H3 all;

延伸閱讀:

1. Neural Nets in Azure ML – Introduction to Net#

2. 本部落格 Machine Learning 系列文章: http://blogs.msdn.com/b/mengtsai/archive/tags/machine+learning/

3. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件): http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/

Azure 「機器學習」: 初探類神經網路 (Neural Network)

「類神經網路」這個聽起來很利害的東西,要怎麼被應用到 Azure 的「機器學習」工具中呢? 本文的目的,即是希望讓即便沒修過人工智慧、類神經網路這些聽起來很利害的課的你,也能藉此入門,讓你能知道如何作出一個類神經網路預測模型。

那我們就開始吧!

為什麼叫「類神經網路 (Neural Network)」?

故名思義,類神經網路即是希望能模仿人類腦袋神經網路的學習過程。如下圖,大腦裡的一堆神經細胞,透過像樹枝狀的突起,以可強可弱的電脈沖的形式互相傳遞:

Back-Propagation (倒傳遞類神經網路,以下簡稱 BP)

類神經網路演算法有很多種,如 Back-Propagation (BP) 神經網路, Hopfield 神經網路, Kohonen 神經網路及 Adaptive Resonance Theory (or ART) 神經網路等;其中最常見的即是 BP 演算法,亦常被稱為 Multilayered Perceptron 多層感知器,如下圖這樣的三層結構:

image

三層式 BP 神經網路 (圖片來源: “Predictive Analytics with Microsoft Azure Machine Learning: Build and Deploy Actionable Solutions in Minutes”)

在這結構中有一個輸入層,一個隱藏層,和一個輸出層。

其中輸入層的節點數目即等於你要輸入的資料變數;而輸出層的節點數目即等於你要預測的輸出變數。相對而言,隱藏層的節點數目就非常彈性,可以自行決定,之後我們會談到要設定多少會比較適當。

舉個例子吧!

Azure 「機器學習」初體驗一文中,我們想要以 BP 演算法,依據客人已婚與否、性別、年收入等資料 (輸入) 來預測會不會買腳踏車 (輸出: BikeBuyer):

image

那麼輸入層的節點數就是 11 個,輸出層的節點數就是 1 個,如下圖所示:

image

類神經網路的參數

茲舉幾個在 Azure ML 中可設定的重要參數解釋如下:

image

“Hidden layer specification”: 也就是隱藏層的配置。預設是僅 1 層隱藏層,同時層與層之間所有的節點是相互連接的;若需要 1 個以上的隱藏層、或實作如 Deep Learning, Convolution Neural Network (CNN) 的類神經學習方式,則可以使用 Net# script 來自行定義,

image

“Number of hidden nodes”: 也就是隱藏層的節點數。這個數字該設多少呢? 有個常見的作法是以輸入層的節點數目開根號後的值開始作測試 (如: 輸入層節點數 = 11,開根號後的整數 = 3);另一個常見法則,是隱藏層的節點數目通常介於輸入層節點及輸出層節點數之間 (如: 11> 隱藏層節點數 > 1)。以上的法則皆是要避免「過度訓練」(over fitting) 的狀況發生。

image

“Learning rate”: 也就是決定模型學習過程的收斂速度。若設太低,會需要較多的 “Learning iterations” (以及較多的時間) 來找到最佳解;但若設太高,也可能讓演算法在最佳解旁邊跳來跳去,最後找到的解的錯誤率會增加。

其他參數的設定及說明可見: Azure ML Studio Help

image

如何將類神經網路應用至機器學習之中?

Azure 「機器學習」:我該用哪種演算法 (algorithms)? 文中提到,類神經網路演算法已被整合至 Azure Machine Learning,透過瀏覽器及簡單的操作,即能實作出 Classification (分類) 及 Regression (迴歸分析) 的預測模型,進而發佈為 Web Service 讓其他人使用:

image

延伸閱讀:

1. 想入門實作自己的 Machine Learning 嗎? 請見 Azure 「機器學習」初體驗

2. 還不甚了解什麼是 Machne Learning? 請見 Azure 「機器學習」FAQ,以及實際應用模型

3. Azure ML 中的演算法種類: 請見 Azure 「機器學習」:我該用哪種演算法 (algorithms)?

4. Net# 簡介:透過 Azure ML 實作多層網路及卷積神經網路 (Convolution Neural Network)

5. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件): http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/