數據挖掘:模型選擇——監督學習(迴歸)

數據挖掘:模型選擇——監督學習(迴歸)

在上一篇文章數據挖掘:模型選擇——監督學習(分類)中介紹了分類相關的算法原理,這次來介紹迴歸的一些算法。迴歸主要是預測連續型數據的目標值。
本文來自:機器學習菜菜課堂

一、線性迴歸

簡單介紹
簡答的線性迴歸如y=ax+b,這是隻有一個特徵時的情況,而對於多個特徵,就變成了多元線性迴歸。公式如下:
在這裏插入圖片描述
這個θ爲對應自變量的權重值,越大,證明該特徵對結果的影響越重要。由此可以對特徵進行篩選。而我們要求得就是這個參數。

工作原理

一般遇到機器學習的問題,首先都是先定義損失函數。通過對損失函數的優化來求解參數。
這裏用真實值和預測值的殘差平方和作爲要優化的損失函數,也就是θ取何值時,能讓它最小。最小二乘法
在這裏插入圖片描述
這裏有兩種方法進行求解,利用矩陣求解,梯度下降法。
利用矩陣求解:
在這裏插入圖片描述
在這裏插入圖片描述
梯度下降法:
在這裏插入圖片描述
在這裏插入圖片描述

主要參數
沒有參數可以調。所以這個模型無法通過調整參數來優化模型,它只依靠數據。另外,LR需要做歸一化/標準化。

算法特點
優點:結果易於理解,計算上不復雜。
缺點:對非線性的數據擬合不好。易過擬合,因爲尋求的是最優解。
因爲線性迴歸假設特徵和結果之間滿足線性關係
sklearn代碼

from sklearn.linear_model import LinearRegression as LR

reg = LR().fit(Xtrain,Ytrain)
yhat = reg.predict(Xtest)

二、嶺迴歸和Lasso迴歸

嶺迴歸:
簡單介紹
在多元線性的求解推導中,存在逆矩陣,而如果數據的逆矩陣不存在(數據間存在多重共線性,完全線性相關或高度線性相關)的話,那麼模型的預測效果並不會很好。會求出很大的θ造成模型有偏差,或者不可用。

多重共線性可用VIF(方差膨脹因子來衡量)。另外,爲了解決線性迴歸的多重共線性問題,可用嶺迴歸和Lasso迴歸。

工作原理
嶺迴歸和Lasso迴歸都是在線性迴歸的損失函數上加上正則項。嶺迴歸加的是係數的L2範數,Lasso加的是係數的L1範數。
嶺迴歸
嶺迴歸的損失函數:
在這裏插入圖片描述
在這裏插入圖片描述
在加上a後,只要a不爲0或與原矩陣的對角線上的不爲相反數,可保證矩陣爲可逆矩陣。a的值人爲設定。
在這裏插入圖片描述
在這裏插入圖片描述

主要參數
正則化係數a。如a很小,那麼對原來的式子不起作用,非有效的ω。如果a很大,那麼會使迴歸係數發生偏移(a削弱了原本ω所代表的信息)。

通過調整alpha的取值,若模型沒有明顯的改變,則說明數據間沒有多重共線性。若有上升的趨勢,則說明數據間存在多重共線性。alpha取值通過模型的偏差,方差進行調整。主要通過交叉驗證,進行選擇。這裏用帶交叉驗證的嶺迴歸。
在這裏插入圖片描述


Lasso迴歸:
簡單介紹
Lasso的損失函數:
在這裏插入圖片描述

對損失函數求導。
在這裏插入圖片描述
這時的alpha無法對矩陣是否可逆造成影響。lasso無法解決多重共線性的問題。
但在實際問題中,數據之間既沒有完全相關,也沒有完全獨立的。所以,假設矩陣的逆是一直存在的。
在這裏插入圖片描述
alpha可以限制參數的大小,防止因爲多重共線性導致的w被估計過大,導致模型不準確。Lasso不能解決多重共線性,但能限制其影響。alpha壓縮了w係數對原本數據的擬合程度,所以lasso可以做特徵選擇。

L1和L2正則化一個核心差異就是他們對係數 的影響:兩個正則化都會壓縮係數 的大小,對標籤貢獻更少的特徵的係數會更小,也會更容易被壓縮。
不過,L2正則化只會將係數壓縮到儘量接近0,但L1正則化主導稀疏性,因此會將係數壓縮到0。這個性質,讓Lasso成爲了線性模型中的特徵選擇工具首選。

在Lasso上選取alpha值,通過交叉驗證。LassoCV.
eps跟n_alphas。eps取的很小。

