【Azure】開發和使用 AzureML 模型

 
本篇是 Azure Machine Learning 系列中的第二篇文章,會示範如何透過階段性的實驗去訓練模型並整合到應用程式。
 

如果還沒有看過第一篇請到這裡:【Azure】 使用 Azure Machine Learning Studio 體驗機器學習!
另外,第三篇在:【Azure】在 AML 上執行自定的 Scripts
 

1. 概論

在這個實驗中,探討用階段性的 Azure ML 實驗去訓練模型並整合到應用程式。第一節先讀取我們在先前的實驗 (first lab session) 中創建的整合資料集以及訓練線性回歸模型的方法,然後將以訓練過的模型發佈到 Web 服務整合到一個範例主控台應用程式。通過 Web 服務的端點訪問,範例應用程式發送的輸入參數和檢索預測轉換成相對應的一個 JSON 格式輸出值。 在開發過程中的一些小問題也是我們會討論的範圍,同時我們也會提到如何處理這些問題。
 

1.1 目標

這個實驗目的是演示如何訓練 AML 模式,並當作 Web 服務發佈和使用在主控台應用程式。
 

1.2 要求

必須完成先前的實驗 (first lab session) 要準備進行訪問的資料集。

2. 利用 AzureML 模型

在這一節中,我們將開發 ML 實驗,並使用我們先前的實驗中生成的資料去創建 ML 模型。目的是為了訓練一個 ML 模型資料集,然後可以讓模型來預測資料集中遺失值的對應關係。 在我們整合資料集中,有從 1 到 30 的 x 值和與其對應的 “ywnoise” 值( y 值結合 noise 值)。使用這個資料集來訓練模型,之後如果我們想要知道新 “x” 值的對應,如 35、200 或 -40 等,這些樣本不在資料集裡的值,我們可以使用訓練好的模型來預測相對應的 “ywnoise” 值。
 

2.1 訓練模型

  1. 在 AML Studio 中創建一個空白的實驗。從模組工具箱中的 Saved Datasets 下,拖放我們之前的實驗上傳的資料集 “linoise.csv”。01
  2.  
  3. 從模組工具箱拖放 “Machine Learning → Initialize Model → Regression” 節點路徑下的 “Linear Regression” 模組。02
  4.  
  5. 從模組工具箱拖放 “Machine Learning → Train” 節點路徑下的 “Train Model” 模組。03
  6.  
  7. 現在,除了  “Train Model” 模組,先省略設置其他模組的屬性,使用它們的預設值。在下一節中,我們將深入討論有關這些屬性的更多詳細資訊。
  8.  
  9. 下一步是將這些模組連接在一起。雖然前兩個模組都只有單一的輸出,而最後一個模組具有兩個輸入,和一個輸出端口。並不是所有端口在實驗中都會使用到,但在這個實驗中我們都會使用。
  10.  
  11. 按一下 “Linear Regression” 模組的輸出端口並一點點的拖動游標。你會看到可能的輸入端口 (所有可用模組的輸入端口) 會變成綠色;而其他非適當的輸入端口會變紅色。也有對 “linoise.csv” 和 “Train Model” 模塊的輸出端口沒有顏色變化,因為他們不接受任何輸入。0405
  12.  
  13.  
  14. 如前面步驟中所述,每個輸入端口具有特定的輸入類型,也不可能將一個輸出連接到其他輸入端口。一旦你完成連接,實驗應該看起來像下方圖示。正如你可以看到 “Train Model” 模組有一個警告圖示說明需要一個值。06
  15.  
  16. 選擇 “Train Model” 模塊,並切換到它的屬性窗口,然後點擊 “Launch column selector” 按鈕。07
  17.  
  18. 在彈出的視窗中,選擇 “ywnoise” 行作為標籤行然後按右下角的打勾按鈕。為了簡單起見,我們有兩個行,“x” 和 “ywnoise”,在我們輸入的資料集。在即將講解的章節中探討可能會有更多行的案例。在這個實驗中,觀察在 “x” 行中的值,訓練我們 "Linear Regression" 模型與 “ywnoise” 行上相對應的數值。因此,該模型可以將任何 “x” 值預測出最佳的 “ywnoise” 值。作為總結,我們將預測標籤行也就是 “ywnoise” 的值。08
  19.  
  20. 最後一步是 “RUN” 實驗,在模組內跑資料流程,也訓練我們的模型。只需按 “RUN” 按鈕,等待幾秒鐘就可以執行完成。任何實驗執行完成不是成功就是錯誤。你可以在右上角的實驗畫布上看到綠色打勾記號顯示 “Finished Running” 的消息。09
  21.  
  22. 在成功執行後的輸出是什麼?你可以點擊模組的輸出端口的視覺化輸出,但不會幫助太多,因為輸出包括更多的統計,以及模型訓練的相關參數。為了能夠從這個 “RUN” 過或受過訓練的模型中受益,我們需要將其發佈為 Web 服務創建一個可以從應用程式連接的公共輸入輸出連接端口。通過這個應用程式,我們可以使用服務來發送輸入值(在這個案例 “x” 值),並獲得相對應輸出 (“ywnoise”) 值。

 

