多項式迴歸與模型泛化(入門級通俗詳解版——上)


一入計科深似海,從此頭髮是路人!

先贊再看,養成好習慣!

這個多項式迴歸是建立在已經熟練掌握機器學習中的線性迴歸基礎之上的進一步關於迴歸曲線方法的學習,需要有有一定的sklearn基礎,不過本人也會爲大家做好詳細的註釋,希望大家能夠喜歡!

一 . 一個簡單的小例子

我們都知道線性迴歸法是存在很大的侷限性的,它要求我們被擬合的數據必須存在線性關係,但是現實的世界中,這樣特徵鮮明的數據是很少的,大部分我們待預測的數據本身都是非線性的關係,比如像二次拋物線,或者高次冪函數,下面我們在sklearn中的 LinearRegression算法基礎上拓展一種更適用的擬合方法。

本博客偏代碼的運行與解釋,當然,數學原理也會適當的插入一部分,最終的目的還是讓大家能理解並運用算法!

我們先舉一個簡單的例子來幫助大家我們接下來要做什麼:

(1)創建隨機數據

import numpy as np 
import matplotlib.pyplot as plt

x = np.random.uniform(-3,3,size=100) #在區間[-3,3]上隨機取100個數 
X = x.reshape(-1,1)# 將生成的100個數據搞成一列 不管多少行~~

這裏的uniform是從[-3,3]上均勻分佈裏面隨機取100個數據,reshape函數就這100個數據搞成100行 1列,開頭對導包我就不說了。。。。。

(2)接下來啊,我們隨便寫一個二次多項式函數,構成我們因變量y的數據,後面再跟一個滿足正態分佈的小噪音!

y = 0.7* x **2 + x + 5 + np.random.normal(0,1,size = 100)

(3)x , y數據現在我們都有了,我們來畫個圖看看它長啥樣唄!

plt.scatter(x,y)
plt.show()

在這裏插入圖片描述
憨憨都能看出來這個是個二次函數的模型!O(∩_∩)O哈哈~

(4)這個時候,我們目前也不知道怎麼根據數據擬合曲線啊,只學過線性迴歸,就用這個試一試又何妨,又不要錢!

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)
y_predict = lin_reg.predict(X)

這裏是我們調用LinearRegression算法,通過算法中的計算求殘差和截距等步驟,這一步lin_reg.fit(X,y) 傳入我們需要擬合的數據X與y之後,返回的是已經求好的直線。最後一步,由於直線已經求好了,但直線上的點 是與X對應預測值,我們將這些預測值傳給y_predict 這一個變量名中!
因爲我們要畫圖啊,沒有X,y的值我們畫不了圖啊,得到的直線產生的預測值我們必須將它保存到另一個變量中,不然畫圖的時候y的值從哪裏來,算法沒有給你傳好預測值哦!

(5)這裏還是畫圖,我們用紅色的線畫出擬合成的直線,散點和直線在一起會更直觀!

plt.scatter(x,y)  
plt.plot(X,y_predict,color='r')
plt.show()

在這裏插入圖片描述我們只能說這個直線真的盡力了,但還是沒卵用!

那麼我們如何將這條直線繞着這些點,變彎呢? 其實問題還是出現在我們這個X的原始數據集上,裏面只有100行1列的 數字,算法在擬合的時候只能找到X,前面的X2X^{2}它找死也沒找到!我們改下這個X數據集!

(6)再添加一列,爲第一列數據的平方!

X_2 = np.hstack([X,X**2]) #我們造一個100行2列的數據,,第二列是X的平方

(7)這次,我們再來實現上面的算法和畫圖!

lin_reg_2 = LinearRegression() #用sklearn中實例化 這次用 x與 x的平方去擬合成二次曲線
lin_reg_2.fit(X_2,y)
y_predict_2 = lin_reg_2.predict(X_2)

plt.scatter(x,y)  
plt.plot(np.sort(x),y_predict_2[np.argsort(x)],color='r')
plt.show()

注意,既然X中有2列,分別對應,我們在畫圖的時候就要將X與X2X^{2}對應起來,用到了 sort(x)和 np.argsort(x),結果就是:
在這裏插入圖片描述
這樣,就舒服多了!

二. scikit-learn中的多項式迴歸與pipeline

1. sklearn中的多項式迴歸

上面我們用一個簡單的例子幫助大家更加直觀的理解了多項式迴歸,但是我們不可能每次導入數據集都手動給原始數據進行平方 或者是 高次方操作,我們可以直接用sklearn中的方法實現,這一需求!

(1)開始我們還是和前面一樣,在這裏我再傳入代碼:

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)

(2)重整原始數據集(詳解)

