主要內(nèi)容
- 什么是多項(xiàng)式回歸
- scikit-learn中的多項(xiàng)式回歸和Pipeline
- 過擬合和欠擬合
- 為什么要使用訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集
- 學(xué)習(xí)曲線
多項(xiàng)式回歸簡介
考慮下面的數(shù)據(jù),雖然我們可以使用線性回歸來擬合這些數(shù)據(jù),但是這些數(shù)據(jù)更像是一條二次曲線,相應(yīng)的方程是y=ax2+bx+c,這是式子雖然可以理解為二次方程,但是我們呢可以從另外一個角度來理解這個式子:
如果將x2理解為一個特征,將x理解為另外一個特征,換句話說,本來我們的樣本只有一個特征x,現(xiàn)在我們把他看成有兩個特征的一個數(shù)據(jù)集。多了一個特征x2,那么從這個角度來看,這個式子依舊是一個線性回歸的式子。
但是從x的角度來看,他就是一個關(guān)于x的二次方程。

以上這樣的方式,就是所謂的多項(xiàng)式回歸
相當(dāng)于我們?yōu)闃颖径嗵砑恿艘恍┨卣?,這些特征是原來樣本的多項(xiàng)式項(xiàng),增加了這些特征之后,我們們可以使用線性回歸的思路更好的我們的數(shù)據(jù)。
1.什么是多項(xiàng)式回歸
生成一定數(shù)量的關(guān)于x的二次方程的擬合點(diǎn)
import numpy as np
import matplotlib.pyplot as plt
x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
# 一元二次方程
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, 100)
plt.scatter(x, y)
plt.show()

可見這些點(diǎn)的關(guān)于二次分布其實(shí)不太明顯,所以我們先使用線性回歸進(jìn)行測試。
1.1 線性回歸測試
from sklearn.linear_model import LinearRegression
lin = LinearRegression()
lin.fit(X,y)
y_predict = lin.predict(X)
# 畫圖
plt.scatter(x, y)
plt.plot(x,y_predict,color='r')
plt.show()

很明顯,我們用一跟直線來擬合一根有弧度的曲線,效果是不好的。
1.2 解決方案,添加一個特征
方案思路:原來所有的數(shù)據(jù)都在X中,我們要把X^2和X看作兩個特征,所以現(xiàn)在對X中每一個數(shù)據(jù)都進(jìn)行平方, 再將得到的數(shù)據(jù)集與原數(shù)據(jù)集進(jìn)行拼接, 在用新的數(shù)據(jù)集進(jìn)行線性回歸。
'''修改數(shù)據(jù)集'''
X2 = np.hstack([X,X**2])
print(X2.shape)
# (100, 2)
'''再次使用線性回歸進(jìn)行測試'''
lin1 = LinearRegression()
lin1.fit(X2,y)
y_predict1 = lin1.predict(X2)
plt.scatter(x, y)
plt.plot(x,y_predict1,color='r')
plt.show()
plt.scatter(x, y)
plt.plot(np.sort(x),y_predict1[np.argsort(x)],color='r')
plt.show()


