
使用這些基本 REST API 最佳實踐構建出色的 API
機器學習中的決策樹可視化示例:在 Iris 數據集上訓練的決策樹分類器 |來源:作者
上圖顯示了在著名的 Iris 數據集上訓練的決策樹分類器的結構。該數據集由150 個鳶尾花樣本組成,每個樣本屬于以下三個物種之一:setosa、versicolor 或 virginica。每個樣品有四個特征:萼片長度、萼片寬度、花瓣長度和花瓣寬度。
從決策樹可視化中,我們可以了解模型如何對花朵進行分類:
可視化捕獲了這種分層決策過程,并以一種比簡單的決策規則列表更易于理解的方式表示它。
隨機森林、AdaBoost、梯度提升和裝袋等集成方法將多個更簡單的模型(稱為基礎模型)合并到一個更大、更準確的模型中。例如,隨機森林分類器包含許多決策樹。在調試和評估集成時,了解組成模型的貢獻和復雜的相互作用至關重要。
可視化集成模型的一種方法是創建一個圖表,顯示基本模型如何為集成模型的輸出做出貢獻。一種常見的方法是繪制基礎模型的決策邊界(也稱為曲面),突出顯示它們對特征空間不同部分的影響。通過研究這些決策邊界如何重疊,我們可以了解基礎模型如何產生集合的集體預測能力。
集成模型可視化示例:各個分類器如何通過調整其決策邊界來適應不同的數據分布。較暗的區域表示更高的置信度,即模型對其預測的置信度更高。較輕的區域表示置信度較低的區域 |源
集成模型可視化還可以幫助用戶更好地理解分配給集成中每個基本模型的權重。通常,基礎模型對特征空間的某些區域有很強的影響,而對其他區域的影響很小。但是,也可能存在從未對集成輸出做出重大貢獻的基本模型。識別權重特別低或特別高的基本模型有助于使集成模型更加穩健并提高其泛化性。
Visual ML 是一種使用低代碼或無代碼平臺設計機器學習模型的方法。它使用戶能夠通過用戶友好的可視化界面創建和修改復雜的機器學習過程、模型和結果。Visual ML 不是追溯生成模型結構可視化,而是將它們置于 ML 工作流的核心。
簡而言之,Visual ML 平臺提供拖放式模型構建工作流程,允許各種背景的用戶輕松創建 ML 模型。它們彌合了算法的抽象世界與我們通過視覺掌握模式和關系的天生能力之間的差距。
這些平臺可以節省我們的時間,并幫助我們快速構建模型原型。由于可以在幾分鐘內創建模型,因此訓練和比較不同的模型配置很容易。然后,可以進一步優化性能最佳的模型,也許可以使用更以代碼為中心的方法。
數據科學家和機器學習工程師可以利用 Visual ML 工具創建:
如何在沒有代碼的情況下創建 ML/DL 模型的示例。這種類型的界面是敏捷的,可以詳細了解模型的工作原理 |源
Visual ML 工具的示例包括 TensorFlow 的 Neural Network Playground 和 KNIME,后者是一個完全圍繞 Visual ML 和無代碼概念構建的開源數據科學平臺。
在許多情況下,我們不太關心模型在內部是如何工作的,而是有興趣了解它的性能。對于哪種樣品是可靠的?它經常在哪里得出錯誤的結論?我們應該選擇模型 A 還是模型 B?
在本節中,我們將介紹機器學習可視化效果,這些可視化效果有助于我們更好地了解模型的性能。
混淆矩陣是評估分類模型性能的基本工具。混淆矩陣將模型的預測與基本事實進行比較,清楚地顯示模型錯誤分類了哪種樣本,或者它難以區分類別。
對于二元分類器,混淆矩陣只有四個字段:真陽性、假陽性、假陰性和真陰性:
真值:0 | 真陰性 | 誤報 |
真值:1 | 假陰性 | 真陽性 |
有了這些信息,就可以直接計算精度、召回率、F1 分數和準確性等基本指標。
多類模型的混淆矩陣遵循相同的一般思路。對角線元素表示正確分類的實例(即,模型的輸出與真實值匹配),而非對角線元素表示錯誤分類。
下面是一個小片段,用于為 sci-kit-learn 分類器生成混淆矩陣:
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# generate some sample data
X, y = make_classification(n_samples=1000,
n_features=10,
n_informative=6,
n_redundant = 2,
n_repeated = 2,
n_classes = 6,
n_clusters_per_class=1,
random_state = 42
)
# split the data into train and test set
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=0)
# initialize and train a classifier
clf = SVC(random_state=0)
clf.fit(X_train, y_train)
# get the model’s prediction for the test set
predictions = clf.predict(X_test)
# using the model’s prediction and the true value,
# create a confusion matrix
cm = confusion_matrix(y_test, predictions, labels=clf.classes_)
# use the built-in visualization function to generate a plot
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=clf.classes_)
disp.plot()
plt.show()
模型性能可視化示例:6×6 混淆矩陣 |來源:作者
讓我們看一下輸出。如前所述,對角線中的元素表示真實的類,對角線外的元素表示模型混淆類的情況,因此得名“混淆矩陣”。
以下是該圖的三個關鍵要點:
顏色漸變和百分比注釋等視覺增強功能使混淆矩陣更加直觀且易于解釋。樣式類似于熱圖的混淆矩陣會引起對錯誤率高的類的注意,從而指導進一步的模型開發。
混淆矩陣還可以幫助非技術利益相關者掌握模型的優勢和劣勢,促進討論在使用模型預測進行關鍵決策時是否需要額外的數據或預防措施。
聚類分析根據特定特征對相似的數據點進行分組。可視化這些聚類可以揭示數據中的模式、趨勢和關系。
散點圖中每個點根據其聚類分配進行著色,是可視化聚類分析結果的標準方法。聚類邊界及其在要素空間中的分布清晰可見。成對圖或平行坐標有助于了解多個要素之間的關系。
可視化聚類分析示例:由 k 均值聚類生成的兩個不同數據聚類。您可以看到,在這兩種情況下,模型找到的聚類(顏色編碼)都與數據中的實際聚類不匹配 |源
一種流行的聚類算法 k-means 從選擇稱為質心的起點開始。一種簡單的方法是從數據集中隨機選取 k 個樣本。
一旦建立了這些初始質心,k-means 將在兩個步驟之間交替:
隨著此過程的繼續,質心會移動,并且點與聚類的關聯會迭代細化。一旦新舊質心之間的差值低于設定的閾值,則表示穩定,k-means 結束。
結果是一組質心和聚類,您可以在如上圖所示的圖中可視化它們。
對于較大的數據集,可以使用 t-SNE(t 分布的隨機鄰域嵌入)或 UMAP(均勻流形近似和投影)來減少維度,同時保留聚類結構。這些技術有助于有效地可視化高維數據。
t-SNE 獲取復雜的高維數據,并將其轉換為低維表示。該算法首先為每個數據點分配一個低維空間中的位置。然后,它查看原始數據,并考慮其相鄰點,決定每個點在這個新空間中的實際位置。在高維空間中相似的點在新空間中被拉得更近,而那些不同的點被推開。
重復此過程,直到點找到其完美位置。最終結果是一個聚類表示,其中相似的數據點形成組,使我們能夠看到隱藏在高維混沌中的模式和關系。這就像一首交響樂,每個音符都能找到它和諧的位置,創造出一個美麗的數據組合。
t-SNE 算法從低維空間中的高維數據創建聚類 |源
UMAP也試圖在高維空間中尋找星團,但采用了不同的方法。以下是UMAP的工作原理:
比較不同的模型性能指標對于確定哪種機器學習模型最適合任務至關重要。無論是在機器學習項目的實驗階段,還是在重新訓練生產模型時,通常都需要可視化來將復雜的數值結果轉化為可操作的見解。
因此,模型性能指標的可視化,如ROC曲線和校準圖,是每個數據科學家和機器學習工程師都應該在其工具箱中擁有的工具。它們是理解和傳達機器學習模型有效性的基礎。
在分析機器學習分類器和比較 ML 模型性能時,受試者工作特征曲線(簡稱 ROC 曲線)至關重要。
ROC 曲線將模型的真陽性率與其假陽性率作為截止閾值的函數進行對比。它描述了我們總是必須做出的真陽性和假陽性之間的權衡,并提供了對模型判別力的洞察。
靠近左上角的曲線表示卓越的性能:該模型實現了較高的真陽性率,同時保持了較低的誤報率。比較 ROC 曲線有助于我們選擇最佳模型。
以下是 ROC 曲線工作原理的分步說明:
在二元分類中,我們感興趣的是預測兩種可能的結果之一,通常標記為陽性(例如,存在疾病)和陰性(例如,沒有疾病)。
請記住,我們可以通過選擇一個類作為正結果并將所有其他類指定為負結果,將任何分類問題轉換為二元問題。因此,ROC曲線對于多類或多標簽分類問題仍然有幫助。
ROC 曲線的軸代表兩個指標:
機器學習分類器通常輸出樣本屬于正類的可能性。例如,邏輯回歸模型輸出的值介于 0 和 1 之間,這些值可以解釋為似然。
作為數據科學家,我們有責任選擇閾值,高于該閾值,我們分配正面標簽。ROC 曲線向我們展示了該選擇對分類器性能的影響。
如果我們將閾值設置為 0,則所有樣本都將分配給陽性類,誤報率為 1。因此,在任何 ROC 曲線圖的右上角,您將看到曲線在 (1, 1) 處結束。
如果我們將閾值設置為 1,則不會將任何樣本分配給正類。但是,由于在這種情況下,我們永遠不會錯誤地將負樣本分配給正類,因此誤報率將為 0。您可能已經猜到了,這就是我們在 ROC 曲線圖的左下角看到的:曲線總是從 (0, 0) 開始。
通過更改將樣本分類為陽性的閾值來繪制這些點之間的曲線。由此產生的曲線(ROC 曲線)反映了真陽性率和假陽性率如何隨著該閾值的變化而相互變化。
但是我們從中學到了什么?
ROC 曲線顯示了我們必須在靈敏度(真陽性率)和特異性(1 – 假陽性率)之間做出的權衡。用更通俗的術語來說,我們可以找到所有陽性樣本(高靈敏度),或者確保我們的分類器識別為陽性的所有樣本實際上都屬于陽性類別(高特異性)。
考慮一個可以完美區分正樣本和負樣本的分類器:它的真陽性率始終為 1,其假陽性率始終為 0,與我們選擇的閾值無關。它的 ROC 曲線將從 (0,0) 直線向上射到 (0,1),然后類似于 (0,1) 和 (1,1) 之間的直線。
因此,ROC曲線越接近圖的左側邊界,然后是頂部邊界,模型的判別性就越強,就越能滿足敏感性和特異性目標。
為了比較不同的模型,我們通常不直接使用曲線,而是計算曲線下的面積。這量化了模型區分正類和負類的整體能力。
這個所謂的 ROC-AUC(ROC 曲線下的面積)可以取 0 到 1 之間的值,值越高表示性能越好。事實上,我們的完美分類器將達到正好 1 的 ROC-AUC。
使用 ROC-AUC 指標時,必須記住基線不是 0,而是 0.5——完全隨機分類器的 ROC-AUC。如果我們使用 np.random.rand() 作為分類器,則生成的 ROC 曲線將是一條從 (0,0) 到 (1,1) 的對角線。
比較模型分析示例:隨機分類器的 ROC 曲線是對角線的,因此 ROC-AUC 為 0.5。以黃色顯示的實際 ML 分類器的 ROC 曲線始終位于該線上方,ROC-AUC 為 0.78 |源
使用 scikit-learn 生成 ROC 曲線和計算 ROC-AUC 非常簡單。只需在模型訓練腳本中編寫幾行代碼,即可為每個訓練運行創建此評估數據。使用 ML 實驗跟蹤工具記錄 ROC-AUC 和 ROC 曲線圖時,您可以稍后比較不同的模型版本。
在可視化、比較和調試模型時,有條不紊地記錄所有實驗非常有用。
計算和記錄 ROC-AUC
from sklearn.metrics import roc_auc_score
clf.fit(x_train, y_train)
y_test_pred = clf.predict_proba(x_test)
auc = roc_auc_score(y_test, y_test_pred[:, 1])
# optional: log to an experiment-tracker like neptune.ai
neptune_logger.run["roc_auc_score"].append(auc)
創建和記錄 ROC 圖
from scikitplot.metrics import plot_roc
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(16, 12))
plot_roc(y_test, y_test_pred, ax=ax)
# optional: log to an experiment tracker like neptune.ai
from neptune.types import File
neptune_logger.run["roc_curve"].upload(File.as_html(fig))
雖然機器學習分類器通常為每個類輸出介于 0 和 1 之間的值,但這些值并不代表統計意義上的可能性或置信度。在許多情況下,這完全沒問題,因為我們只對獲得正確的標簽感興趣。
但是,如果我們想報告置信水平以及分類結果,我們必須確保我們的分類器經過校準。校準曲線是了解分類器校準情況的有用視覺輔助工具。我們還可以使用它們來比較不同的模型或檢查我們重新校準模型的嘗試是否成功。
讓我們再次考慮輸出介于 0 和 1 之間的值的模型的情況。如果我們選擇一個閾值,比如 0.5,我們可以將其轉換為二元分類器,其中模型輸出較高值的所有樣本都分配給正類(反之亦然)。
校準曲線根據模型的輸出繪制“正分數”。“正分數”是給定模型輸出的樣本實際屬于正類的條件概率(P(樣本屬于正類|模型的輸出介于 0 和 1 之間))。
這聽起來是不是太抽象了?讓我們看一個例子:
校準曲線示例:比較不同型號 | 來源:作者
首先,看一下對角線。它代表了一個完美校準的分類器:模型的輸出介于 0 和 1 之間,恰好是樣本屬于正類的概率。例如,如果模型輸出 0.5,則樣本屬于正類或負類的幾率為 50:50。如果模型對樣本輸出 0.2,則該樣本屬于正類的可能性只有 20%。
接下來,考慮樸素貝葉斯分類器的校準曲線:您會看到,即使此模型輸出 0,樣本也有大約 10% 的幾率為正。如果模型輸出 0.8,則樣本仍有 50% 的可能性屬于負類。因此,分類器的輸出不能反映其置信度。
計算“正數的分數”遠非易事。我們需要根據模型的輸出創建條柱,由于模型值范圍內的樣本分布通常不是均勻的,因此這很復雜。例如,邏輯回歸分類器通常將接近 0 或 1 的值分配給許多樣本,但很少輸出接近 0.5 的值。您可以在 scikit-learn 文檔中找到有關此主題的更深入討論。在那里,您還可以深入了解重新校準模型的可能方法,這超出了本文的范圍。
就我們的目的而言,我們已經了解了校準曲線如何以易于掌握的方式可視化復雜的模型行為。通過快速瀏覽圖,我們可以看到模型是否經過良好校準以及哪個模型最接近理想。
超參數優化是開發機器學習模型的關鍵步驟。目的是選擇超參數的最佳配置——超參數的通用名稱,不是模型從數據中學習的,而是由其人類創建者預定義的。可視化可以幫助數據科學家了解不同超參數對模型性能和屬性的影響。
找到超參數的最佳配置本身就是一項技能,遠遠超出了我們將在這里重點關注的機器學習可視化方面。要了解有關超參數優化的更多信息,我推薦這篇由前 Amazon AI 研究人員撰寫的關于提高 ML 模型性能的文章。
系統超參數優化的常用方法是創建可能的參數組合列表,并為每個參數組合訓練一個模型。這通常稱為“網格搜索”。
例如,如果您正在訓練支持向量機 (SVM),您可能希望嘗試參數 C(正則化參數)和 gamma(核系數)的不同值:
import numpy as np
C_range = np.logspace(-2, 10, 13)
gamma_range = np.logspace(-9, 3, 13)
param_grid = {“gamma”: gamma_range, “C”: C_range}
使用 scikit-learn 的 GridSearchCV,您可以為每個可能的組合(使用交叉驗證策略)訓練模型,并找到與評估指標相關的最佳組合:
from sklearn.model_selection import GridSearchCV,
grid = GridSearchCV(SVC(), param_grid=param_grid, scoring=’accuracy’)
grid.fit(X, y)
網格搜索結束后,可以檢查結果:print(
“The best parameters are %s with a score of %0.2f”
% (grid.best_params_, grid.best_score_)
)
但我們通常不僅對找到最佳模型感興趣,還想了解其參數的影響。例如,如果一個參數不影響模型的性能,我們就不需要浪費時間和金錢來嘗試更多不同的值。另一方面,如果我們看到隨著參數值的增加,模型的性能變得更好,我們可能希望為這個參數嘗試更高的值。
下面是我們剛剛執行的網格搜索的可視化效果:
網格搜索可視化示例:使用不同值的 gamma 和 C 進行 SVM 分類器訓練如何在測試集上執行 |源
從圖中可以看出,伽馬的值對支持向量機的性能影響很大。如果伽瑪設置得太高,則支持向量的影響半徑很小,即使通過 C 進行大量正則化,也可能導致過度擬合。在這種情況下,任何支持向量的影響區域都跨越整個訓練集,使模型類似于線性模型,使用超平面來分隔不同類別的密集區域。
最佳模型位于 C 和 gamma 的對角線上,如第二個繪圖面板所示。通過調整 gamma(較低的值表示更平滑的模型)和增加 C(較高的值表示更強調正確的分類),我們可以遍歷這條對角線以獲得性能良好的模型。
即使從這個簡單的示例中,您也可以看到可視化對于深入了解模型性能差異的根本原因有多么有用。這就是為什么許多機器學習實驗跟蹤工具使數據科學家能夠創建不同類型的可視化來比較模型版本的原因。
特征重要性可視化提供了一種清晰直觀的方式來掌握模型決策過程中每個特征的貢獻。在許多應用中,了解哪些特征會顯著影響預測至關重要。
從機器學習模型中提取有關特征重要性的見解有很多不同的方法。從廣義上講,我們可以將它們分為兩類:
在下文中,我們將查看每個類別的一個示例:隨機森林模型的雜質平均減少方法和與模型無關的 LIME 可解釋性方法。您可能想要研究的其他方法包括排列重要性、SHAP 和積分梯度。
就本文而言,我們不太關心如何獲取特征重要性數據,而是關心其可視化。為此,條形圖是結構化數據的首選,每個條形的長度表示要素的重要性。熱圖顯然是圖像的最愛,而對于文本數據,突出顯示最重要的單詞或短語是典型的。
在業務環境中,特征重要性可視化是利益相關者溝通的寶貴工具。它提供了一個直截了當的敘述,展示了主要影響預測的因素。這種透明度增強了決策能力,并可以培養對模型結果的信任。
使用雜質平均減少法進行特征重要性可視化示例 |來源:作者
雜質(不純度)的平均減少量是衡量每個特征對決策樹性能的貢獻的指標。要理解這一點,我們首先需要了解“雜質”在這種情況下的含義。
我們先打個比方:
現在,讓我們在決策樹和隨機森林的上下文中使用這個類比:
在構建決策樹時,我們希望每個節點在目標變量方面盡可能純粹。用更通俗的術語來說,在為我們的樹創建新節點時,我們的目標是找到最能將到達節點的樣本分成兩個不同集的特征,以便具有相同標簽的樣本位于同一集合中。(有關完整的數學詳細信息,請參閱 scikit-learn 文檔)。
決策樹中的每個節點都減少了雜質——粗略地說,它有助于按目標標簽對訓練樣本進行排序。假設一個特征是樹中許多節點的決策標準,并且它可以有效地干凈地劃分樣本。在這種情況下,它將負責決策樹總體上實現的雜質減少的很大一部分。這就是為什么查看一個特征所負責的“雜質平均減少”是衡量特征重要性的一個很好的指標。
嗚,這真是太復雜了!
幸運的是,可視化并不難閱讀。我們可以清楚地識別模型的主要驅動因素,并在特征選擇中使用這些信息。將模型的輸入空間減少到最關鍵的特征可以降低其復雜性,并可以防止過度擬合。
此外,了解特征重要性有助于數據準備。重要性較低的要素可能是移除或合并的候選要素,從而簡化了輸入數據預處理。
不過,在我們繼續之前,我想提一下一個重要的警告。由于節點的雜質減少是在訓練期間確定的,因此使用訓練數據集,“雜質的平均減少”不一定轉化為以前看不見的測試數據:
假設我們的訓練樣本已編號,此編號是模型的輸入特征。然后,如果我們的決策樹足夠復雜,它可以只知道哪個樣本具有哪個標簽(例如,“水果 1 是橙子”、“水果 2 是蘋果”……數字特征的雜質平均減少將是巨大的,它將在我們的可視化中作為一個非常重要的特征出現,盡管在將我們的模型應用于以前從未見過的數據時,它完全沒有用。
局部可解釋性方法旨在闡明模型在特定實例中的行為。(與此相反的是全局可解釋性,即檢查模型在其整個特征空間中的行為。
局部可解釋模型不可知解釋 (LIME) 和產生重要特征的示例 |來源:作者
最古老且仍然廣泛使用的技術之一是 LIME(本地可解釋模型不可知解釋)。為了揭示每個輸入特征對模型預測的貢獻,需要擬合一個線性模型,該模型近似于模型在特征空間特定區域的行為。粗略地說,線性模型的系數反映了輸入要素的重要性。結果可以可視化為特征重要性圖,突出顯示對特定預測最有影響力的特征。
局部可解釋性技術可以從復雜的算法中提取直觀的見解。這些結果的可視化可以支持與業務利益相關者的討論,或者成為與領域專家交叉檢查模型學習行為的基礎。它們提供實用的、可操作的見解,增強對模型復雜內部運作的信任,并且可以成為促進機器學習采用的重要工具。
在本節中,我將分享有關將模型可視化無縫集成到日常數據科學和機器學習例程中的技巧。
在深入研究模型可視化之前,請確定一個明確的目的。問問自己,“我打算通過可視化實現哪些具體目標?
您是否正在尋求…
定義目標將提供有效可視化所需的方向。
始終采用自上而下的方法。這意味著您從非常抽象的級別開始,然后更深入地探索以獲得更多見解。
例如,如果您正在尋求提高模型的性能,請確保首先從簡單的方法開始,例如使用簡單的折線圖繪制模型的精度和損失。
假設您的模型過擬合。然后,您可以使用特征重要性技術根據特征對模型性能的貢獻對特征進行排名。您可以繪制這些特征重要性分數,以可視化模型中最具影響力的特征。重要性較高的特征可能指向過擬合和信息泄露。
同樣,您可以為相關要素創建部分依賴關系圖。PDP 顯示目標變量的預測如何隨著特定特征的變化而變化,同時保持其他特征不變。您必須查找曲線中的不穩定行為或劇烈波動,這可能表明由于該特征而導致的過度擬合。
選擇正確的工具取決于手頭的任務和工具提供的功能。Python 提供了大量庫,如 Matplotlib、Seaborn 和 Plotly,用于創建靜態和交互式可視化。特定于框架的工具(例如用于 TensorFlow 的 TensorBoard 和用于 scikit-learn 的 scikit-plot)對于特定于模型的可視化非常有價值。
請記住,模型可視化是一個迭代過程。根據團隊和利益相關者的反饋不斷優化可視化效果。最終目標是使您的模型透明、可解釋且可供所有利益相關者訪問。他們的意見和不斷變化的項目要求可能意味著您需要重新考慮和調整您的方法。
將模型可視化整合到您的日常數據科學或機器學習實踐中,使您能夠清晰、自信地做出數據驅動的決策。無論您是數據科學家、領域專家還是決策者,將模型可視化作為常規實踐都是充分利用機器學習項目潛力的關鍵一步。
有效的機器學習模型可視化是任何數據科學家不可或缺的工具。它使從業者能夠獲得洞察力,做出明智的決策,并透明地傳達結果。
在本文中,我們介紹了大量有關如何可視化機器學習模型的信息。總而言之,以下是一些關鍵要點:
機器學習中可視化的目的:
機器學習可視化的類型:
模型可視化的實踐:
本文章轉載微信公眾號@Python人工智能前沿