1. 程式人生 > >sklearn交叉驗證2-【老魚學sklearn】

sklearn交叉驗證2-【老魚學sklearn】

pyplot info 包含 ror -m 根據 spa err 產生

過擬合

過擬合相當於一個人只會讀書,卻不知如何利用知識進行變通。
相當於他把考試題目背得滾瓜爛熟,但一旦環境稍微有些變化,就死得很慘。

從圖形上看,類似下圖的最右圖:
技術分享圖片

從數學公式上來看,這個曲線應該是階數太高的函數,因為一般任意的曲線都能由高階函數來擬合,它擬合得太好了,因此喪失了泛化的能力。

用Learning curve 檢視過擬合

首先加載digits數據集,其包含的是手寫體的數字,從0到9:

# 加載數據
digits = load_digits()
X = digits.data
y = digits.target

然後用SVC(支持向量機)對手寫體數字進行分類,當然,這裏要介紹的核心函數是learning_curve

,先上代碼看看:

# 導入支持向量機
from sklearn.svm import SVC
model = SVC(gamma=0.001)

train_sizes, train_loss, test_loss = learning_curve(model, X, y, cv=10, scoring=‘neg_mean_squared_error‘, train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
# 平均每一輪所得到的平均方差(共5輪,分別為樣本10%、25%、50%、75%、100%)
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean =
-np.mean(test_loss, axis=1)

在learning_curve中設置了十一法的數據,同時在打分時使用了neg_mean_squared_error方式,也就是方差值,因此這個最後的得分值是負數;train_sizes指定了5輪檢視學習曲線(10%, 25%, 50%, 75%, 100%):

最後,我們把根據每輪的訓練集大小對於最終得分的影響程度畫個圖,相當於做題數量的多少跟最終考試成績的關系圖:

# 可視化圖形
import matplotlib.pyplot as plt
plt.plot(train_sizes, train_loss_mean, label="Train"
) plt.plot(train_sizes, test_loss_mean, label="Test") plt.legend() plt.show()

顯示圖形為:
技術分享圖片

看起來隨著做題數量的增加,考試成績越來越好了(損失函數的值越來越小了),並且考試成績在慢慢逼近平常的訓練成績。

完整的代碼如下:

from sklearn.datasets import load_digits

# 加載數據
digits = load_digits()
X = digits.data
y = digits.target

# 加載學習曲線模塊
from sklearn.model_selection import learning_curve
import numpy as np

# 導入支持向量機
from sklearn.svm import SVC
model = SVC(gamma=0.001)

train_sizes, train_loss, test_loss = learning_curve(model, X, y, cv=10, scoring=‘neg_mean_squared_error‘, train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
# 平均每一輪所得到的平均方差(共5輪,分別為樣本10%、25%、50%、75%、100%)
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)

# 可視化圖形
import matplotlib.pyplot as plt
plt.plot(train_sizes, train_loss_mean, label="Train")
plt.plot(train_sizes, test_loss_mean, label="Test")
plt.legend()
plt.show()

如果我們把上面代碼中SVC參數的gamma值設置為0.1,顯示出的圖形為:
技術分享圖片

在上面的圖形中,我們會發現再增加訓練集的數據並沒有使測試集的損失值下降,相當於一個人按照他的學習方式做訓練題已經夠多了,你做更多的訓練題都無法提高你的考試成績了,這時可能需要考慮的是稍微改變一下你的學習方法說不定就能提高考試成績呢。
這也說明了,在某些情況下題海戰術不一定奏效了。

在機器學習中表示為所學到的模型可能太復雜了,產生了過擬合(過擬合表現為訓練集的損失函數在下降,但測試集的損失函數不降反升),不具備泛化能力,例如下圖中綠色曲線就是一個過擬合的表現:
技術分享圖片

相應的損失函數曲線顯示如下所示:
技術分享圖片

因此如果我們想要查看是否有過擬合,可以通過learning_curve函數來進行並以可視化的方式來查看結果。

sklearn交叉驗證2-【老魚學sklearn】