注意:對于上圖圖1的繪制方式,是因?yàn)槔L畫線時,是通過一個點(diǎn)一個點(diǎn)連接畫出來的,由于x數(shù)據(jù)集中的點(diǎn)都是隨機(jī)的,所以大小不一,畫出來的圖形就交叉錯亂。
所以將x中所有的點(diǎn)排序后,y根據(jù)排序后點(diǎn)的索引進(jìn)行從小到大的描點(diǎn)才可以。
從上圖可以看出,當(dāng)我們添加了一個特征(原來特征的平方)之后,再從x的維度來看,就形成了一條曲線,顯然這個曲線對原來數(shù)據(jù)集的擬合程度是更好的。
# 系數(shù)向量,第一個系數(shù)是x前面的系數(shù),第二個系數(shù)是x平方前面的系數(shù)
print(lin1.coef_)
# [1.03557896 0.52749922]
# 截距theta(0)
print(lin1.intercept_)
# 1.8454742506634763
1.3 總結(jié)
多項(xiàng)式回歸在機(jī)器學(xué)習(xí)算法上并沒有新的地方,完全是使用線性回歸的思路 他的關(guān)鍵在于為原來的樣本,添加新的特征。而我們得到新的特征的方式是原有特征的多項(xiàng)式的組合。 采用這樣的方式,我們就可以解決一些非線性的問題。
與此同時需要注意,我們在上一章所講的PCA是對我們的數(shù)據(jù)進(jìn)行降維處理,而我們這一章所講的多項(xiàng)式回歸顯然在做一件相反的事情,他讓我們的數(shù)據(jù)升維,在升維之后使得我們的算法可以更好的擬合高緯度的數(shù)據(jù)。
2.scikit-learn中的多項(xiàng)式回歸 和 Pipeline
2.1scikit-learn中的多項(xiàng)式回歸
1.數(shù)據(jù)處理----使用PolynomialFeatures類
import numpy as np
x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, 100)
# sklearn中對數(shù)據(jù)進(jìn)行預(yù)處理的函數(shù)都封裝在preprocessing模塊下,包括之前學(xué)的歸一化StandardScaler
from sklearn.preprocessing import PolynomialFeatures
ploy = PolynomialFeatures(degree=2)
ploy.fit(X)
X2 = ploy.transform(X)
print(X.shape)
# (100, 1)
print(X[:5,:])
# # [[-1.71224922]
# # [-1.04502905]
# # [-1.57688397]
# # [-0.50319217]
# # [ 2.42563976]]
print(X2.shape)
# (100, 3)
print(X2[:5,:])
# [[ 1. -1.71224922 2.9317974 ]
# [ 1. -1.04502905 1.09208572]
# [ 1. -1.57688397 2.48656305]
# [ 1. -0.50319217 0.25320236]
# [ 1. 2.42563976 5.88372824]]
2.新數(shù)據(jù)線性回歸
from sklearn.linear_model import LinearRegression
lin = LinearRegression()
lin.fit(X2,y)
y_predict = lin.predict(X2)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
plt.show()

print(lin.intercept_)
# 1.9848103836687603
print(lin.coef_)
# [0. 0.95297681 0.5023139 ]
由此可見圖形以及訓(xùn)練結(jié)果參數(shù)與預(yù)期結(jié)果大概一致。
3. 關(guān)于PolynomialFeatures類
為什么使用這個類處理后的數(shù)據(jù)再進(jìn)行訓(xùn)練時,能夠達(dá)到預(yù)期的效果呢?
在其內(nèi)部發(fā)生了什么。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(1, 11).reshape(-1, 2)
poly = PolynomialFeatures(degree=2)
poly.fit(X)
X2 = poly.transform(X)
print(X.shape)
# (5, 2)
print(X)
# [[ 1 2]
# [ 3 4]
# [ 5 6]
# [ 7 8]
# [ 9 10]]
print(X2.shape)
# (5, 6)
print(X2)
# [[ 1. 1. 2. 1. 2. 4.]
# [ 1. 3. 4. 9. 12. 16.]
# [ 1. 5. 6. 25. 30. 36.]
# [ 1. 7. 8. 49. 56. 64.]
# [ 1. 9. 10. 81. 90. 100.]]
degree=2,將5行2列的矩陣進(jìn)行多項(xiàng)式轉(zhuǎn)換后變成了5行6列。
分析:
- 第一列是都為1,對應(yīng)的是0次冪。
- 第二列和第三列對應(yīng)的是原來的x矩陣,此時他有兩列一次冪的項(xiàng)。
- 第四列是原來數(shù)據(jù)的第一列平方的結(jié)果
- 第六列是原來數(shù)據(jù)的第二列平方的結(jié)果
- 第五列是原來數(shù)據(jù)的兩列相乘的結(jié)果
可以想象如果將degree設(shè)置為3,那么將產(chǎn)生一下10個元素

