過擬合:是指模型能很好地擬合訓(xùn)練樣本,但對新數(shù)據(jù)的預(yù)測準(zhǔn)確性很差拂酣。
欠擬合:是指模型不能很好地擬合訓(xùn)練樣本秋冰,且對新數(shù)據(jù)的預(yù)測準(zhǔn)確性也不好。
我們來看一個簡單的例子婶熬。首先剑勾,生成一個20個點(diǎn)的訓(xùn)練樣本:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
n_dots = 20=
x = np.linspace(0, 1, n_dots) # [0, 1] 之間創(chuàng)建 20 個點(diǎn)
y = np.sqrt(x) + 0.2*np.random.rand(n_dots) - 0.1
訓(xùn)練樣本是,其中r是[-0.1,0.1]之間的一個隨機(jī)數(shù)赵颅。
然后分別用一階多項式虽另、三階多項式和十階多項式3個模型來擬合這個數(shù)據(jù)集,得到的結(jié)果如下圖所示性含。
def plot_polynomial_fit(x, y, order):
p = np.poly1d(np.polyfit(x, y, order))
# 畫出擬合出來的多項式所表達(dá)的曲線以及原始的點(diǎn)
t = np.linspace(0, 1, 200)
plt.plot(x, y, 'ro', t, p(t), '-', t, np.sqrt(t), 'r--')
return p
plt.figure(figsize=(18, 4))
titles = ['Under Fitting', 'Fitting', 'Over Fitting']
models = [None, None, None]
for index, order in enumerate([1, 3, 10]):
plt.subplot(1, 3, index + 1)
models[index] = plot_polynomial_fit(x, y, order)
plt.title(titles[index], fontsize=20)
figure3_1.png
說明:圖中的點(diǎn)是我們生成的20個訓(xùn)練樣本洲赵;虛線是實際的模型;實線是用訓(xùn)練樣本擬合出來的模型。
在上圖中叠萍,左邊是欠擬合(underfitting)芝发,也稱為高偏差(high bias),因為我們試圖用一條直線來擬合樣本數(shù)據(jù)苛谷。右邊是過擬合(overfitting)辅鲸,也稱為高方差(high variance),用了十階多項式來擬合數(shù)據(jù)腹殿,雖然模型對現(xiàn)有的數(shù)據(jù)集擬合得很好独悴,但對新數(shù)據(jù)預(yù)測誤差卻很大。只有中間的模型較好地擬合了數(shù)據(jù)集锣尉,可以看到虛線和實線基本重合刻炒。
通過本節(jié)的介紹,我們對欠擬合(高偏差)和過擬合(高方差)有了較為直觀地認(rèn)識自沧。