2.2 作為 Web 服務發佈一個訓練過的模型

  1. 繼續執行下一步驟,首先你必須成功的 “RUN” 出來並得到如前面的步驟所述的 “Finished running” 通知,有綠色的打勾記號表示。
  2.  
  3. 現在在實驗外創建 Web 服務之前,先在命令列上,按一下 “Set Up Web Service”,然後在彈出功能表中點擊 “Predictive Web Service [Recommended]”。10
  4.  
  5. 在發生一些動畫和變化幾秒後,會有一個新的標籤在實驗畫布。不要擔心你最初的實驗設計不是失去而且會自動儲存。你會發現到兩個獨立的標籤在畫布上。
     
    我們會繼續在畫布上的“Predictive experiment”標籤工作。11
  6.  
  7. 在繼續之前,讓我們改變的實驗名稱,讓其他的過程標題容易閱讀。按兩下標題將實驗命名為 “Lab04”。12
  8.  
  9. 在這個新的預測實驗標籤中,你會發現實驗中加入以下四個新的模組。
    • a. “Experiment created on 1272…” 模組
    • b. “Score Model”
    • 模組
    • c. “Web service input”
    • 模組
    • d. “Web service output”
    • 模組
  10. 稍後我們會對這種新的設計做一些變動,但是先以他們原本預設來發佈。
  11.  
  12. 作為 Web 服務發佈之前, 必須實驗運行修改後還可以被驗證。所以我們在 “Predictive experiment” 中點選 “RUN”。
  13.  
  14. 最後點擊命令欄上的 “Deploy Web Service” 按鈕。13
  15.  
  16. 幾秒鐘後,你會被轉到 Web 服務頁,上面會顯示新創建的 Web 服務。14
  17.  
  18. 在這個新的 Web 服務頁面,你可以按一下 “Test” 按鈕來開始使用訓練好的模型。點擊按鈕會彈出視窗可輸入參數。15
  19.  
  20. 你會注意到也有一個針對 “ywnoise” 的輸入框。目的是提供任何 “x” 值作為輸入,並得到 “ywnoise” 值作為輸出。但這種輸入表單也有輸出參數作為輸入。無論你在這個輸出 (“ywnoise”) 欄位中輸入的值也不會影響服務調用的結果。所以在 “x” 輸入欄位中輸入任何值,例如 578,然後不變動 “ywnoise” 的值,再按下右下角的打勾記號按鈕。16
  21.  
  22. 在幾秒鐘後,你會看到在屏幕底部的通知欄上面有一個 “Details” 鏈接。點擊 “Details” 鏈接。17
  23.  
  24. 在細節上,Web 服務的輸出顯示 JSON 資料格式。你可以看到輸入的參數 “x” 和 “ywnoise” (這實際上是不輸入的值) 和在此視窗中的輸出值 “Scored Labels”。你可以檢查 ML 模型對不同的輸入參數的反應。所有從 Web 服務返回的值都會類似於以前在 Excel 中建立的公式。18

 