也就是說PolynomialFeatures會窮舉出所有的多項(xiàng)式之間的全部組合。
2.2 Pipeline
pipline的英文名字是管道,那么 我們?nèi)绾问褂霉艿滥?,先考慮我們多項(xiàng)式回歸的過程:
- 使用PolynomialFeatures生成多項(xiàng)式特征的數(shù)據(jù)集
- 如果生成數(shù)據(jù)冪特別的大,那么特征直接的差距就會很大,導(dǎo)致我們的搜索非常慢,這時候可以進(jìn)行數(shù)據(jù)歸一化。
- 進(jìn)行線性回歸 pipline 的作用就是把上面的三個步驟合并,使得我們不用一直重復(fù)這三步
x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, 100)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# 傳入每一步的對象名和類的實(shí)例化
poly_reg = Pipeline([
("poly", PolynomialFeatures(degree=2)),
("std_scaler", StandardScaler()),
("lin_reg", LinearRegression())
])
poly_reg.fit(X, y)
y_predict = poly_reg.predict(X)
plt.scatter(x, y)
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
plt.show()

3. 過擬合和欠擬合
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(666)
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)
plt.scatter(x, y)
plt.show()

3.1 使用線性回歸
使用普通線性回歸進(jìn)行預(yù)測:
'''1.使用線性回歸預(yù)測'''
from sklearn.linear_model import LinearRegression
lin = LinearRegression()
lin.fit(X,y)
y_perdict = lin.predict(X)
score = lin.score(X,y)
print(score) # 0.4953707811865009
plt.scatter(x,y)
plt.plot(np.sort(x),y_perdict[np.argsort(x)],color='r')
plt.show()

查看誤差:
# 誤差
from sklearn.metrics import mean_squared_error
re = mean_squared_error(y,y_perdict)
print(re)
# 3.0750025765636577
3.2 使用多項(xiàng)式回歸
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
def PolynomialRegression(degree):
return Pipeline([
("ploy",PolynomialFeatures(degree=degree)), # 數(shù)據(jù)處理
("std_scaler",StandardScaler()), # 歸一化
("lin",LinearRegression()) # 線性回歸
])
ploy = PolynomialRegression(degree=2)
ploy.fit(X,y)
y_perdict = ploy.predict(X)
re = mean_squared_error(y,y_perdict)
print(re)
# 1.0987392142417858
plt.scatter(x, y)
plt.plot(np.sort(x), y_perdict[np.argsort(x)], color='r')
plt.show()

3.3 過擬合
我們處理具體的數(shù)據(jù)集時,是不知道degree的值為多少合適的,所以就有以下:
'''degree=10'''
ploy = PolynomialRegression(degree=10)
ploy.fit(X,y)
y_perdict = ploy.predict(X)
re = mean_squared_error(y,y_perdict)
print(re)
# 1.0987392142417858
plt.scatter(x, y)
plt.plot(np.sort(x), y_perdict[np.argsort(x)], color='r')
plt.show()
'''degree=100'''
ploy = PolynomialRegression(degree=100)
ploy.fit(X,y)
y_perdict = ploy.predict(X)
re = mean_squared_error(y,y_perdict)
print(re)
# 1.0987392142417858
plt.scatter(x, y)
plt.plot(np.sort(x), y_perdict[np.argsort(x)], color='r')
plt.show()
degree=10:

degree=100:

可見degree的值越大,表示結(jié)果越擬合真實(shí)數(shù)據(jù)集。
但是這條曲線只是原來隨機(jī)生成的點(diǎn)(分布不均勻),對應(yīng)的y的預(yù)測值連接起來的曲線,不過有x軸很多地方可能沒有數(shù)據(jù)點(diǎn),所以連接的結(jié)果和原來的曲線不一樣(不是真實(shí)的y曲線)。 下面嘗試真正還原原來的曲線(構(gòu)造均勻分布的原數(shù)據(jù)集)
生成均勻數(shù)據(jù)點(diǎn)
np.linspace():生成等差數(shù)列的數(shù)據(jù)。
x = np.linspace(-3, 3, 100)
X_plot = x.reshape(100, 1)
y_plot = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)
plt.scatter(x,y_plot)
plt.show()
ploy = PolynomialRegression(degree=100)
ploy.fit(X_plot,y_plot)
y_perdict = ploy.predict(X_plot)
plt.scatter(x,y_plot)
plt.plot(X_plot[:,0], y_perdict, color='r')
plt.show()

