Streamlit 提供簡潔易用的 API,讓開發者能快速建置互動式網頁應用。本文示範如何利用 Streamlit 建立一個文字分類別應用程式,並整合 spaCy 進行自然語言處理。首先,我們會使用 spacy_streamlit 載入預訓練的 spaCy 模型,並透過 st.cache 快取 AG News 資料集,提升應用程式效能。接著,我們會利用 Streamlit 的側邊欄元件,讓使用者能選擇不同的資料呈現方式、類別和文章,並將使用者選擇的資料輸入至已載入的模型進行預測。最後,應用程式會顯示模型預測的類別和信心度。除了 Streamlit 應用程式開發,本文也討論了機器學習模型佈署的挑戰,特別是資料科學家、工程師和分析師之間的協作問題。為瞭解決這些挑戰,文章介紹了 Databricks 作為統一資料分析平台的優勢,包括其對多種程式語言、機器學習框架、大資料處理以及模型管理功能的支援,讓不同角色的專業人員能在同一個平台上協作,簡化模型從開發到佈署的流程。
使用Streamlit建置文字分類別應用程式
Streamlit是一種強大的工具,能夠讓開發者快速建立互動式網頁應用程式。在本章中,我們將探討如何使用Streamlit來建置文字分類別應用程式。
載入必要的函式庫
首先,我們需要載入必要的函式庫,包括spacy、streamlit、spacy_streamlit、numpy、pandas等。
import spacy
import streamlit as st
import spacy_streamlit
import numpy as np
import pandas as pd
內容解密:
spacy是一個用於自然語言處理的函式庫。streamlit是一個用於建立互動式網頁應用程式的函式庫。spacy_streamlit是一個結合spacy和streamlit的函式庫,用於簡化NLP任務的視覺化。numpy和pandas是用於資料處理的函式庫。
建立AG News資料集的文字分類別應用程式
首先,我們建立一個AG News資料集的文字分類別應用程式。我們需要定義一個函式來讀取資料,並使用st.cache來快取資料。
@st.cache
def read_data(file):
read_path = '/content/drive/My Drive/Applied-NLP-in-the-Enterprise'
data = pd.read_csv(read_path+file)
return data
data = read_data('/data/ag_dataset/prepared/train_prepared.csv')
內容解密:
@st.cache是用於快取函式的裝飾器,可以避免重複計算。read_data函式用於讀取CSV檔案中的資料。
設定側邊欄元件
接下來,我們設定側邊欄元件,包括多選框、單選按鈕和數字輸入框。
st.sidebar.header("Parameters")
display_selections = st.sidebar.multiselect(
"Which data would you like to display?",
["Full Data","Single Article"], None)
category_option = st.sidebar.radio(
'Which category would you like to explore?',
data.class_name.unique())
article_option = st.sidebar.number_input(
'Which article would you like to explore?',
data.loc[data.class_name==category_option].index.min(),
data.loc[data.class_name==category_option].index.max(),
data.loc[data.class_name==category_option].index.min())
內容解密:
st.sidebar.header用於設定側邊欄的標題。st.sidebar.multiselect用於建立多選框。st.sidebar.radio用於建立單選按鈕。st.sidebar.number_input用於建立數字輸入框。
載入自定義的spaCy模型
我們載入自定義的spaCy模型,並對文字進行分類別。
custom_model = spacy_streamlit.load_model(
'/content/drive/My Drive/Applied-NLP-in-the-Enterprise/models/ag_dataset/textcat-prodigy-V3-base-full/model-best')
default_text = data.loc[article_option,"description"]
doc = custom_model(default_text)
內容解密:
spacy_streamlit.load_model用於載入自定義的spaCy模型。custom_model用於對文字進行分類別。
顯示分類別結果
最後,我們顯示分類別結果,包括預測類別和信心度。
prediction = max(doc.cats, key=lambda key: doc.cats[key])
confidence = str(np.round(doc.cats[prediction],2))
st.header("Prediction: " + prediction)
st.subheader("Confidence: " + confidence)
內容解密:
max函式用於找出信心度最高的類別。np.round用於四捨五入信心度到小數點後兩位。
第11章 量產化
許多公司在將原型轉換為生產環境的過程中遭遇困難,這是他們在機器學習專案上的投資回報率偏低的主要原因之一。在前一章中,我們討論瞭如何將機器學習模型以網頁應用的形式量產化。然而,公司真正要解鎖機器學習模型在生產環境中的價值,主要不是透過簡單的網頁應用,而是透過API和自動化流程,這兩點將在本章中詳細闡述。我們還將討論在生產環境中佈署、維護和監控機器學習模型所涉及的各種角色,並探索 Databricks 這個目前市場上領先的企業級資料科學和機器學習工作平台。
資料科學家、工程師和分析師
在探討如何將機器學習模型量產化之前,讓我們先回顧一下在整個機器學習開發和佈署週期中將會涉及的不同角色。瞭解這些角色及其對程式語言和環境的偏好非常重要,因為我們希望減少從原型開發到佈署生產的摩擦,換句話說,我們需要考慮協作的便利性,以確保機器學習在生產環境中的成功執行。
原型開發、佈署和維護
機器學習週期中有三個明顯的技術階段:原型開發、佈署和持續監控與維護。在原型開發階段,資料科學家會考慮業務目標(通常由產品經理提供),並準備資料、進行特徵工程、選擇測試的演算法、定義成本函式、訓練和評估多個模型,並選出表現最佳的模型作為勝出者——這些你都非常熟悉。在這個原型開發階段,資料工程師可能會協助一些提取、轉換和載入(ETL)工作,將來自多個來源的資料整合到一個集中的位置,並使其可供資料科學家用於機器學習開發。資料分析師可能會進行資料探索和準備,以協助資料科學家,並可能幫助評估機器學習模型的結果。但是,資料科學家在這個模型開發階段是主要的角色,而工程師和分析師則扮演支援角色。
在模型佈署階段,資料和機器學習工程師成為主要角色,並由在原型開發階段開發機器學習模型的資料科學家提供支援。工程師通常會重構由資料科學家開發的程式碼,以使模型具有高效能(即能夠擴充套件到大型資料集)和強壯性(即能夠優雅地處理錯誤和邊緣情況)。工程師還需要將模型定位在公司的軟體架構中,以便模型能夠在更大的工作流程中發揮其應有的作用。這些資料和機器學習工程師是將模型從原型轉換為生產的關鍵角色。
合作與維護
資料科學家支援工程師,透過共同程式設計,與工程師一起撰寫更高效能、更強壯版本的原始程式碼。資料科學家解釋模型的運作方式,並回答工程師可能有的其他問題。在模型佈署期間,資料分析師的作用非常有限。然而,一旦模型佈署完成,資料分析師就承擔瞭解釋模型的輸出結果並與模型的非技術使用者(無論是在組織內部還是外部客戶)介面的主要角色。
資料和機器學習工程師和分析師也是模型表現不佳時的第一道防線。資料和機器學習工程師將監控模型,以確保其具有接近100%的正常執行時間,能夠良好地擴充套件到大量資料,並且能夠產生成功的回應而不是錯誤。資料分析師還幫助識別模型的輸出結果何時出現錯誤,並標記模型的效能何時下降,這種情況會隨著時間的推移而發生,因為新的資料流經模型,而這些資料可能並未被用於開發模型的訓練資料所充分代表。
# 示例程式碼:簡單的機器學習模型訓練
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 假設 X 是特徵資料,y 是目標變數
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的準確率:{accuracy:.2f}")
內容解密:
上述程式碼展示了一個簡單的機器學習模型訓練過程。首先,我們使用 train_test_split 將資料集分割為訓練集和測試集。然後,我們例項化一個邏輯迴歸模型,並使用訓練資料對其進行訓練。接著,我們使用測試資料對模型進行評估,並計算模型的準確率。最後,我們列印出模型的準確率。這段程式碼演示了機器學習工作流程中的關鍵步驟,包括資料準備、模型訓練和評估。
筆記本與指令碼
一個常見的爭論點是使用 Jupyter Notebook 進行生產工作。由於歷史原因,筆記本因鼓勵不良的軟體工程實踐和不可重現的程式碼而聲名狼藉。目前為止,這些擔憂大多已被緩解,但思考在哪裡使用筆記本與指令碼仍然很重要。
在原型開發階段,大多數資料科學家在根據筆記本的環境中開發模型,例如 Jupyter Notebook、JupyterLab、IPython、Google Colab,甚至是 VS Code 擴充套件。根據筆記本的環境非常適合原型開發,因為你可以編寫短小的程式碼區塊,並立即使用 Shift-Enter 快捷鍵執行它們,然後在你編輯的程式碼區塊下方看到輸出結果。這對開發者生產力有著令人驚訝且深遠的影響。它允許程式設計師快速迭代並執行多個實驗,這是機器學習成功的關鍵。總的來說,筆記本非常適合快速原型開發和實驗。它們確實使我們接近了“以思維速度進行編碼”的格言。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Streamlit建置互動式文字分類別應用
package "機器學習流程" {
package "資料處理" {
component [資料收集] as collect
component [資料清洗] as clean
component [特徵工程] as feature
}
package "模型訓練" {
component [模型選擇] as select
component [超參數調優] as tune
component [交叉驗證] as cv
}
package "評估部署" {
component [模型評估] as eval
component [模型部署] as deploy
component [監控維護] as monitor
}
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml
此圖示展示了機器學習生命週期中的不同階段,從原型開發到佈署,再到持續監控與維護。瞭解這些階段對於成功實施機器學習專案至關重要。
機器學習模型佈署的挑戰與統一平台的需求
在機器學習模型的開發和佈署過程中,不同角色的專業人員面臨著不同的挑戰。資料科學家傾向於使用筆記本環境進行快速實驗和迭代,而工程師則偏好使用指令碼,以便於結果的再現、大規模實驗和生產環境中的除錯。
資料科學家、工程師與資料分析師的不同需求
資料科學家、資料和機器學習工程師,以及資料分析師在機器學習模型的生命週期中扮演著不同的角色。資料科學家負責模型的開發,工程師負責模型的佈署和維護,而資料分析師則需要與模型的輸出結果進行互動並解釋結果。
企業若要成功地在生產環境中實施機器學習,需要建立一個統一的平台,以滿足不同角色人員的需求。Databricks作為業界領先的協作式資料科學和機器學習平台,能夠支援整個機器學習生命週期,從模型的開發到測試、佈署、監控和維護。
Databricks:統一的資料分析平台
Databricks之所以成為市場長官者,是因為它具備多項優勢,包括:
- 長期以來一直是業界領先者,許多從業者對其技術已經相當熟悉。
- 提供成熟的組織級解決方案,包括大多數公司所需的安全性和合規性功能。
- 為大資料處理而設計,並持續在這一領域進行創新。
大資料支援
在開發機器學習模型時,許多資料科學家並未充分考慮如何使模型在大資料集上高效執行,或如何處理串流資料的使用案例。Databricks支援大資料處理,能夠滿足大規模機器學習的需求。
在大規模上執行機器學習任務時,使用單一機器進行推理是不切實際的,需要使用多台機器組成叢集。Hadoop和Spark等大資料技術能夠在叢集中的多台機器上平行處理資料。
Spark是一種較新的大資料技術,於2012年在加州大學伯克利分校AMPLab開發。它與Hadoop類別似,能夠在叢集中的多台機器上平行處理資料,但Spark是在記憶體中執行資料操作,而Hadoop則是讀寫磁碟上的檔案。
佈署機器學習模型
雖然Databricks是目前市場上的長官者,但預計未來幾年內,競爭格局將會變得更加激烈。因此,在職業發展過程中,也需要花時間探索Databricks以外的替代方案,例如Amazon SageMaker和Saturn Cloud。
為大規模機器學習做好準備
為了在大規模上執行機器學習任務,需要考慮如何使模型在大資料集上高效執行。Databricks提供了一個統一的平台,能夠支援大規模機器學習的需求,並能夠與Hadoop和Spark等大資料技術進行整合。
關鍵技術:Spark
Spark是一種強大的大資料處理技術,能夠在大規模叢集中平行處理資料。其主要特點包括:
- 在記憶體中執行資料操作,提高了處理速度。
- 能夠與Hadoop等其他大資料技術進行整合。
Spark的優勢
- 能夠在大規模叢集中平行處理資料,提高了處理速度。
- 提供了豐富的API,能夠支援多種程式語言。
如何使用Spark
- 使用Spark進行大資料處理,需要先建立一個Spark叢集。
- 然後,可以使用Spark的API來編寫程式,以平行處理資料。
內容解密:
本段落主要介紹了Spark的基本概念和優勢。Spark是一種強大的大資料處理技術,能夠在大規模叢集中平行處理資料。其主要特點包括在記憶體中執行資料操作,提高了處理速度。Spark能夠與Hadoop等其他大資料技術進行整合,並提供了豐富的API,能夠支援多種程式語言。使用Spark進行大資料處理,需要先建立一個Spark叢集,然後可以使用Spark的API來編寫程式,以平行處理資料。
Databricks:統一的資料分析平台
Databricks是一個根據Apache Spark的統一資料分析平台,能夠支援資料科學家、工程師和分析師在同一個平台上進行資料分析、機器學習模型的開發和佈署。相較於傳統的Hadoop,Spark在記憶體中執行速度可達100倍,在磁碟上執行速度可達10倍,並且在機器學習應用中表現出色。
多種程式語言的支援
Databricks的一大優勢是支援多種程式語言,包括Python、Scala、SQL等,這使得資料科學家、工程師和分析師能夠在同一個平台上協作,無需切換不同的工具和環境。資料科學家可以使用Python進行資料分析和模型開發,工程師可以使用Scala或PySpark進行模型的佈署和維護,而分析師則可以使用SQL進行資料查詢和分析。
機器學習框架的支援
Databricks提供了一個最佳化且可擴充套件的機器學習環境,內建支援多種流行的機器學習框架,如PyTorch、TensorFlow和Scikit-learn。這個環境可以讓資料科學家快速建立機器學習模型,並且可以根據需要進行自定義。此外,Databricks還提供了Spark-optimized的機器學習函式庫MLlib,支援多種常見的機器學習演算法。
模型儲存函式庫、存取控制、資料血緣和版本控制
Databricks提供了模型儲存函式庫、存取控制、資料血緣和版本控制等功能,能夠幫助企業更好地管理和佈署機器學習模型。這些功能可以讓企業追蹤實驗結果、註冊和管理模型、控制存取許可權,並且能夠追蹤資料在資料管道中的流動。
Databricks的優勢
綜上所述,Databricks提供了一個統一的平台,讓資料科學家、工程師和分析師能夠協作開發和佈署機器學習模型。這個平台支援多種程式語言和機器學習框架,能夠幫助企業更好地管理和佈署機器學習模型,並且提供了多種功能來支援企業的合規需求。
設定Databricks
要開始使用Databricks,首先需要註冊帳號。註冊完成後,可以選擇使用免費的Community Edition或付費的Databricks Platform。Community Edition提供了一個單一叢集,具備6 GB的RAM,而Databricks Platform則提供了更強大的功能和擴充套件性。
選擇雲端供應商
Databricks與多家雲端供應商合作,包括Azure和AWS。要使用Databricks Platform,需要選擇一家雲端供應商。兩家供應商的價格相當,因此可以根據個人或公司的需求進行選擇。
# 以下是一個簡單的Python範例,用於示範如何在Databricks中使用PySpark
from pyspark.sql import SparkSession
# 建立SparkSession
spark = SparkSession.builder.appName("My App").getOrCreate()
# 建立一個簡單的DataFrame
data = [("John", 25), ("Mary", 31), ("David", 42)]
df = spark.createDataFrame(data, ["Name", "Age"])
# 顯示DataFrame
df.show()
內容解密:
- 匯入必要的函式庫:首先,我們匯入了
pyspark.sql模組中的SparkSession類別,這是建立Spark應用程式的入口點。 - 建立SparkSession:我們使用
SparkSession.builder建立了一個新的SparkSession,並指定了應用程式的名稱為"My App"。 - 建立DataFrame:我們建立了一個簡單的DataFrame,包含兩個欄位:“Name"和"Age”。
- 顯示DataFrame:最後,我們使用
show()方法顯示了DataFrame的內容。
這個範例示範瞭如何在Databricks中使用PySpark建立和操作DataFrame。Databricks提供了豐富的功能和工具,能夠幫助企業更好地管理和佈署機器學習模型。