Share via


在 Machine Learning 工作室 (傳統) 中執行 Python 機器學習指令碼

適用於:適用於。Machine Learning 工作室 (傳統) 不適用於。Azure Machine Learning

重要

Machine Learning 工作室 (傳統) 的支援將於 2024 年 8 月 31 日結束。 建議您在該日期之前轉換成 Azure Machine Learning

自 2021 年 12 月 1 日起,您將無法建立新的 Machine Learning 工作室 (傳統) 資源。 在 2024 年 8 月 31 日之前,您可以繼續使用現有的 Machine Learning 工作室 (傳統) 資源。

ML 工作室 (傳統) 文件即將淘汰,未來將不再更新。

Python 是許多資料科學家的工具箱中一個實用的工具。 用於一般機器學習工作流程的每個階段,包括資料探索、特徵擷取、模型定型和驗證,以及部署。

本文描述如何使用「執行 Python 指令碼」模組,在 Machine Learning 工作室 (傳統) 實驗和 Web 服務中使用 Python 程式碼。

使用執行 Python 指令碼模組

工作室 (傳統) 中通往 Python 的主要介面是透過執行 Python 指令碼模組。 最多接受三個輸入,最多產生兩個輸出,類似於執行 R 指令碼模組。 Python 程式碼透過特殊命名的進入點函式 azureml_main,輸入至參數方塊。

執行 Python 指令碼模組

模組參數方塊中的範例 Python 程式碼

輸入參數

Python 模組的輸入公開為 Pandas DataFrame。 azureml_main 函式最多接受兩個選用 Pandas DataFrame 做為參數。

輸入連接埠和函式參數之間的對應是有位置關係的:

  • 第一個連接的輸入連接埠會對應至函式的第一個參數。
  • 第二個輸入連接埠 (如果連接) 會對應至函式的第二個參數。
  • 第三個輸入用來匯入其他 Python 模組

以下顯示更詳細的語意,指定輸入連接埠如何對應至 azureml_main 函式的參數。

輸入連接埠設定及產生的 Python 特徵標記表格

輸出傳回值

azureml_main 函式必須傳回以 Python 序列 (例如元組、清單或 NumPy 陣列) 封裝的單一 Pandas DataFrame。 此序列的第一個元素會傳回至模組的第一個輸出連接埠。 模組的第二個輸出埠用於視覺效果,且不需要傳回值。 此配置如下所示。

將輸入連接埠對應至參數,將傳回值對應至輸出連接埠

輸入和輸出資料類型的轉譯

工作室資料集與 Panda DataFrame 不同。 因此,工作室 (傳統) 中的輸入資料集會轉換為 Pandas DataFrame,而輸出 DataFrame 會轉換回工作室 (傳統) 資料集。 此轉換過程中也會執行下列轉譯:

Python 資料類型 工作室轉譯程序
字串和數值 轉譯為
Pandas 'NA' 轉譯為「遺漏值」
索引向量 不支援*
非字串資料行名稱 在資料行名稱上呼叫 str
重複的資料行名稱 新增數值尾碼:(1)、(2)、(3) 等等。

*Python 函式中所有輸入資料框架一律具有 64 位元數值索引,範圍從 0 到資料列數減 1

匯入現有的 Python 指令碼模組

用來執行 Python 程式碼的後端以 Anaconda 為基礎 (廣泛使用的科學 Python 發行版本)。 隨附以資料為中心的工作負載中將近 200 個最常用的 Python 封裝。 工作室 (傳統) 目前不支援使用 Pip 或 Conda 等封裝管理系統來安裝和管理外部程式庫。 如果您發現需要納入其他程式庫,請使用下列情節當作指南。

常見的使用案例是將現有 Python 指令碼納入工作室 (傳統) 實驗中。 執行 Python 指令碼模組在第三個輸入連接埠接受包含 Python 模組的 ZIP 檔案。 該檔案會由執行架構在執行階段解壓縮,且內容會新增至 Python 解譯器的程式庫路徑。 然後 azureml_main 進入點函式可以直接匯入這些模組。

以包含簡單 “Hello, World” 函式的 Hello.py 檔案為例。

Hello.py 檔案中的使用者定義函式

接下來,我們會建立包含 Hello.py 的 Hello.zip 檔案:

包含使用者定義 Python 程式碼的 ZIP 檔案

將 ZIP 檔案當作資料集上傳至工作室 (傳統)。 然後,建立並執行實驗,將 Hello.zip 檔案附加至執行 Python 指令碼模組的第三個輸入連接埠,以使用其中的 Python 程式碼,如下圖所示。

範例實驗,以 Hello.zip 為執行 Python 指令碼模組的輸入

以 ZIP 檔案上傳的使用者定義 Python 程式碼