2.3 從 Web Service 中刪除多餘的輸入和輸出參數

  1. 切換到 Web 服務詳細資訊頁面中的 “configuration” 標籤。19
  2.  
  3. 在上一節如果你轉換到 Web 服務中的 “configuration” 標籤,你將發現到多餘的輸入和輸出參數,如 “ywnoise” 在輸入和輸出架構,“x” 在輸出架構。20
  4.  
  5. 要刪除這些多餘的欄位,切換到 “Experiments” 頁面打開實驗 “Lab04” 並切換到 “Predictive experiment”(與 “作為 Web 服務發佈一個訓練過的模型” 章節中的步驟 3 相同)。
  6.  
  7. 從 “Data Transformation → Manipulation → Project Columns” 節點路徑,拖放兩個 “Project Columns” (或 “Select Columns in Dataset”) 模組。一個是 “Project Columns” 模組下 “Linoise.csv” 模組,另一個是 “Score Model” 模組,如下所示。21
  8.  
  9. 使用 “Project Columns” 模組,將 “linoise.csv” 到 “Score Model” 和 “Score Model” 到 “Web service output” 模組之間的輸入輸出端口連接起來,如下圖所示。22
  10.  
  11. 點選第一個 “Project Columns” 模組,然後點擊屬性窗口中的 “Launch column selector” 按鈕。23
  12.  
  13. 在彈出窗口中選擇 “X” 列。24
  14.  
  15. 第二個 “Project Columns” 模組做相同的步驟。請選擇 “Scored Labels” 列當作輸出。25
  16.  
  17. 按 “RUN” 執行變更後的實驗。26
  18.  
  19. 再次點擊 “Deploy Web Service” 按鈕。27
  20.  
  21. 在確認信息時,點擊 “Yes” 覆蓋原有的 Web 服務。28
  22.  
  23. 再次發佈 “Web service” 並自動切換到 “Dashboard” 頁有 “Test” 按鈕存在的地方。按一下 “Test” 按鈕。是的,你會看到只有 “x” 參數作為輸入,輸入任何數值再按右下角的打勾記號按鈕。29
  24.  
  25. 幾秒鐘後, Web 服務的輸出會出現在頁面底部的通知欄中。按一下 “Details” 連結。30
  26.  
  27. 你會看到 “Scored Label” 作為 JSON 輸出。現在我們有我們所期望的 Web 服務工作。31

 

2.4 在 C# 應用程序使用 ML Web Service

