Azure Machine Learning Studio เบื้องต้น

  1. สร้าง Azure ML Studio Account
  2. ทดลองใช้ Azure ML Studio
  3. Deploy เว็บเซอร์วิส
  4. ทดสอบเว็บเซอร์วิส
  5. ดู headers และตัวอย่างการเรียกเว็บเซอร์วิส

1.สร้าง Azure ML Studio Account

การเข้าใช้งาน Microsoft Azure Machine Learning Studio มี account อยู่ 3 ปรเภท คือ Guest workspace, Free workspace และ Standard workspace

ถ้าลงชื่อเข้าใช้ด้วย Microsoft account จะได้เป็น Free workspace

Guest workspace

  • 8-hour trial
  • No sign-in required
  • Can build machine-learning models in minutes
  • Full range of available machine-learning algorithms

Free workspace

  • Sign in with a Microsoft account
  • Free access with no expiration
  • 10 GB of free storage
  • Support for both Python and R scripts
  • Predictive web services

Standard workspace

  • Azure subscription required
  • $9.99 per month
  • Full SLA (service-level agreement) support
  • Bring your own Azure storage
  • Parallel graph execution
  • Elastic web service endpoints
  • Ideal for enterprise-grade usage

แต่ถ้าจะใช้แบบ Standard workspace ให้เข้าไปที่ Portal แล้วเลือกเมนู Create a resource แล้วพิมพ์ Machine Learning Studio Workspace ก็จะมีให้เลือกหลายราคา

2.ทดลองใช้ Azure ML Studio

ดาว์นโหลดไฟล์ข้อมูลตัวอย่าง

ไฟล์ Building Data.csv ข้อมูลมี 768 แถว และ 5 คอลัมน์ WallArea, RoofArea, OverallHeight, GlazingArea และ HeatingLoad

Upload dataset

ที่เมนูทางซ้ายเลือก DATASETS และที่ด้านล่างเลือก New

ทำการ upload ไฟล์ Building Data.csv โดยเลือก DataSet > From Local File

ทำการทดลอง

ที่เมนูทางซ้ายเลือก EXPERIMENTALS และที่ด้านล่างเลือก New > Blank Experiment.

จะได้หน้าตาประมาณนี้

โดยมีเมนูย่อยของ EXPERIMENTALS เพิ่มมาประมาณนี้

ต่อไปจะเลือก operation มา 6 อันดังนี้

  1. Saved Datasets > My Datasets > Building Data.csv
  2. Data Transformation > Sample and Split.> Split Data
  3. Train > Train Model
  4. Machine Learning > Initialize Model > Regression > Decision Forest Regression
  5. Machine Learning > Score > Score Model
  6. Machine Learning > Evaluate > Evaluate Model

1.เลือกดาต้าเซ็ต Saved Datasets > My Datasets > Building Data.csv

Drag ดาต้าเซ็ตไปงางที่ designer surface

2.เลือก Data Transformation > Sample and Split.> Split Data

ลากเส้นเชื่อม เสร็จแล้วเลือกที่ Split Data แล้วดูที่ทางขวา กำหนดให้ fraction of rows in the first output dataset เท่ากับ 0.7 ซึ่งก็คือการแบ่งข้อมูลเป็น 70/30

3.เลือก Train > Train Model

ลากเส้นต่อ output 1 ของ Split Data ไปที่ Train Model

เลือก Train Model แล้วทางขวาเลือก Launch Column Selector

เลือก With Rules เลือก dropdown empty column และเลือก Wall Area 

เสร็จแล้วคลิกที่เครื่องหมายถูก

4.เลือก Machine Learning > Initialize Model > Regression > Decision Forest Regression เสร็จแล้วลากเส้นเชื่อมต่อ

5.เลือก Machine Learning >  Score > Score Model เสร็จแล้วลากเส้นเชื่อม

6.เลือก Machine Learning > Evaluate > Evaluate Model เสร็จแล้วลากเส้นเชื่อมต่อ

ที่ด้านล่างกดปุ่ม Run

เมื่อรันเสร็จจะเห็นไอคอนเขียวที่แต่ละ operation

และทางขวาจะขึ้น STATUS CODE เป็น Finished

กด SAVE AS ที่ด้านล่าง แล้วตั้งชื่อโปรเจ็กส์

3.Deploy เว็บเซอร์วิส

เปิดโปรเจ็กส์มา แล้วดูว่าทางขวาขึ้น STATUS CODE เป็น Finished มั๊ย

ถ้าใช่ก็ดูที่ด้านล่างแล้วกดปุ่ม Set Up Web Service > Predictive Web Service [Recommended].

โมเดลจะแปลงร่างเป็นประมาณนี้

กดปุ่ม RUN

เมื่อรันเสร็จ Score Model จะขึ้นเครื่องหมายถูกสีเขียว และทางขวาจะขึ้น STATUS CODE เป็น Finished

4.ทดสอบเว็บเซอร์วิส

ที่ด้านล่างเลือกปุ่ม Deploy Web Service จะได้หน้าตาประมาณนี้

ที่ด้านล่าง ถัดจาก Request/Response ให้กดปุ่ม Test