from sklearn.preprocessing import PolynomialFeatures #我們採用 sklearn 中的這個類擬合多項式

這個類(PolynomialFeatures)可以幫助我們,使用它會非常的簡單!

poly = PolynomialFeatures(degree = 2)#這裏的 degree 爲我們需要擬合函數的最高次冪
poly.fit(X)
X_2 = poly.transform (X)#這兩步是訓練和擬合 

這裏的degree就是 y函數中多項式的最高次冪,比如像 y=2x3+x2+4x+1y=2x^{3}+x^{2}+4x +1的degree就是 3,這個自己選擇!後面兩步poly.fit(X) 與 X_2 = poly.transform (X) 其實就是訓練和重整這個數據集!我們把這個新得到的X_2前面幾行展示出來看一下:
在這裏插入圖片描述
我相信大家一看註釋就明白了,這個PolynomialFeatures類的功能是相當強大的!它直接從0
到最高次冪的所用數據情況都給你整合到一個矩陣裏面,非常的方便!那麼如果是多元函數方程呢?又怎麼重整數據,別急,我們先把這個當前的任務完成。。

(3)後面擬合曲線與畫圖的方式都和前main講的一模一樣:

from sklearn.linear_model import LinearRegression  #再引用 這個實現預測
lin_reg_2 = LinearRegression() 
lin_reg_2.fit(X_2,y)
y_predict_2 = lin_reg_2.predict(X_2)

plt.scatter(x,y) #畫圖
plt.plot(np.sort(x),y_predict_2[np.argsort(x)],color = 'r')
plt.show()

在這裏插入圖片描述
完美!

2. 關於PolynomialFeatures

以上都是一元函數的擬合與預測,多元呢?

(1)我們新建一個多列的矩陣:

X = np.arange(1,11).reshape(-1,2) 

X的多元數組就是這樣的,第一列代表 X1X_{1},第二列代表X2X_{2}
在這裏插入圖片描述
(2)使用 PolynomialFeatures數據重整:

poly = PolynomialFeatures(degree = 2)#這裏的 degree 爲我們需要擬合函數的最高次冪
poly.fit(X)
X2 = poly.transform (X)

我們猜一猜會得到幾行幾列的新矩陣勒?
在這裏插入圖片描述第一行還是X的0次方,第二,第三行顯然是我們的原始數據列,第四和第五行我們很容易想到是X12X_{1}^{2}X22X_{2}^{2} 第五行是怎麼來的!靈機一動,你會發現第五行就是X1X2X_{1}\cdot X_{2}.
以此類推,如果有兩個特徵值,而degree=3,那麼這個時候,整合後的數據有多少列呢?10項
在這裏插入圖片描述
所以, PolynomialFeatures的強大性就在於能包含所有可能的的情況!

3. pipeline瞭解一下~~

我們在進行多項式得數據擬合訓練的時候,會先確定最高次冪(degree) 再進行數據重整,但是如果我們的degree太大,會導致比如像 1 和1010010^{100} 之間的差距是非常大的,之後PolynomialFeatures類算法會在degree=100時產生的巨多的項中尋找我們需要的多項式的一部分,這個過程會自動的調用梯度下降法但是數據相差過大的1與1010010^{100} 會嚴重拖慢搜索進程,因此,我們還需需要在這中間插入數據歸一化的過程,然後才能進行擬合,得到我們需要的曲線!這個過程是比較麻煩的,我們這裏可以用這個pipeline法直接三合一,nice!

在這裏說明一下:這裏可能會需要機器學習中數據歸一化的知識,在這裏就不再說了,有不瞭解的小夥伴可以在CSDN上學習

(1)萬年不變的數據。。。

x = np.random.uniform(-3,3,size = 100)
X = x.reshape(-1,1)
y = 0.5* x **3 + x + 2 + np.random.normal(0,1,100)

(2)接下來 調用Pipeline算法:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

poly_reg = Pipeline([
                    ("poly",PolynomialFeatures(degree=3)),
                    ("std_scaler",StandardScaler()),
                    ("iin_reg",LinearRegression())
])

導入sklearn中的Pipeline類之後,注意,這裏使用方法有點不一樣,因爲是將算法三合一,我們設置成這樣:綠色的部分是我們隨便寫一個調用算法的命名,三個算法都需要添加到 pipeline 中.大家需要記住這個表達形式!
(3)之後就大同小異了(這裏我改了函數):

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()

得到的曲線圖爲:
在這裏插入圖片描述

好!本次的博客學習就結束了哦,下篇博客我們繼續會深入學習多項式迴歸與模型泛化,覺得博主講的還算比較詳細負責的話,點點贊,謝謝大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章