3.4 總結(jié)
總有一條曲線,他能擬合所有的樣本點(diǎn),使得均方誤差的值為0。
degree從2到10到100的過程中,雖然均方誤差是越來越小的,從均方誤差的角度來看是更加小的 但是他真的能更好的預(yù)測我們數(shù)據(jù)的走勢嗎?
例如我們選擇2.5到3的一個x,使用上圖預(yù)測出來的y的大?。?或者-1之間)顯然不符合我們的數(shù)據(jù)。
換句話說,我們使用了一個非常高維的數(shù)據(jù),雖然使得我們的樣本點(diǎn)獲得了更小的誤差,但是這根曲線完全不是我們想要的樣子 他為了擬合我們所有的樣本點(diǎn),變的太過復(fù)雜了,這種情況就是過擬合【over-fitting】
相反,在最開始,我們直接使用一根直線來擬合我們的數(shù)據(jù),也沒有很好的擬合我們的樣本特征,當(dāng)然他犯的錯誤不是太過復(fù)雜了,而是太過簡單了 這種情況,我們成為欠擬合-【under-fitting】
對于現(xiàn)在的數(shù)據(jù)(基于二次方程構(gòu)造),我們使用低于2項(xiàng)的擬合結(jié)果,就是欠擬合;高于2項(xiàng)的擬合結(jié)果,就是過擬合。
4. 為什么要使用訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集
模型泛化程度
使用上節(jié)的過擬合結(jié)果,我們可以得知,雖然我們訓(xùn)練出的曲線將原來的樣本點(diǎn)擬合的非常好,總體的誤差非常的小, 但是一旦來了新的樣本點(diǎn),他就不能很好的預(yù)測了,在這種情況下,我們就稱我們得到的這條彎彎曲曲的曲線,他的泛化能力(由此及彼的能力)非常弱。
訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集的意義
我們訓(xùn)練的模型目的是為了使得預(yù)測的數(shù)據(jù)能夠盡肯能的準(zhǔn)確,在這種情況下,我們觀察訓(xùn)練數(shù)據(jù)集的擬合程度是沒有意義的 我們真正需要的是,我們得到的模型的泛化能力更高,解決這個問題的方法也就是使用訓(xùn)練數(shù)據(jù)集,測試數(shù)據(jù)集的分離。

測試數(shù)據(jù)對于我們的模型是全新的數(shù)據(jù),如果使用訓(xùn)練數(shù)據(jù)獲得的模型面對測試數(shù)據(jù)也能獲得很好的結(jié)果,那么我們就說我們的模型泛化能力是很強(qiáng)的。 如果我們的模型面對測試數(shù)據(jù)結(jié)果很差的話,那么他的泛化能力就很弱。事實(shí)上,這是訓(xùn)練數(shù)據(jù)集更大的意義
train test split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
直接使用線性回歸:
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)
y_predict = lin_reg.predict(X_test)
re = mean_squared_error(y_test, y_predict)
print(re)
# 2.2199965269396573
使用多項(xiàng)式回歸:degree=2
poly2_reg = PolynomialRegression(degree=2)
poly2_reg.fit(X_train, y_train)
y2_predict = poly2_reg.predict(X_test)
re = mean_squared_error(y_test, y2_predict)
print(re)
# 0.80356410562978997
使用多項(xiàng)式回歸:degree=10
poly10_reg = PolynomialRegression(degree=10)
poly10_reg.fit(X_train, y_train)
y10_predict = poly10_reg.predict(X_test)
re = mean_squared_error(y_test, y10_predict)
print(re)
# 0.92129307221507939
使用多項(xiàng)式回歸:degree=100
poly100_reg = PolynomialRegression(degree=100)
poly100_reg.fit(X_train, y_train)
y100_predict = poly100_reg.predict(X_test)
re = mean_squared_error(y_test, y100_predict)
print(re)
# 14075796419.234262
上邊我們進(jìn)行的實(shí)驗(yàn)實(shí)際上在實(shí)驗(yàn)?zāi)P偷?strong>復(fù)雜度:
- 對于多項(xiàng)式模型來說,我們回歸的階數(shù)越高,我們的模型會越復(fù)雜,在這種情況下對于我們的機(jī)器學(xué)習(xí)算法來說,通常是有下面一張圖的。橫軸是模型復(fù)雜度(對于不同的算法來說,代表的是不同的意思,比如對于多項(xiàng)式回歸來說,是階數(shù)越高,越復(fù)雜;對于KNN來說,是K越小,模型越復(fù)雜,k越大,模型最簡單,當(dāng)k=n的時候,模型就簡化成了看整個樣本里,哪種樣本最多,當(dāng)k=1來說,對于每一個點(diǎn),都要找到離他最近的那個點(diǎn)),另一個維度是模型準(zhǔn)確率(也就是他能夠多好的預(yù)測我們的曲線)