上一節中,我們透過入口網站測試了我們新的 ML web service。在接下來的步驟中,我們將展示如何將 Web 服務整合成到一個 C# 主控台應用程式。

  1. 打開 Visual Studio 2015 (Community edition 或更高版本)32

  2. 創建一個新專案。

  3.  

  4. 選擇 C# 控制台應用程序,創建一個空白的應用程式模板然後點擊確定。33

  5.  

  6. 創建專案後,在 “方案總管” 視窗中,在專案名稱 “ConsoleApplication1”(如果你沒有更改預設的專案名稱)按右鍵,並在彈出功能表中選擇 “管理 NuGet 套件...” 項目。34

  7.  

  8. “NuGet 封裝管理員” 視窗將在新標籤中打開。在搜索框中輸入 “Microsoft.AspNet.WebApi.Client” 來過濾特定的封裝,然後按一下 “安裝” 按鈕進行安裝此封裝軟體。這個封裝會利用 JSON 格式透過網路與 Web 服務進行資料交換。35

  9.  

  10. 安裝封裝軟體後,切換到 “Program.cs” 檔案上,或在 “方案總管” 視窗中按兩下 “Program.cs” 檔的名稱。在這裡我們將輸入我們 C# 下的命令來調用 Web 服務並顯示結果。

  11.  

  12. 我們將在 “Program.cs” 檔寫入的 C# 代碼,實際上在 Azure 的 ML portal 都準備好了。切換回上一節所做的測試,我們在 Azure ML portal 的 Web 服務頁面。在此 Web 服務頁上,按一下 “Default Endpoint” 下的 “REQUEST/RESPONSE” 連結。36

  13.  

  14. 新的 web 頁 “Request Response API Documentation for Lab04” 將會打開。滾動到 “Sample Code” 這一節或按一下頁面最上方可以轉到 Sample Code 的 “Sample Code” 連結。37

  15.  

  16. 在 “Sample Code” 中,C# 標籤預設被選中的。點擊此部分右上角的 “Select sample code” 按鈕,按下 CTRL + C 組合鍵複製到剪貼簿中。38

  17.  

  18. 刪除在 Visual studio 中 “Program.cs” 檔的所有內容,再黏貼複製的代碼。39

  19.  

  20. 現在我們需要在我們複製/黏貼的代碼中做一些簡單的改變。找出開頭為以下的程式碼︰

    const string apiKey ="abc123";

  21. 在這一行,我們需要更換 “abc123” 字符串。這有點像一個密碼來訪問我們的 Web 服務,如果沒有此金鑰/密碼,它是不可能調用我們的 Web 服務。此密碼是強制性的,否則任何人知道 Web 服務的位址都可以多次調用 Web 服務,這將增加在 Azure 中 ML 服務的成本。

  22.  

  23. 返回到 Azure 的 ML web 服務頁面,然後複製 “API key” 或密碼。更換上面的 “abc123” 字符串。40

  24.  

  25. 現在,我們已準備好運行範例 C# 應用程式的功能。按 CTRL + F5 組合鍵或從命令功能表路徑點選 “偵錯 → 啟動但不偵錯”。然後程式的執行輸出會印在另一個開起的主控台視窗上。你將看到41sample code“x”“x”

  26.  

  27. 兩個輸出,這是因為在

  28. 中我們發送兩個相同的 

  29. 值作為輸入,你也可以更新代碼看是要發送一個 

  30. 值或多個。

  31.  

  32. 更新代碼,所以我們將發送三個 “x” 值︰-93、15 和 174。請找到開頭是以下的程式碼︰new string"0""0"new string"-93""15""174"

  33. Values =

  34. [,] { {

  35. }, {

  36. } , }

  37.  

  38. 修改成:

  39.  

  40. Values =

  41. [,] { {

  42. }, {

  43. }, {

  44. }, }

  45.  

  46. 再次運行更新後的代碼,值為︰-93、15 和 174,你會看到來自 Web 服務相對應的 3 個輸出︰42

 

2.5 web service 的輸入資料類型

在前面的例子中,我們使用整數資料類型作為輸入值。那有關浮點數資料類型是什麼?

  1. 無論是使用基於 web 的測試形式或 C# 主控台應用程式,輸入一個浮點數。按下右下角的打勾記號按鈕。4344
  2.  
  3. 幾秒鐘後,你會得到一個錯誤資訊在通知區域,說明過程中提供的輸入值不是正確的資料格式。
  4.  
  5. 為了解決這個錯誤,從 “Data Transformation → Manipulation” 節點路徑拖放 “Metadata Editor” 模組,再將 “Metadata Editor” 模組連接 “Project Columns” 和 “Score Model” 模組之間。45
  6.  
  7. 切換到 “Metadata Editor” 模組的屬性視窗。按一下 “Launch Column Selector” 按鈕,選擇 “x” 列,然後按一下右下角打勾記號按鈕。46
  8.  
  9. 同樣在 “Properties” 視窗中,將 “Data type” 屬性更改成 “Floating point”。47
  10.  
  11. 修改完所有後,“RUN” 實驗,然後再次發佈。現在你可以使用浮點數作為輸入值。

 
 
 
 
原文:004-lab-azureml-experiment
 
 
翻譯:
Wang Alice