sklearn代碼

from sklearn.linear_model import Ridge,Lasso
 
reg = Ridge(alpha=1).fit(Xtrain,Ytrain)
reg = Lasso(alpha=1).fit(Xtrain,Ytrain)

三、多項式迴歸

線性數據與非線性數據
線性關係
”線性“這個詞用於描述不同事物時有着不同的含義。我們最常使用的線性是指“變量之間的線性關係(linear relationship)”,它表示兩個變量之間的關係可以展示爲一條直線,即可以使用方程 來進行擬合。一般通過繪製散點圖來看
在這裏插入圖片描述
線性數據
通常來說,一組數據由多個特徵和標籤組成。當這些特徵分別與標籤存在線性關係的時候,我們就說這一組數據是線性數據。而任一特徵與標籤之間的關係需要三角函數,指數等來定義,那麼就叫非線性數據。
對於線性和非線性數據,最簡單的判別方法就是利用模型來幫助我們——如果是做分類則使用邏輯迴歸,如果做迴歸則使用線性迴歸,如果效果好那數據是線性的,效果不好則數據不是線性的。當然,也可以降維後進行繪圖,繪製出的圖像分佈接近一條直線,則數據就是線性的。
線性關係圖,探索的是特徵和目標變量的關係。
迴歸問題:
在這裏插入圖片描述
分類問題
當我們在進行分類的時候,我們的決策函數往往是一個分段函數,比如二分類下的決策函數可以是符號函數 ,符號函數的圖像可以表示爲取值爲1和-1的兩條直線。這個函數明顯不符合我們所說的可以使用一條直線來進行表示的屬性因此分類問題中特徵與標籤[0,1]或者[-1,1]之間關係明顯是非線性的關係。除非我們在擬合分類的概率,否則不存在例外。
在這裏插入圖片描述
這個是數據分佈圖,橫縱座標是特徵。其中的顏色是目標變量。關心不是擬合,而是能否找到一條直線,將其分開。
在這裏插入圖片描述
總結一下,對於迴歸問題,數據若能分佈爲一條直線,則是線性的,否則是非線性。對於分類問題,數據分佈若能使用一條直線來劃分類別,則是線性可分的,否則數據則是線性不可分的。


線性模型與非線性模型
我們建立的線性迴歸模型,是一個用於擬合線性數據的線性模型。
在這裏插入圖片描述
作爲線性模型的典型代表,我們可以從線性迴歸的方程中總結出線性模型的特點:其自變量都是一次項。

非線性模型擬合線性數據:
線性數據對非線性模型來說比較簡單,容易把訓練集上的R2訓練得很高,MSE訓練得很低。效果好,易過擬合。
在這裏插入圖片描述
線性模型擬合非線性數據:
單純的線性模型處理非線性數據不好。可用線性模型處理分箱之後的非線性數據。
在這裏插入圖片描述
線性模型們的決策邊界都是一條條平行的直線,而非線性模型們的決策邊
界是交互的直線(格子),曲線,環形等等
。對於分類模型來說,這是我們判斷模型是線性還是非線性的重要評判因素:線性模型的決策邊界是平行的直線,非線性模型的決策邊界是曲線或者交叉的直線。對分類問題而言,如果一個分類模型的決策邊界上自變量的最高次方爲1,則我們稱這個模型是線性模型。

既是線性,也是非線性的模型

比如SVM,沒有核的SVM是線性模型,有核的是非線性模型。
在這裏插入圖片描述
主要在二維空間中看決策邊界和擬合圖形是不是直線。
在這裏插入圖片描述


離散化
利用分箱,離散化連續型變量的方法來處理原始數據,以此來提升線性迴歸的表現。

from sklearn.preprocessing import KBinsDiscretizer

#將數據分箱
enc = KBinsDiscretizer(n_bins=10 #分幾類?
					,encode="onehot") 

在這裏插入圖片描述
另外,分箱數是能影響擬合效果的。利用交叉驗證來選擇最優的箱子數。另一種更普遍的處理非線性數據的方法是多項式迴歸。主要是利用跟SVM一樣的升維思想。


多項式迴歸
通過增加自變量的次數(多項式變化),來對線性模型達到升維的效果。
多項式變化是對原始數據進行調整,從而使其能被線性模型擬合。

from sklearn.preprocessing import PolynomialFeatures
import numpy as np

X = np.arange(1,4).reshape(-1,1)
poly = PolynomialFeatures(degree=2)
X_ = poly.fit_transform(X)
X_

