1. 程式人生 > 其它 >機器學習sklearn(二十一): 模型評估(一)交叉驗證:評估估算器的表現(一)簡介

機器學習sklearn(二十一): 模型評估(一)交叉驗證:評估估算器的表現(一)簡介

學習預測函式的引數,並在相同資料集上進行測試是一種錯誤的做法: 一個僅給出測試用例標籤的模型將會獲得極高的分數,但對於尚未出現過的資料它則無法預測出任何有用的資訊。 這種情況稱為overfitting(過擬合). 為了避免這種情況,在進行(監督)機器學習實驗時,通常取出部分可利用資料作為test set(測試資料集)X_test, y_test。需要強調的是這裡說的 “experiment(實驗)” 並不僅限於學術(academic),因為即使是在商業場景下機器學習也往往是從實驗開始的。下面是模型訓練中典型的交叉驗證工作流流程圖。通過網格搜尋可以確定最佳引數。

利用 scikit-learn 包中的

train_test_split輔助函式可以很快地將實驗資料集劃分為任何訓練集(training sets)和測試集(test sets)。 下面讓我們載入 iris 資料集,並在此資料集上訓練出線性支援向量機:

>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape ((150, 4), (150,))

我們能快速取樣到原資料集的 40% 作為測試集,從而測試(評估)我們的分類器:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((
60, 4), (60,)) >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train) >>> clf.score(X_test, y_test) 0.96...

當評價估計器的不同設定(”hyperparameters(超引數)”)時,例如手動為 SVM 設定的C引數, 由於在訓練集上,通過調整引數設定使估計器的效能達到了最佳狀態;但在測試集上可能會出現過擬合的情況。 此時,測試集上的資訊反饋足以顛覆訓練好的模型,評估的指標不再有效反映出模型的泛化效能。 為了解決此類問題,還應該準備另一部分被稱為 “validation set(驗證集)” 的資料集,模型訓練完成以後在驗證集上對模型進行評估。 當驗證集上的評估實驗比較成功時,在測試集上進行最後的評估。

然而,通過將原始資料分為3個數據集合,我們就大大減少了可用於模型學習的樣本數量, 並且得到的結果依賴於集合對(訓練,驗證)的隨機選擇。

這個問題可以通過交叉驗證(CV )來解決。 交叉驗證仍需要測試集做最後的模型評估,但不再需要驗證集。

最基本的方法被稱之為,k-折交叉驗證。 k-折交叉驗證將訓練集劃分為 k 個較小的集合(其他方法會在下面描述,主要原則基本相同)。 每一個k折都會遵循下面的過程:

  • 將份訓練集子集作為 training data (訓練集)訓練模型,
  • 將剩餘的 1 份訓練集子集用於模型驗證(也就是把它當做一個測試集來計算模型的效能指標,例如準確率)。

k-折交叉驗證得出的效能指標是迴圈計算中每個值的平均值。 該方法雖然計算代價很高,但是它不會浪費太多的資料(如固定任意測試集的情況一樣), 在處理樣本資料集較少的問題(例如,逆向推理)時比較有優勢。