CNTK - 效能評估



本章將解釋如何在 CNKT 中衡量模型效能。

驗證模型效能的策略

構建機器學習模型後,我們通常使用一組資料樣本對其進行訓練。透過這種訓練,我們的機器學習模型學習並得出一些一般規則。當我們將新的樣本(即與訓練時提供的樣本不同的樣本)饋送到模型時,機器學習模型的效能就至關重要。在這種情況下,模型的行為會有所不同。它在對這些新樣本進行良好預測方面可能表現更差。

但是,模型也必須適用於新樣本,因為在生產環境中,我們將獲得與用於訓練目的的樣本資料不同的輸入。這就是為什麼我們應該使用一組與用於訓練目的的樣本不同的樣本集來驗證機器學習模型的原因。在這裡,我們將討論兩種不同的技術來建立用於驗證神經網路的資料集。

留出資料集

這是建立用於驗證神經網路的資料集最簡單的方法之一。顧名思義,在這種方法中,我們將從訓練中保留一組樣本(例如 20%),並用它來測試我們機器學習模型的效能。下圖顯示了訓練樣本和驗證樣本之間的比例:

Hold-out Dataset

留出資料集模型確保我們有足夠的資料來訓練我們的機器學習模型,同時我們也有合理的樣本數量來很好地衡量模型的效能。

為了包含在訓練集和測試集中,最好從主資料集中選擇隨機樣本。這確保了訓練集和測試集之間的均勻分佈。

以下是一個示例,我們使用scikit-learn庫中的train_test_split函式生成我們自己的留出資料集。

示例

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Here above test_size = 0.2 represents that we provided 20% of the data as test data.
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors=3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)

輸出

Predictions: ['versicolor', 'virginica']

使用 CNTK 時,每次訓練模型時都需要隨機化資料集的順序,因為:

  • 深度學習演算法受隨機數生成器的影響很大。

  • 我們在訓練期間向神經網路提供樣本的順序會極大地影響其效能。

使用留出資料集技術的主要缺點是它不可靠,因為有時我們會得到非常好的結果,但有時我們會得到不好的結果。

K 折交叉驗證

為了使我們的機器學習模型更可靠,有一種稱為 K 折交叉驗證的技術。從本質上講,K 折交叉驗證技術與之前的技術相同,但它會重複多次——通常大約 5 到 10 次。下圖表示其概念:

K-fold cross validation

K 折交叉驗證的工作原理

可以透過以下步驟瞭解 K 折交叉驗證的工作原理:

步驟 1 - 與留出資料集技術一樣,在 K 折交叉驗證技術中,首先需要將資料集分成訓練集和測試集。理想情況下,比例為 80-20,即 80% 的訓練集和 20% 的測試集。

步驟 2 - 接下來,我們需要使用訓練集訓練我們的模型。

步驟 3 - 最後,我們將使用測試集來衡量模型的效能。留出資料集技術和 k 折交叉驗證技術之間的唯一區別在於,上述過程通常會重複 5 到 10 次,最後計算所有效能指標的平均值。該平均值將是最終的效能指標。

讓我們來看一個使用小型資料集的示例:

示例

from numpy import array
from sklearn.model_selection import KFold
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
kfold = KFold(5, True, 1)
for train, test in kfold.split(data):
   print('train: %s, test: %s' % (data[train],(data[test]))

輸出

train: [0.1 0.2 0.4 0.5 0.6 0.7 0.8 0.9], test: [0.3 1. ]
train: [0.1 0.2 0.3 0.4 0.6 0.8 0.9 1. ], test: [0.5 0.7]
train: [0.2 0.3 0.5 0.6 0.7 0.8 0.9 1. ], test: [0.1 0.4]
train: [0.1 0.3 0.4 0.5 0.6 0.7 0.9 1. ], test: [0.2 0.8]
train: [0.1 0.2 0.3 0.4 0.5 0.7 0.8 1. ], test: [0.6 0.9]

正如我們所看到的,由於使用了更現實的訓練和測試場景,k 折交叉驗證技術為我們提供了更穩定的效能衡量,但缺點是驗證深度學習模型時需要花費大量時間。

CNTK 不支援 k 折交叉驗證,因此我們需要編寫我們自己的指令碼來執行此操作。

檢測欠擬合和過擬合

無論我們使用留出資料集還是 k 折交叉驗證技術,我們都會發現用於訓練的資料集和用於驗證的資料集的指標輸出將有所不同。

檢測過擬合

過擬合現象是指我們的機器學習模型對訓練資料建模非常好,但在測試資料上表現不佳,即無法預測測試資料的情況。

當機器學習模型學習訓練資料中的特定模式和噪聲到一定程度時,就會發生這種情況,這會對其從訓練資料泛化到新資料(即未見資料)的能力產生負面影響。此處,噪聲是資料集中不相關的或隨機的資訊。

以下是我們可以用來檢測我們的模型是否過擬合的兩種方法:

  • 過擬合模型將對我們用於訓練的相同樣本表現良好,但它將對新樣本(即與訓練不同的樣本)表現非常差。

  • 如果測試集上的指標低於我們在訓練集上使用的相同指標,則模型在驗證期間過擬合。

檢測欠擬合

在我們的機器學習中可能出現的另一種情況是欠擬合。這是一種情況,我們的機器學習模型沒有很好地對訓練資料進行建模,並且無法預測有用的輸出。當我們開始訓練第一個週期時,我們的模型將欠擬合,但在訓練過程中將變得不那麼欠擬合。

檢測我們的模型是否欠擬合的一種方法是檢視訓練集和測試集的指標。如果測試集上的指標高於訓練集上的指標,則我們的模型將欠擬合。

廣告
© . All rights reserved.