可得到如下的結果:
在這裏插入圖片描述
這時,再用線性迴歸來擬合。線性迴歸是會對每個特徵擬合出權重 的,所
以當我們擬合高維數據的時候,我們會得到下面的模型:
在這裏插入圖片描述
而對計算機來說,不理解什麼是截距和係數。因此x0也會被認爲是係數。所以,一般不求截距。
以上是針對數據一維的情況,而二維的情況如下:
在這裏插入圖片描述
在這裏插入圖片描述
當我們進行多項式轉換的時候,多項式會產出到最高次數爲止的所有低高次項。比如如果我們規定多項式的次數爲2,多項式就會產出所有次數爲1和次數爲2的項反饋給我們,相應的如果我們規定多項式的次數爲n,則多項式會產出所有從次數爲1到次數爲n的項。
在多項式迴歸中,我們可以規定是否產生平方或者立方項,其實如果我們只要求高次項的話, 會是一個比 更好的高次項,因爲 x1x2和 x1之間的共線性會比 x1x1與 x1之間的共線性好那麼一點點(只是一點點),而我們多項式轉化之後是需要使用線性迴歸模型來進行擬合的,就算機器學習中不是那麼在意數據上的基本假設,但是太過分的共線性還是會影響到模型的擬合。因此sklearn中存在着控制是否要生成平方和立方項的參數interaction_only,默認爲False,以減少共線性。

多項式迴歸的方程是由原始數據的維度和我們設定的最高次數決定的。因此,多
項式迴歸沒有固定的模型表達式。

多項式迴歸處理非線性問題

from sklearn.preprocessing import PolynomialFeatures as PF
from sklearn.linear_model import LinearRegression
import numpy as np

d=5
#進行高此項轉換
poly = PF(degree=d)
X_ = poly.fit_transform(X)
line_ = PF(degree=d).fit_transform(line)
#訓練數據的擬合
LinearR_ = LinearRegression().fit(X_, y)
LinearR_.score(X_,y)

多項式迴歸能夠較好地擬合非線性數據,還不容易發生過擬合,可以說是保留了線性迴歸作爲線性模型所帶的“不容易過擬合”和**“計算快速**”的性質,同時又實現了優秀地擬合非線性數據.

多項式迴歸的可解釋性:
當我們進行了多項式轉換後,儘管我們還是形成形如線性迴歸的方程,但隨着數據維度和多項式次數的上升,方程也變得異常複雜,我們可能無法一眼看出增維後的特徵是由之前的什麼特徵組成的。比如之前在特徵處理時,用到的多項式方法,會新衍生出多個特徵。
不過,多項式迴歸的可解釋性依然是存在的,我們可以使用接get_feature_names來調用生成的新特徵矩陣的各個特徵上的名稱,以便幫助我們解釋模型。
線性模型的效果雖然不如隨機森林,但是它跑的快……

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
X = np.arange(9).reshape(3, 3)
poly = PolynomialFeatures(degree=5).fit(X)
#重要接口get_feature_names
poly.get_feature_names()#打印特徵名稱

線性還是非線性模型?
原始模型:非線性
在這裏插入圖片描述
改變特徵名稱後:線性
在這裏插入圖片描述
這裏需要了解狹義線性模型廣義線性模型

狹義線性模型:自變量上不能有高此項,自變量與標籤之間不能存在非線性關係。(自變量是一次的
廣義線性模型:只要標籤與模型擬合出的參數之間的關係是線性的,模型就是線性的。這是說,只要生成的一系列 w之間沒有相乘或者相除的關係,我們就認爲模型是線性的。(係數w是一次的
總結一下,多項式迴歸通常被認爲是非線性模型,但廣義上它是一種特殊的線性模型,它能夠幫助我們處理非線性數據,是線性迴歸的一種進化。
多項式變化瘋狂增加數據維度的同時,也增加了過擬合的可能性,因此多項式變化多與能夠處理過擬合的線性模型如嶺迴歸,Lasso等來連用,與在線性迴歸上使用的效果是一致的。

四、總結

多元線性迴歸嶺迴歸Lasso多項式迴歸總計四個算法,他們都是圍繞着原始的線性迴歸進行的拓展和改進。
其中嶺迴歸和Lasso是爲了解決多元線性迴歸中使用最小二乘法的各種限制,主要用途是消除多重共線性帶來的影響並且做特徵選擇。
多項式迴歸解決了線性迴歸無法擬合非線性數據的明顯缺點,核心作用是提升模型的表現。
由於本人這塊也是在跟着學習,所以這塊僅僅是做了筆記。以後有時間會再進行整理。

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