Connect(); Special Issue 2018

第 33 卷 13

機器學習服務-加速自動化的機器學習與 AI 解決方案

藉由Krishna Anumalasetty;特殊問題 2018

機器學習 (ML) 用於各種不同的應用程式,從獨立的汽車和信用卡詐騙偵測,以在製造和更新版本的預測性維護。

但還有一個問題。建置 ML 解決方案很複雜,而且需要高技能與 Ph.D.s 人員數學或其他數量的欄位。適用於資料科學家需求有 outpaced 供應,禁止的 ML 企業採用。許多公司都有大量的存放區的資料,但它們無法採用改進商務決策並達成成功的預測性分析。

在 Azure Machine Learning 中的自動化的 ML 功能被設計來克服這些障礙,並使人工智慧的每位開發人員和每個組織更容易存取。在本文中,我將示範如何自動化的 ML 可用來快速建置能源需求預測解決方案。

機器學習服務生命週期

看看資料科學生命週期程序中所示**[圖 1**。它會將生命週期分成四個階段:了解,商業資料擷取與了解,模型、 部署。每個 ML 方案應該開始使用您正在努力解決商務問題 — 也就是了解商務階段。接下來,取得,並瀏覽資料,資料擷取與了解步驟,才能匯入可能會在各種不同格式的資料來源中未經處理資料。擷取、 探索和取消 duping 有些資料在資料擷取與了解的活動。

資料科學生命週期程序
[圖 1 的資料科學生命週期程序

模型化階段有三個步驟,開始的特徵工程設計程序。這裡可能會將資料轉換成新的功能,並產生全新的功能。功能會影響預測的預測值。了解功能的簡單方法是估計的大小和位置的房子、 房間、 數目以及其他因素會影響的房屋價格為例。因此,如果您要產生 ML 模型来預測的房屋值,這些因素都是功能。

接下來是模型定型程序 (在模型化階段),藉由將許多不同的演算法和超參數套用至資料集來建置 ML 模型。此程序牽涉到評估不同的模型,您已建置來選出最適合目前的應用程式。從該處,您可以測試並最後將模型部署到生產環境,它用於從新的資料執行預測。

一次在部署階段中,您必須監視 drifts,模型 drifts 觸達特定臨界值,或當新的資料清楚預期的情況下,不執行模型時,會定期重新訓練。

現在,我們來看看如何自動化的 ML 協助建立 ML 模型。第一個步驟是安裝 Azure Machine Learning Python 程式庫的集合。自動化的 ML 程式庫會包含和 Azure ML 程式庫的一部分,會用於您的 ML 指令碼。

身為開發人員,如果您熟悉語言如C#或 Java 中,您應該能夠掌握在 Python 中的任何時間。您可以安裝 Azure ML SDK,其中包含您電腦上的自動化的 ML 程式庫,不過,為了簡單起見我們將使用 Azure Notebooks,這是一項 Azure 服務來裝載 Jupyter Notebook。Jupyter Notebook 是常用的 ML 開發解決方案的資料科學家的互動式筆記本環境。您可以深入了解使用 Jupyter Notebook 從在 2018 年 2 月 MSDN 雜誌的 Frank La Vigne 的人工智慧專欄 (msdn.com/magazine/mt829269)。

自動化的 ML 程式庫可以自由使用且已預先安裝於 Azure Notebook 服務,而不需要安裝程序。Azure Notebooks 使用您的 Microsoft 帳戶登入。如果您已經有 Azure 訂用帳戶,您可以使用 Azure Active Directory (Azure AD) 帳戶 (如果與 Azure AD 同盟的組織可能會與您的公司認證相同)。

使用您的 Azure 訂用帳戶識別碼設定 ML 工作區,您可以共用及共同作業與小組成員透過 Azure 入口網站中,或是透過 API,就像這樣:

ws = Workspace.create(name = "energy_ml_ws",
                      subscription_id = "<azure_subscription_id>",
                      resource_group = "energy_ml_rg",
                      location = "eastus",
                      create_resource_group = True,
                      exist_ok = True)

能源需求預測

完成建立工作區,讓我們可以使用上的商務問題 — 能源需求預測功能時間序列資料的範例。時間序列預測是預測未來值按時間排序的觀察值序列中的工作。它是常見的問題,並有許多產業中的應用程式。例如,零售公司需要預測未來的產品銷售,因此它們可以組織其供應鏈來滿足需求。同樣地,包裹遞送公司需要評估對其服務的需求,好讓他們進行人力需求和遞送路線,事先規劃。在許多情況下,由於預測失準的財務影響很可觀,讓預測的商務關鍵性的活動。

這當然適用於能源公用程式,必須維持在方格上耗用的能源與提供給它的能源之間的微妙平衡。購買過多的電力,操作員必須儲存過多的能源成本。購買太少,它可能會導致停電,讓客戶在黑暗中。網格操作員可以進行短期決策,管理格線的能源供應並保持負載平衡,但精確的預測能源需求,請務必讓運算子有信心地做出這些決定。

資料擷取

讓我們逐步解說如何使用 ML 建置能源需求預測解決方案。沒有可使用從 New York 獨立系統運算子 (NYISO),來操作的紐約州的電力網格的公用資料集。資料集有一段五年每小時電力需求資料,紐約市。

NYISO 資料集在 MWh 中有時間戳記和能源需求,以每小時為增量單位從 2012年到 2017年。若要檢查,並瀏覽資料,我們第一次讀取至 Pandas 資料框架是在 Azure Blob 儲存體中的資料。Pandas 資料框架相當熱門 ML 社群,並提供簡單的方法來操作資料。以下是匯入的程式碼:

import pandas as pd
demand = pd.read_csv(
  "https://antaignitedata.blob.core.windows.net/antaignitedata/nyc_demand.csv",
  parse_dates=['timeStamp'])

讓我們叫用資料框架,其會列印前幾個資料列,並產生具有時間戳記和能源需求值的簡單資料表上的前端方法列印前的幾個資料列的資料。如果我繪製在 2017 年 7 月中一週內的能源需求圖表時,它會導致一個折線圖,其中顯示七天期間的變動每小時的值。為此我可以使用 matplotlib,程式庫,可協助您輕鬆地繪製在 Jupyter Notebook 中的圖表。請看看下面這個程式碼:

plt_df = demand.loc[(demand.timeStamp>'2016-07-01') & (demand.timeStamp<='2016-07-07')]
plt.plot(plt_df['timeStamp'], plt_df['demand'])
plt.title('New York City power demand over one week in July 2017')
plt.xticks(rotation=45)
plt.show()

當然,氣象有直接的影響的能源耗用量。最忙碌的一天中,使用空調會大幅增加電力需求。因此,其他的資料集,其中包含每小時天氣狀況的紐約市透過相同的時間期間可用來改善預測。我可以從 darksky.net 存取天氣資料。現在,我將讀入資料框架的天氣資料集,並藉此強化 NYISO 資料集與天氣資料合併兩個資料集,使用下列程式碼:

weather = pd.read_csv(
  "https://antaignitedata.blob.core.windows.net/antaignitedata/nyc_weather.csv",
  parse_dates=['timeStamp'])
df = pd.merge(demand, weather, on=['timeStamp'], how='outer')

產生的合併資料集看起來會類似於資料表中**[圖 2**,以有效地新增天氣資訊 — 降雨和溫度 — NYISO 資料集。若要查看資料的前幾個資料列,叫用之資料框架前端方法。

能源需求的資料集與天氣資料集的合併
[圖 2 能源需求資料集與天氣資料集的合併

模型化

現在我們來到模型化步驟中,這牽涉到三個領域: 功能工程、 模型訓練和模型評估。這是資料科學家花大部分時間,而它是其中自動化的 ML 可真正幫助簡化。

我使用的資料集是時間序列資料,需要我產生功能。時間序列資料的典型功能是日期時間的功能、 延隔時間特徵和視窗功能。為了簡單起見,我將不會進入延隔時間特徵或視窗功能。自動化的 ML 會自動產生日期時間的功能,不必手動產生這些。它也會執行前置處理工作的許多資料。比方說,自動化的 ML 可以推算遺漏值的資料集內。如果我檢查資料集進一步我發現,有幾個遺漏資料列的資料集,以及幾個遺漏值,以及。下列程式碼中,您可以看到 49175 該資料列包含遺漏值,由"nan"代表 「 不是數字 」:

df.iloc[49175].values

行的輸出如下所示:

array([Timestamp('2017-08-11 01:00:00'), nan, 0.0, 69.26], dtype=object)

接下來,我需要將資料集分割成訓練資料集和測試資料集。訓練資料集用來建立模型。一旦定型,我需要測試使用測試資料集來評估效能,以及確保令人滿意後再部署模型的模型。分割可以是隨機的但在能源耗用量資料的情況下沒有季節性,我想策略性地分割資料集。設定教育訓練資料集的一小部分擱置在一旁當做驗證資料集。訓練資料集用來定型模型。驗證資料集用來將模型一般化,讓模型不 「 過度調整 」 的定型資料。這有助於確定也在新的資料而不只是定型資料,也會執行模型。

現在,我正在處理要預測的資料行是需求。我將移至其本身向量"y,"稱為標籤資料行的需求值。我要設定保留為我的測試資料集比 2017 年 7 月 1 日起的任何資料。早於 2017 年 7 月 1 日起,即為訓練資料的所有資料。此處的程式碼會顯示此:

train, test = (df.loc[df['timeStamp']<'2016-07-01'],
  df.loc[df['timeStamp']>='2016-07-01'])

讀入資料框架的資料有標籤 (我想要預測的資料行) 的功能。我需要將標籤資料行移至其本身向量 y,就像這樣:

X = train.drop(['demand'], axis=1)
y = train['demand']
y = y.values

設定驗證資料集訓練資料集內。時間序列資料,以驗證資料集通常是在特定期間內。以下是如何進行分割:

split_index = int(X.shape[0] * 0.9)
X_train = X[0:split_index]
y_train = y[0:split_index]
X_validation = X[split_index+1:]
y_validation = y[split_index+1:]

已完成模型的功能工程部分。

模型訓練

使用者所面臨的下一個選擇決定哪一個演算法適用於資料集。複雜度可能是個問題這裡還有許多演算法可供選擇,包括支援向量機器 (SVM),如套索迴歸、 山脊型迴歸和更多功能。除此之外,每個演算法都有必須進行微調的超參數。針對每種演算法的超參數可以是無限的集合,這表示演算法組合的和超參數是無限本身。因此,理論上您會需要建置了無數個來找出最佳的模型。

使用者會結合功能、 學習者 (演算法) 和超參數,建立用於特定的商務問題的多個模型,讓它們最終可以找到會產生最佳精確度的其中一個。建置多個模型和評估它們是手動、 既費時又繁瑣的工作,可以採取數週或甚至是幾個月。除此之外,您需要維護的解決方案和部署的模型。隨著資料演進,您需要定期執行的模型建立程序一次。建立單一模型牽涉到的特徵工程設計、 可供選取演算法和超參數微調的工作。若要取得良好的執行模型,您需要建置和評估數個模型,並重複執行這些繁瑣的工作。

對於所發生的資料科學中,自動化的 ML 簡化,並藉由執行特徵工程、 演算法和超參數選取排除手動處理和微調,以提升產能和節省時間。對於新的資料科學家,可供選取演算法和超參數微調的抽象概念會簡化複雜度,並可協助您快速建立 ML 解決方案。

以使用者身分,我想要儲存所有我建立了,所有定型工作的歷程記錄以及我如何我這裡的記錄,並可以回頭參考它時所需的 ML 模型。若要這樣做,請讓我們建立專案資料夾,其中儲存的所有成品,以及實驗物件建立關聯的自動化 ML 訓練作業的所有執行歷程記錄。首先,我建立的專案資料夾來儲存所有與專案相關檔案,就像這樣:

project_folder =
  './sample_projects/automl-energydemandforecasting'

然後,我會選擇執行歷程記錄容器的名稱,請在工作區,以下列程式碼中:

experiment_name = 'energy_ml_exp'

接下來,我將建立實驗物件,並將它與工作區產生關聯。請看看下面這個程式碼:

experiment=Experiment(ws, experiment_name)

從該處,自動化的 ML 必須只有兩個步驟來建立模型,才能設定 AutoMLConfig 物件及執行實驗。[圖 3顯示自動化 ML 的概念表示。

現在,讓我們設定自動化的 ML 設定並提交自動化的 ML 實驗。請看看下面這個程式碼:

[圖 3 概念自動化機器學習服務圖表

automl_config_local = AutoMLConfig(task = 'regression',
                              debug_log = 'automl_errors.log',
                              primary_metric = 'spearman_correlation',
                              iterations = 150,
                              X = X_train,
                              y = y_train,
                              X_valid = X_validation,
                              y_valid = y_validation,
                              preprocess = True,
                              path=project_folder)

請注意,在組態設定,設定反覆項目 = 150。我可以設定反覆項目數目為 150,因為自動化的 ML 會產生 150 不同的演算法和超參數,到 150 不同的模型做為目標的組合。自動化的 ML 本身會使用數以百萬計的管線中的已訓練的 ML 模型。使用矩陣分解的技巧,自動化的 ML 產生演算法和超參數組合以智慧的方式,導致更快收斂最佳的模型上。此外,設定前置處理 = True 的觸發程序自動化 ML 以執行資料前置處理和功能工程工作。這包括產生輸入遺漏的值,將類別值轉換成一個熱編碼的日期時間功能等等,全部都不需要手動進行這些資料科學家。

現在您可以完成的第二個步驟,提交自動化的 ML 實驗,就像這樣:

local_run = experiment.submit(automl_config_local, show_output=True)

此時自動化的 ML 會產生一組的演算法和超參數的組合。定型的模型是 Azure 虛擬機器上 Azure Notebooks 服務所管理。自動化的 ML 可讓您選擇執行模型定型作業,在您的本機電腦上或在 Azure 雲端相應增加和相應放大,視需要針對其他的效能。您可以在叢集上,以平行方式執行這些反覆項目。您可以監視在 Azure 入口網站或透過小工具延伸模組 SDK 隨附的 Jupyter Notebook 中的回合的進度。自動化的 ML 評估產生的模型,根據您的準則,並可以轉譯的效能的順序顯示之模型的排行榜。

您也可以檢閱每個模型的各種不同的圖表,並檢查不同的計量,來協助進行決策。在其中精確度是非常重要的情況下,您可以進一步微調以手動方式來改善其效能產生的模型。

自動化的 ML 所產生的模型會以格式序列化的 python 物件儲存在永久性儲存體,在 Azure 中,所有呼叫 PKL。

模型評估和測試

現在,自動化的 ML 已經產生高品質的模型,讓我們使用已擱置在一旁的測試資料上執行預測。首先,我必須從所產生的所有模型中選取最佳模型,使用下列程式碼:

best_run, fitted_model = local_run.get_output()
print(best_run)
print(fitted_model)

會產生下列程式碼,描述自動化 ML 所產生的最佳模型:

Run(Experiment: enery_ml_exp, Id: AutoML_dc619226-fbdb-41e6-872c-6c59ab2b5209_1,
  Type: None, Status: Completed) Pipeline(memory=None, steps=[('datatransformer',
  DataTransformer(logger=None, task=None)), ('sparsenormalizer',
  <automl.client.core.common.model_wrappers.SparseNormalizer object at
  0x7f7f87ee3828>), ('decisiontreeregressor',
  DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=0.2,
  max_leaf_node... min_weight_fraction_leaf=0.0, presort=False,
  random_state=None, splitter='best'))])

請注意,雖然我已被呼叫這些模型,它們實際上包含資料必須移到其中的所有前置處理轉換的管線。現在讓我們來測試模型來產生預測資料的實際資料的圖表的比較測試資料上執行預測。使用下列程式碼:

x_test = test.drop(['demand'], axis=1)
y_test = test['demand']
y_pred_test = fitted_model.predict(x_test)
y_residual_test = y_test - y_pred_test
plt.plot(x_test['timeStamp'], y_test, label='Actual')
plt.plot(x_test['timeStamp'], y_pred_test, label="Predicted")
plt.xticks(rotation=90)
plt.title('Actual demand vs predicted for test data ')
plt.legend()
plt.show()

使用一些更多的特徵工程設計且使用的延隔時間特徵,此模型可以更進一步提升。接下來,我們可以預期自動化的 ML 發展到自動執行特性工程設計,包括延隔時間特徵產生的多區域。

總結

自動化的 ML 可讓您建置 ML 模型只是幾個簡單步驟。我們讓建置 ML 模型存取真正普及的目標 AI 開發人員的早期階段中。您可以找到許多範例和教學課程使用的自動化在 ML aka.ms/AutomatedMLDocs


Krishna Anumalasetty開始從事過去的七年來,具有四個的 ML 及 AI 的 Azure 和雲端服務中的專案經理。Anumalasetty 是在 Azure 中 AI 堆疊的一部分 incubated 自動化的 ML 程式經理。他曾經讓企業卓越的功能,例如加密 @REST 資料保護、 VNET 功能、 與內部部署連線能力、 Azure Active Directory 整合等等的混合式案例。他目前正努力擴充自動化的 ML 功能搭配深入學習。

感謝下列 Microsoft 技術專家來檢閱這篇文章:Sujatha Sagiraju,Bharat Sandhu
Bharat Sandhu 是產品 Azure (&) Advanced Analytics 行銷總監。檢查員會專注於讓組織得以潛力 AI 轉換業務。之前他目前的角色,他已保留在企業銷售與業務開發各種新興的技術的 Microsoft 和 National Instruments 的角色。  Bharat 保存 B.S.電腦工程從 Texas A&m 大學和從 INSEAD 的 mba 學位。

Sujatha Sagiraju 是 Azure 雲端及 AI 的群組中的群組計畫經理,Microsoft 使用經驗。建置大規模的分散式系統處於其專業知識。她最新的熱情是加速,democratizing 透過自動化的機器學習服務 AI。


MSDN Magazine 論壇中的這篇文章的討論