Leo Yeh's Blog

SAS Viya (135)

教學目標

初步了解如何透過 sasctl 開源 Python 函式庫進行進行完整的模型管理生命週期之基本概念。

重點概念

首先在 SAS Viya 分析平台中除了直接透過 REST API 直接存取 SAS Viya 分析平台之外,我們更能夠透過 sasctl 開源 Python 函式庫,撰寫以下官方範例程式碼 就能夠很簡單的將 scikit-learn 所提供的波士頓房價預測案例透過 SAS Model Manager 進行完整的模型管理生命週期,所謂波士頓房價資料集包含有關波士頓不同房屋的資訊,該機器學習資料集中主要有 506 個樣本和 13 個輸入的變數特徵和輸出的變數目標主要是使用給定的特徵預測房屋價格的價值,此資料集源自於 1978 年 D.Harrison 和 D.Lubinfeld 兩位學者所發表「Hedonic housing prices and the demand for clean air」的期刊論文,最初取自卡内基梅隆大學所維護的的 StatLib 函式庫中,並且能夠從 UCI 機器學習倉庫中下載資料集,同時也在 2016 年為 Kaggle 所舉辦的競賽項目之一,以及現今我們更夠從 scikit-learn 函式庫中匯入這個機器學習資料集訓練模型。此外更能夠透過 sasctl 開源 Python 函式庫連線至 SAS Viya 進行完整的模型管理生命週期,請注意使用前必須先修改「Session(‘hostname’, ‘username’, ‘password’)」程式碼中的「hostname」、「username」和「password」的值,分別為 SAS Viya 分析平台的主機名稱、使用者帳號和使用者密碼。

說明資料集

編號 輸入/輸出 變數 類型 說明
1 輸入 CRIM Float 城鎮中人平均犯罪率。
2 輸入 ZN Float 占地面積超過 2.5 萬平方英尺的住宅用地比例。
3 輸入 INDUS Float 城鎮非零售業務地區的比例。
4 輸入 CHAS Integer 查爾斯河 (1:土地在河邊,0:土地不在河邊)。
5 輸入 NOX Float 一氧化氮濃度 (每 1,000 萬份)。
6 輸入 RM Float 平均每個居民的房數。
7 輸入 AGE Float 在 1940 年之前建成的擁有者所占用單位的比例。
8 輸入 DIS Float 與五個波士頓就業中心的預期距離。
9 輸入 RAD Integer 輻射狀公路的可達性指數。
10 輸入 TAX Float 每 10,000 美元的全額物業稅率。
11 輸入 PTRATIO Float 城鎮師生比例。
12 輸入 B Float 1000 * ( Bk - 0.63 ) ^ 2 其中 Bk 是城镇中黑人的比例。
13 輸入 LSTAT Float 人口中少數民族人口的百分數。
14 輸出 MEDV Float 主要以 1,000 美元計算的自有住房的中位數。

範例程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python
# encoding: utf-8
#
# Copyright © 2019, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

import pandas as pd
import sklearn.datasets
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

from sasctl import Session
from sasctl.tasks import register_model, publish_model
from sasctl.services import model_repository as mr
from sasctl.services import model_management as mm

data = sklearn.datasets.load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=['Price'])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Establish a session with SAS Viya
Session('hostname', 'username', 'password')

project = 'Boston Housing'
model_name = 'Boston Regression'

# Fit a linear regression model using sci-kit learn
lm = LinearRegression()
lm.fit(X_train, y_train)

# Register the model in SAS Model Manager
register_model(lm,
model_name,
input=X,
project=project,
force=True)

# Update project properties
project = mr.get_project(project)
project['targetVariable'] = 'Price'
project = mr.update_project(project)


# Publish the model to the real-time scoring engine
module_lm = publish_model(model_name, 'maslocal')

# Select the first row of training data
x = X.iloc[0, :]

# Call the published module and score the record
result = module_lm.score(**x)
print(result)

# Build a second model
dt = DecisionTreeRegressor()
dt.fit(X_train, y_train)

# Register the second model in Model Manager
model_dt = register_model(dt, 'Decision Tree', project, input=X)

# Publish from Model Manager -> MAS
module_dt = publish_model(model_dt, 'maslocal')

# Use MAS to score some new data
result = module_dt.score(**x)
print(result)

輸出結果

1
2
30.11770550042609
30.11770550042609

請注意當執行之後因為已經建立專案、模型、績效任務和 MAS 發佈模型,所以當重覆執行第二次相同程式碼將會發生錯誤,此時需要就需要更改專案和模型名稱才能夠重新執行 Python 程式碼。此外此 Python 程式碼主要會建立回歸模型和決策樹模型,並且發佈至 MAS 服務之後,再透過 MAS 服務進行模型評分。

接著我們更進一步了解 Python 程式碼,將能夠分為以下執行階段,分別為:

使用 scikit-learn 函式庫建立擬合模型

1
2
3
4
5
6
data = sklearn.datasets.load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=['Price'])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
lm = LinearRegression()
lm.fit(X_train, y_train)

建立 SAS Viya 工作階段

1
Session('hostname', 'username', 'password')

在 SAS Model Manager 中註冊模型

1
2
3
4
5
6
7
project = 'Boston Housing'
model_name = 'Boston Regression'
register_model(lm,
model_name,
input=X_train,
project=project,
force=True)

更新專案屬性

1
2
3
project = mr.get_project(project)
project['targetVariable'] = 'Price'
project = mr.update_project(project)

將模型發佈到即時評分引擎

1
module_lm = publish_model(model_name, 'maslocal')

建立測試資料

1
x = X.iloc[0, :]

將測試資料以已發佈的模型進行評分

1
result = module_lm.score(**x)

其中我們將能夠發現在使用 sasctl 開源 Python 函式庫之前,我們將會先建立 SAS Viya 工作階段之後,才能夠使用 sasctl 開源 Python 函式庫中的模型管理方法功能。

再來在 sasctl 開源 Python 函式庫中主要分為核心服務任務三大類型的方法功能,核心類型主要用於建立工作階段,服務類型主要用於模型儲存體和模型管理,任務類型主要用於註冊模型和發佈模型,所以我們會在 Python 程式碼中以以下方式匯入 sasctl 開源 Python 函式庫。

1
2
3
4
from sasctl import Session
from sasctl.tasks import register_model, publish_model
from sasctl.services import model_repository as mr
from sasctl.services import model_management as mm

最後建議花些時間閱讀 sasctl 開源 Python 函式庫的程式碼,特別在於用於建立、更新和發佈的 REST API 功能,若僅參考 SAS 官方 REST API 文件將會花費許多時間進行測試,若是設定不正確將會發生 415 (Unsupported Media Type)、406 (Not Acceptable)、400 (400 Bad Request)、… 等 HTTP 錯誤代碼的資訊,像是發佈模型要設定正確的 Content Type、更新模型內容需要設定正確的 Etag、建立模型版本需要設定正確的 option 選項參數、… 等相關設定。此外程式碼不像文件很難被驗證和測試,但是在 Github 中的程式碼通常會被驗證和測試,因此發生錯誤的機率非常低,所以透過閱讀程式碼將能夠減少針對程式進行除錯的時間。

總結我們透過 sasctl 開源 Python 函式庫進行進行完整的模型管理生命週期,對於機器學習專家僅需要會 Python 程式碼就能夠以 SAS Viya 分析平台為基礎進行模型管理。

相關資源

⬅️ Go back