ลองใส่ค่า แล้วคลิกที่เครื่องหมายถูก

  • Wall area: 296
  • Roof area: 110.25
  • Overall height: 7
  • Glazing area: 0
  • Heating load: 15.55

ที่ด้านล่างเหนือปุ่ม NEW จะเห็นแบบนี้

กด Details จะเห็น response ที่ส่งกลับมา

Result: {"Results":{"output1":{"type":"table","value":{"ColumnNames":["WallArea","RoofArea","OverallHeight","GlazingArea","HeatingLoad","Scored Label Mean","Scored Label Standard Deviation"],"ColumnTypes":["Double","Double","Double","Double","Double","Double","Double"],"Values":[["296","110.25","7","0","15.55","0.482142857142857","0.0691609440506184"]]}}}}
{
    "Results": {
        "output1": {
            "type": "table",
            "value": {
                "ColumnNames": [
                    "WallArea",
                    "RoofArea",
                    "OverallHeight",
                    "GlazingArea",
                    "HeatingLoad",
                    "Scored Label Mean",
                    "Scored Label Standard Deviation"
                ],
                "ColumnTypes": [
                    "Double",
                    "Double",
                    "Double",
                    "Double",
                    "Double",
                    "Double",
                    "Double"
                ],
                "Values": [
                    [
                        "296",
                        "110.25",
                        "7",
                        "0",
                        "15.55",
                        "0.482142857142857",
                        "0.0691609440506184"
                    ]
                ]
            }
        }
    }
}

5.ดู headers และตัวอย่างการเรียกเว็บเซอร์วิส

ที่ด้านล่าง คลิกที่ REQUEST/RESPONSE จะเปิดหน้าแสดง Request และ Response พร้อมตัวอย่างการเรียกเว็บเซอร์วิสในภาษา C#, Python และ R

C#

// This code requires the Nuget package Microsoft.AspNet.WebApi.Client to be installed.
// Instructions for doing this in Visual Studio:
// Tools -> Nuget Package Manager -> Package Manager Console
// Install-Package Microsoft.AspNet.WebApi.Client

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace CallRequestResponseService
{

    public class StringTable
    {
        public string[] ColumnNames { get; set; }
        public string[,] Values { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            InvokeRequestResponseService().Wait();
        }

        static async Task InvokeRequestResponseService()
        {
            using (var client = new HttpClient())
            {
                var scoreRequest = new
                {

                    Inputs = new Dictionary<string, StringTable>() { 
                        { 
                            "input1", 
                            new StringTable() 
                            {
                                ColumnNames = new string[] {"WallArea", "RoofArea", "OverallHeight", "GlazingArea", "HeatingLoad"},
                                Values = new string[,] {  { "0", "0", "0", "0", "0" },  { "0", "0", "0", "0", "0" },  }
                            }
                        },
                    },
                    GlobalParameters = new Dictionary<string, string>()
                    {
                    }
                };
                const string apiKey = "abc123"; // Replace this with the API key for the web service
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);

                client.BaseAddress = new Uri("https://ussouthcentral.services.azureml.net/workspaces/400f621e44994f38a4db6d9e84661453/services/425b916abbd04404b04b7f531b8f6139/execute?api-version=2.0&details=true");

                // WARNING: The 'await' statement below can result in a deadlock if you are calling this code from the UI thread of an ASP.Net application.
                // One way to address this would be to call ConfigureAwait(false) so that the execution does not attempt to resume on the original context.
                // For instance, replace code such as:
                //      result = await DoSomeTask()
                // with the following:
                //      result = await DoSomeTask().ConfigureAwait(false)


                HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest);

                if (response.IsSuccessStatusCode)
                {
                    string result = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Result: {0}", result);
                }
                else
                {
                    Console.WriteLine(string.Format("The request failed with status code: {0}", response.StatusCode));

                    // Print the headers - they include the requert ID and the timestamp, which are useful for debugging the failure
                    Console.WriteLine(response.Headers.ToString());

                    string responseContent = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(responseContent);
                }
            }
        }
    }
}

ถ้าไม่ใส่ apikey ก็จะ error Unauthorized แบบนี้

The request failed with status code: Unauthorized
x-ms-request-id: dce81895-0dca-460f-93f9-ef14c61e06a9
Date: Wed, 19 Jun 2019 07:41:54 GMT
Server: Microsoft-HTTPAPI/2.0

{"error":{"code":"Unauthorized","message":"Request is unauthorized to access resource.","details":[{"code":"ScoreRequestUnauthorized","message":"Invalid credentials provided."}]}}

พอใส่ apikey ก็ใช้ได้ทันที

Result: {"Results":{"output1":{"type":"table","value":{"ColumnNames":["WallArea","RoofArea","OverallHeight","GlazingArea","HeatingLoad","Scored Label Mean","Scored Label Standard Deviation"],"ColumnTypes":["Double","Double","Double","Double","Double","Double","Double"],"Values":[["0","0","0","0","0","0.0178571428571429","0.0570318019799027"],["0","0","0","0","0","0.0178571428571429","0.0570318019799027"]]}}}}