2020-08-30--多項(xiàng)式回歸01

主要內(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^2X看作兩個特征,所以現(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
2

注意:對于上圖圖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)式回歸的過程:

  1. 使用PolynomialFeatures生成多項(xiàng)式特征的數(shù)據(jù)集
  2. 如果生成數(shù)據(jù)冪特別的大,那么特征直接的差距就會很大,導(dǎo)致我們的搜索非常慢,這時候可以進(jìn)行數(shù)據(jù)歸一化。
  3. 進(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

degree210100的過程中,雖然均方誤差是越來越小的,從均方誤差的角度來看是更加小的 但是他真的能更好的預(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)),這就說明了此時我們的模型的泛化能力不夠好,他的泛化能力是不夠的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容