通常對于這樣一個圖,會有兩根曲線:
對于訓(xùn)練數(shù)據(jù)集來說的,模型越復(fù)雜,模型準(zhǔn)確率越高,因?yàn)槟P驮綇?fù)雜,對訓(xùn)練數(shù)據(jù)集的擬合就越好,相應(yīng)的模型準(zhǔn)確率就越高。
對于測試數(shù)據(jù)集來說,在模型很簡單的時候,模型的準(zhǔn)確率也比較低,隨著模型逐漸變復(fù)雜,對測試數(shù)據(jù)集的準(zhǔn)確率在逐漸的提升,提升到一定程度后,如果模型繼續(xù)變復(fù)雜,那么我們的模型準(zhǔn)確率將會進(jìn)行下降(欠擬合->正合適->過擬合)。
欠擬合和過擬合的標(biāo)準(zhǔn)定義:
欠擬合:算法所訓(xùn)練的模型不能完整表述數(shù)據(jù)關(guān)系
過擬合:算法所訓(xùn)練的模型過多的表達(dá)了數(shù)據(jù)間的噪音關(guān)系
5.模型學(xué)習(xí)復(fù)雜度曲線
5.1 學(xué)習(xí)曲線
生成數(shù)據(jù)以及分割數(shù)據(jù):
import numpy as np
import matplotlib.pyplot as plt
'''1. 生成數(shù)據(jù)'''
np.random.seed(666)
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)
plt.scatter(x, y)
plt.show()
'''2. 數(shù)據(jù)分割'''
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=10)
print(X_train.shape)
# (75, 1)

觀察線性回歸的學(xué)習(xí)曲線:觀察線性回歸模型隨著訓(xùn)練數(shù)據(jù)集增加,性能的變化
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
train_score = []
test_score = []
# 訓(xùn)練次數(shù)為訓(xùn)練集中數(shù)據(jù)個數(shù)次,每次訓(xùn)練數(shù)據(jù)的個數(shù)逐次遞增
for i in range(1,X_train.shape[0]+1):
lin = LinearRegression()
# 每次訓(xùn)練的訓(xùn)練集個數(shù)都是i個
lin.fit(X_train[:i],y_train[:i])
# 用訓(xùn)練集的前i個數(shù)據(jù)作為測試集
y_train_predict = lin.predict(X_train[:i])
train_score.append(mean_squared_error(y_train[:i], y_train_predict))
# 使用測試集進(jìn)行預(yù)測
y_test_predict = lin.predict(X_test)
test_score.append(mean_squared_error(y_test, y_test_predict))
plt.plot([i for i in range(1,X_train.shape[0]+1)],np.sqrt(train_score),label='train')
plt.plot([i for i in range(1,X_train.shape[0]+1)],np.sqrt(test_score),label='test')
plt.show()