模組輸出顯示 zip 檔案已解除封裝,且函式 print_hello 已執行。

模組輸出,顯示使用者定義函式

存取 Azure 儲存體 Blob

您可以使用下列步驟來存取儲存在 Azure Blob 儲存體帳戶中的資料:

  1. 在本機下載適用於 Python 的 Azure Blob 儲存體封裝
  2. 將 ZIP 檔案當作資料集上傳至工作室 (傳統) 工作區。
  3. protocol='http' 建立 BlobService 物件
from azure.storage.blob import BlockBlobService

# Create the BlockBlockService that is used to call the Blob service for the storage account
block_blob_service = BlockBlobService(account_name='account_name', account_key='account_key', protocol='http')
  1. 在儲存體 [組態] 設定索引標籤中停用 [需要安全傳輸]

在 Azure 入口網站中停用 [需要安全傳輸]

運作 Python 指令碼

當評分實驗中使用的任何執行 Python 指令碼模組發佈為 Web 服務時,系統會呼叫這些模組。 例如,下圖顯示評分實驗,其中包含程式碼來評估單一 Python 運算式。

Web 服務的工作室工作區

Python Pandas 運算式

從這個實驗建立的 Web 服務會採取下列動作:

  1. 接受 Python 運算式作為輸入 (字串形式)
  2. 將 Python 運算式傳送至 Python 解譯器
  3. 傳回包含運算式及評估結果的表格。

使用視覺效果

使用 MatplotLib 建立的繪圖可以由執行 Python 指令碼傳回。 不過,繪圖不會像使用 R 時一樣自動重新導向至影像。所以,使用者必須將任何繪圖明確儲存為 PNG 檔案。

若要從 MatplotLib 產生影像,您必須執行下列步驟:

  1. 將後端從預設 Qt 型轉譯器切換為 “AGG”。
  2. 建立新的圖表物件。
  3. 取得軸並在其中產生所有繪圖。
  4. 將圖表儲存為 PNG 檔案。

下圖說明此流程,其中使用 Pandas 的 scatter_matrix 函式建立散佈圖矩陣。

將 MatplotLib 圖表儲存為影像的程式碼

在執行 Python 指令碼模組上按一下視覺化來檢視圖表

使用 Python 程式碼來顯現範例實驗的繪圖

您可以將多個圖表儲存至不同影像,以傳回這些圖表。 工作室 (傳統) 執行階段會取出所有影像,並串連形成視覺效果。

進階範例

安裝在工作室 (傳統) 中的 Anaconda 環境包含常用的封裝,例如 NumPy、SciPy 和 Scikits-Learn。 這些封裝可以實際用於機器學習管線中處理資料。

例如,下列實驗和指令碼說明使用 Scikits-Learn 中的集成學習模組,以計算資料集的特徵重要度分數。 分數可用來執行監督式特徵選取,再送入另一個模型中。

以下 Python 函式是用於根據分數計算重要性分數及將功能排序:

依分數來排名特徵的函式

然後,下列實驗在 Machine Learning Studio (傳統) 中計算並傳回 “Pima Indian Diabetes” 資料集的特徵重要度分數:

此實驗使用 Python 來排名 Pima Indian Diabetes 資料集的特徵

執行 Python 指令碼模組的輸出視覺效果

限制

執行 Python 指令碼模組目前有下列限制:

沙箱化執行

Python 執行階段目前已沙箱化,不允許持續存取網路或本機檔案系統。 所有本機儲存的文件都會被隔離,並且在模組結束時加以刪除。 Python 程式碼無法在其執行的機器上存取大部分的目錄,但目前的目錄及其子目錄例外。

缺少精密的開發和偵錯支援

Python 模組目前不支援 IDE 功能,例如 intellisense 和偵錯。 此外,如果模組在執行階段失敗,則會提供完整的 Python 堆疊追蹤。 但是,它必須在模組的輸出記錄檔中檢視。 我們目前建議您在如 IPython 的環境中開發 Python 指令碼及進行偵錯,然後將程式碼匯入到模組。

單一資料框架輸出

Python 進入點是唯一獲得允許的位置,可以將單一資料框架傳回為輸出。 目前無法將任意 Python 物件 (例如定型的模型) 直接傳回至工作室 (傳統) 執行階段。 如同執行 R 指令碼 (具有相同的限制),在許多情況下可以將物件存放至位元組陣列,然後在資料框架內傳回。

無法自訂 Python 安裝

目前,新增自訂 Python 模組的唯一方法是透過稍早所述的 zip 檔案機制。 這適用於小模組,但難以處理大模組 (特別是具有原生 DLL 的模組) 和大量模組。

後續步驟

如需詳細資訊,請參閱 Python 開發人員中心