sklearn 学习曲线Learning Curve和 validation_curve
Learning Curve
學習曲線是什么?
簡單來說,就是用學習曲線(learning curve)來判斷模型狀態:過擬合還是欠擬合。
學習曲線是根據不同訓練集大小,模型在訓練集和驗證集上的得分變化曲線。也就是以樣本數為橫坐標,訓練和交叉驗證集上的得分(如準確率)為縱坐標。learning curve可以幫助我們判斷模型現在所處的狀態:過擬合(overfiting / high variance) or 欠擬合(underfitting / high bias,模型欠擬合、過擬合、偏差和方差平衡 時對應的學習曲線如下圖所示:
(1)左上角的圖中訓練集和驗證集上的曲線能夠收斂。在訓練集合驗證集上準確率相差不大,卻都很差。這說明模擬對已知數據和未知都不能進行準確的預測,屬于高偏差。這種情況模型很可能是欠擬合。可以針對欠擬合采取對應的措施。
欠擬合措施:
我們可以增加模型參數(特征),比如,構建更多的特征,減小正則項。
采用更復雜的模型
此時通過增加數據量是不起作用的。(為什么?)
(2)右上角的圖中模型在訓練集上和驗證集上的準確率差距很大。說明模型能夠很好的擬合已知數據,但是泛化能力很差,屬于高方差。模擬很可能過擬合,要采取過擬合對應的措施。
過擬合措施:
我們可以增大訓練集,降低模型復雜度,增大正則項,
或者通過特征選擇減少特征數,即做一下feature selection,挑出較好的feature的subset來做training
(3)理想情況是找到偏差和方差都很小的情況,即收斂且誤差較小。如右角的圖。
from sklearn.model_selection import learning_curve from sklearn.datasets import load_digits from sklearn.svm import SVC import matplotlib.pyplot as plt import numpy as npdigits = load_digits() X = digits.data y = digits.target print(X.shape) # (1797, 64) train_sizes,train_loss, val_loss = learning_curve(SVC(gamma=0.001), X, y, cv=10, scoring='neg_mean_squared_error',train_sizes=[0.1,0.25,0.5,0.75,1] # 在整個過程中的10%取一次,25%取一次,50%取一次,75%取一次,100%取一次 )learning_curve函數中參數解釋:
- SVC(gamma=0.001)表示我們所使用的的分類器是SVC
- X : 輸入的feature,numpy類型
- y : 輸入的target
- cv : 做cross-validation的時候,數據分成的份數,其中一份作為cv集,其余n-1份作為training(默認為3份),我們這里做了10份,
- train_sizes: 隨著訓練集的增大,選擇在10%,25%,50%,75%,100%的訓練集大小上進行采樣loss
train_loss輸出如下:
[[-0. -0.09937888 -0.09937888 -0.09937888 -0.09937888 -0.09937888-0.09937888 -0.09937888 -0.09937888 -0.09937888][-0. -0.03960396 -0.03960396 -0.03960396 -0.03960396 -0.03960396-0.03960396 -0.03960396 -0.03960396 -0.03960396][-0. -0.01980198 -0.01980198 -0.06435644 -0.01980198 -0.01980198-0.01980198 -0.01980198 -0.01980198 -0.01980198][-0. -0.01650165 -0.01320132 -0.01320132 -0.01320132 -0.01320132-0.01320132 -0.01320132 -0.01320132 -0.01320132][-0.02226345 -0.03215832 -0.00989487 -0.03215832 -0.03215832 -0.03215832-0.03215832 -0.03215832 -0.03215832 -0.00989487]]test_loss輸出如下:
[[-1.26666667e+00 -1.43333333e+00 -3.96666667e+00 -9.73888889e+00-6.95000000e+00 -5.24444444e+00 -3.02777778e+00 -5.25139665e+00-3.48044693e+00 -4.85474860e+00][-1.81111111e+00 -1.13333333e+00 -1.35555556e+00 -3.06666667e+00-2.08333333e+00 -2.85000000e+00 -8.38888889e-01 -1.94413408e+00-5.41899441e-01 -1.35195531e+00][-1.71111111e+00 -3.61111111e-01 -5.11111111e-01 -9.61111111e-01-6.16666667e-01 -5.88888889e-01 -1.22222222e-01 -9.16201117e-01-7.76536313e-01 -1.14525140e+00][-1.22222222e+00 -3.61111111e-01 -4.44444444e-01 -7.00000000e-01-5.55555556e-01 -2.66666667e-01 -8.88888889e-02 -1.11731844e-02-9.21787709e-01 -8.43575419e-01][-9.33333333e-01 -0.00000000e+00 -2.66666667e-01 -2.83333333e-01-2.77777778e-01 -3.61111111e-01 -8.88888889e-02 -5.58659218e-03-9.21787709e-01 -4.18994413e-01]]Validation curve
from sklearn.model_selection import validation_curve from sklearn.datasets import load_digits from sklearn.svm import SVC import matplotlib.pyplot as plt import numpy as npdigits = load_digits() X = digits.data y = digits.target param_range = np.logspace(-6,-2.3,5) # 參數范圍從-6到-2.3,之間 取5個點 train_loss, validation_loss = validation_curve(SVC(), X, y, param_name='gamma', param_range=param_range , cv=10, scoring='neg_mean_squared_error' ) # 對于SVC()分類器中的gamma參數設置取值范圍param_rangeprint(train_loss) print(validation_loss) train_loss_mean = -np.mean(train_loss, axis=1) validation_loss_mean = -np.mean(validation_loss,axis=1) plt.plot(param_range,train_loss_mean, 'o-',color='r',label='Training') plt.plot(param_range,validation_loss_mean,'o-',color='g', label='Cross-validation') plt.xlabel('gamma') plt.ylabel('Loss') plt.legend(loc='best') plt.show()輸出結果如下:
[[-1.04347557e+01 -1.04329004e+01 -1.04329004e+01 -1.04242424e+01-1.04199134e+01 -1.04199134e+01 -1.04199134e+01 -1.35568603e+01-9.54017305e+00 -9.39431397e+00][-1.84415584e+00 -2.09338281e+00 -2.14038343e+00 -1.71552257e+00-1.72232529e+00 -2.21150278e+00 -2.14409400e+00 -2.16687268e+00-1.81582200e+00 -1.99381953e+00][-3.37043908e-01 -5.62152134e-01 -4.28571429e-01 -4.32282004e-01-4.76190476e-01 -4.68769326e-01 -4.74335189e-01 -5.61804697e-01-3.96168109e-01 -3.93695921e-01][-6.24613482e-02 -7.48299320e-02 -2.04081633e-02 -4.26716141e-02-7.48299320e-02 -2.04081633e-02 -4.20531849e-02 -4.20271941e-02-4.20271941e-02 -1.23609394e-02][-0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00-0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00-0.00000000e+00 -0.00000000e+00]] [[-1.03666667e+01 -1.03833333e+01 -1.03833333e+01 -1.04611111e+01-1.05000000e+01 -1.05000000e+01 -1.05000000e+01 -1.44357542e+01-9.02234637e+00 -1.04078212e+01][-4.01111111e+00 -1.65555556e+00 -1.50555556e+00 -5.84444444e+00-2.69444444e+00 -1.56666667e+00 -8.66666667e-01 -1.56424581e+00-5.07821229e+00 -1.74301676e+00][-1.40000000e+00 -6.33333333e-01 -4.44444444e-01 -2.53888889e+00-1.12777778e+00 -4.16666667e-01 -4.11111111e-01 -1.11731844e-02-3.55307263e+00 -1.39106145e+00][-7.33333333e-01 -0.00000000e+00 -3.16666667e-01 -8.33333333e-01-2.77777778e-01 -3.61111111e-01 -8.88888889e-02 -5.58659218e-03-9.44134078e-01 -6.14525140e-01][-2.18333333e+00 -1.90555556e+00 -9.38888889e-01 -3.68333333e+00-1.20555556e+00 -2.54444444e+00 -1.61111111e-01 -1.46927374e+00-2.31843575e+00 -1.82122905e+00]]print(train_loss.shape) # (5, 10)
print(validation_loss.shape) # (5, 10): 因為參數取了5個點,將訓練集和驗證集分為了10份cv=10,每一個參數對應10個loss
SVC()分類器在不同gamma參數下,它在訓練集和交叉驗證上的分數如下:當gamma=0時,他們的loss都很大,說明欠擬合;當gamma=0.006時,他們的loss都很低,效果不錯;當gamma=0.005時,驗證集上的loss很大,而訓練集上的loss變小,說明發生了過擬合。因此我們會選擇gamma=0.006時,在測試集上進行測試。
驗證曲線(validation_curve)和學習曲線(sklearn.model_selection.learning_curve())的區別是,驗證曲線的橫軸為某個超參數,如一些樹形集成學習算法中的max_depth、min_sample_leaf等等。
從驗證曲線上可以看到隨著超參數設置的改變,模型可能從欠擬合到合適,再到過擬合的過程,進而選擇一個合適的位置,來提高模型的性能。
一般我們需要把一個數據集分成三部分:train、validation和test,我們使用train訓練模型,并通過在 validation數據集上的表現不斷修改超參數值(例如svm中的C值,gamma值等),當模型超參數在validation數據集上表現最優時,我們再使用全新的測試集test進行測試,以此來衡量模型的泛化能力。
總結
以上是生活随笔為你收集整理的sklearn 学习曲线Learning Curve和 validation_curve的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pytorch教程(十六):Fashio
- 下一篇: 7寸照片尺寸大小(7寸照片尺寸比例是多少