分析:
從趨勢上看:
- 在訓(xùn)練數(shù)據(jù)集上,誤差是逐漸升高的。這是因?yàn)槲覀兊挠?xùn)練數(shù)據(jù)越來越多,我們的數(shù)據(jù)點(diǎn)越難得到全部的累積,不過整體而言,在剛開始的時候誤差變化的比較快,后來就幾乎不變了
- 在測試數(shù)據(jù)集上,在使用非常少的樣本進(jìn)行訓(xùn)練的時候,剛開始我們的測試誤差非常的大,當(dāng)訓(xùn)練樣本大到一定程度以后,我們的測試誤差就會逐漸減小,減小到一定程度后,也不會小太多,達(dá)到一種相對穩(wěn)定的情況。
- 在最終,測試誤差和訓(xùn)練誤差趨于相等,不過測試誤差還是高于訓(xùn)練誤差一些,這是因?yàn)?,?xùn)練數(shù)據(jù)在數(shù)據(jù)非常多的情況下,可以將數(shù)據(jù)擬合的比較好,誤差小一些,但是泛化到測試數(shù)據(jù)集的時候,還是有可能多一些誤差
1. 封裝學(xué)習(xí)曲線為函數(shù)
參數(shù):模型對象,訓(xùn)練集數(shù)據(jù),測試集數(shù)據(jù)
def plot_learning_curve(algo, X_train, X_test, y_train, y_test):
train_score = []
test_score = []
for i in range(1, len(X_train)+1):
algo.fit(X_train[:i], y_train[:i])
y_train_predict = algo.predict(X_train[:i])
train_score.append(mean_squared_error(y_train[:i], y_train_predict))
y_test_predict = algo.predict(X_test)
test_score.append(mean_squared_error(y_test, y_test_predict))
plt.plot([i for i in range(1, len(X_train)+1)],
np.sqrt(train_score), label="train")
plt.plot([i for i in range(1, len(X_train)+1)],
np.sqrt(test_score), label="test")
plt.legend()
plt.axis([0, len(X_train)+1, 0, 4])
plt.show()
2. 使用線性回歸模型算法進(jìn)行測試
# 使用線性回歸模型
plot_learning_curve(LinearRegression(), X_train, X_test, y_train, y_test)

3. 使用多項(xiàng)式模型測試
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
def PolynomialRegression(degree):
return Pipeline([
("poly", PolynomialFeatures(degree=degree)),
("std_scaler", StandardScaler()),
("lin_reg", LinearRegression())
])
poly2_reg = PolynomialRegression(degree=2)
plot_learning_curve(poly2_reg, X_train, X_test, y_train, y_test)

首先整體從趨勢上,和線性回歸的學(xué)習(xí)曲線是類似的 仔細(xì)觀察,和線性回歸曲線的不同在于,線性回歸的學(xué)習(xí)曲線1.5-1.8左右;二階多項(xiàng)式回歸穩(wěn)定在了0.9-1.1左右,所以二階多項(xiàng)式穩(wěn)定的誤差比較低,說明使用二階線性回歸的性能是比較好的。
增大參數(shù)degree的值
poly20_reg = PolynomialRegression(degree=20)
plot_learning_curve(poly20_reg, X_train, X_test, y_train, y_test)

在使用20階多項(xiàng)式回歸訓(xùn)練模型的時候可以發(fā)現(xiàn),在數(shù)據(jù)量偏多的時候,我們的訓(xùn)練數(shù)據(jù)集擬合的是比較好的,但是測試數(shù)據(jù)集的誤差相對來說增大了很多,離訓(xùn)練數(shù)據(jù)集比較遠(yuǎn),通常這就是過擬合的結(jié)果,他的泛化能力是不夠的。
5.2 總結(jié)

對于欠擬合,它的誤差值比最佳的情況趨于穩(wěn)定的那個位置要高一些,說明無論對于訓(xùn)練數(shù)據(jù)集還是測試數(shù)據(jù)集來說,誤差都比較大。這是因?yàn)槲覀?strong>本身模型選的就不對,所以即使在訓(xùn)練數(shù)據(jù)集上,他的誤差也是大的,所以才會呈現(xiàn)出這樣的一種形態(tài)。

對于過擬合的情況,在訓(xùn)練數(shù)據(jù)集上,他的誤差不大,和最佳的情況是差不多的,甚至在極端情況,如果degree取更高的話,那么訓(xùn)練數(shù)據(jù)集的誤差會更低。
但是問題在于,測試數(shù)據(jù)集的誤差相對是比較大的,并且訓(xùn)練數(shù)據(jù)集的誤差和測試數(shù)據(jù)集的誤差相差比較大(表現(xiàn)在圖上相差比較遠(yuǎn)),這就說明了此時我們的模型的泛化能力不夠好,他的泛化能力是不夠的。