用Scikit-learn和TensorFlow进行机器学习(四)
文章目錄
- 訓(xùn)練模型概述
- 一、線性回歸
- 1、模型
- 2、評(píng)估方法
- 3、正規(guī)方程(The Normal Equation)
- 4、計(jì)算復(fù)雜度
- 5、梯度下降
- (1)概述
- (2)線性回歸的梯度下降
- (3)批量梯度下降
- (4)隨機(jī)梯度下降
- (5)小批量梯度下降
- 6、優(yōu)化算法比較
- 二、多項(xiàng)式回歸
- 1、數(shù)據(jù)生成
- 2、擬合
- 3、學(xué)習(xí)曲線
- (1)欠擬合
- (2)過擬合
- (3)偏差和方差
- 三、正則化
- 1、嶺(Ridge)回歸
- (1)概述
- (2)嶺回歸的損失函數(shù)
- (3)嶺回歸的封閉方程
- 2、LASSO回歸
- (1)損失函數(shù)
- (2)對(duì)比
- 3、ElasticNet(彈性網(wǎng)絡(luò))
- (1)損失函數(shù)
- (2)實(shí)現(xiàn)
- 4、四種模型的選擇
- 5、早期停止法( Early Stopping)
- (1)概述
- (2)實(shí)現(xiàn)
- 四、邏輯回歸
- 1、概率估計(jì)
- 2、訓(xùn)練和損失函數(shù)
- 3、決策邊界
- 五、Softmax回歸
- 1、原理
- 2、訓(xùn)練
訓(xùn)練模型概述
作用:快速找到恰當(dāng)?shù)臋C(jī)器學(xué)習(xí)模型、訓(xùn)練算法、好的額假設(shè)集、有助于調(diào)試參數(shù)和有效的誤差分析。
以簡單線性回歸為例,討論不同訓(xùn)練方法的模型最優(yōu)解問題:
- 直接采用封閉方程進(jìn)行求解,得到當(dāng)前訓(xùn)練集的最優(yōu)參數(shù)(最小化損失函數(shù))
- 迭代優(yōu)化(梯度下降,GD):通過逐漸調(diào)整模型參數(shù)以獲得最小的損失函數(shù)。批量梯度下降(Batch GD)、小批量梯度下降(Mini-batch GD)、隨機(jī)梯度下降(Stochastic GD)
多項(xiàng)式回歸模型:通過曲線判斷模型是否過擬合,并介紹正則化方法減少過擬合風(fēng)險(xiǎn)。
Logistic回歸和Softmax回歸
一、線性回歸
重要:理解思想
1、模型
線性回歸預(yù)測(cè)模型:
y^=θ0+θ1x1+θ2x2+...++θnxn\hat{y} = \theta_0+\theta_1x_1+\theta_2x_2+...++\theta_nx_ny^?=θ0?+θ1?x1?+θ2?x2?+...++θn?xn?
其中,y^\hat{y}y^? 表示預(yù)測(cè)結(jié)果,nnn 表示特征的個(gè)數(shù),xix_ixi? 表達(dá)第 iii 個(gè)特征的值,θj\theta_jθj? 表達(dá)第 jjj 個(gè)參數(shù)(包括偏置項(xiàng)θ0\theta_0θ0?和特征權(quán)重值θ1,θ2,...,θn\theta_1,\theta_2,...,\theta_nθ1?,θ2?,...,θn?)
線性回歸預(yù)測(cè)模型(向量形式)
y^=hθ(X)=θTX\hat{y} = h_{\theta}(X)=\theta^TXy^?=hθ?(X)=θTX
其中,θ\thetaθ 表示模型的參數(shù)向量包括偏置項(xiàng)θ0\theta_0θ0?和特征權(quán)重值θ1,θ2,...,θn\theta_1,\theta_2,...,\theta_nθ1?,θ2?,...,θn?;θT\theta^TθT 表示向量 θ\thetaθ 的轉(zhuǎn)置(行向量轉(zhuǎn)換為列向量);XXX 為每個(gè)樣本中特征值的向量形式,包括 x1x_1x1? 到 xnx_nxn?,且 x0x_0x0? 恒為1;hθh_{\theta}hθ? 表示假設(shè)函數(shù)。
2、評(píng)估方法
評(píng)估方法:均方根誤差(RMSE),常用于回歸模型。最小化均方根差等價(jià)于最小化均方根誤差且更加簡單,兩者可得到相同的參數(shù) θ\thetaθ。
損失函數(shù):hθh_{\theta}hθ? 的均方差(MSE)
MSE(X,hθ)=1m∑i=1m(θT?x(i)?y(i))2MSE(X,h_{\theta})=\frac{1}{m}\sum_{i=1}^{m}{(\theta^T·x^{(i)}-y^{(i)})^2}MSE(X,hθ?)=m1?i=1∑m?(θT?x(i)?y(i))2
3、正規(guī)方程(The Normal Equation)
解方程得到最優(yōu)解
θ^=(XT?X)?1?XT?y\hat{\theta} = (X^T·X)^{-1}·X^T·yθ^=(XT?X)?1?XT?y
其中,θ^\hat{\theta}θ^ 表示最小化損失 θ\thetaθ 的值;yyy 是一個(gè)向量,其包含了 y(1)y^{(1)}y(1) 到 y(m)y^{(m)}y(m) 的值。
輸出結(jié)果
等價(jià)方法
from sklearn.linear_model import LinearRegression line_reg = LinearRegression() line_reg.fit(X, y) print(line_reg.intercept_, line_reg.coef_) print(line_reg.predict(X_new))輸出結(jié)果
[4.1001622] [[2.89052294]] [[4.1001622 ][9.88120808]]4、計(jì)算復(fù)雜度
一個(gè)矩陣求逆的運(yùn)算復(fù)雜度大約在 O(n2.4)O(n^{2.4})O(n2.4) 到 O(n3)O(n^{3})O(n3) 之間,具體值取決于計(jì)算方式。當(dāng)特征個(gè)數(shù)較大時(shí),正規(guī)方程求解將會(huì)非常慢,但是線性回歸模型預(yù)測(cè)是非常快的。
5、梯度下降
(1)概述
思路:通過迭代來逐漸調(diào)整參數(shù)使得損失函數(shù)達(dá)到最小值。
具體來說:開始選定一個(gè)隨機(jī)的 θ\thetaθ(稱為隨機(jī)初始值),然后計(jì)算參數(shù) θ\thetaθ 的局部梯度,同時(shí)沿著梯度下降得方向進(jìn)行下一次迭代,直到算法收斂到一個(gè)最小值。
參數(shù):步長,超參數(shù)學(xué)習(xí)率的值決定了步長的大小。若學(xué)習(xí)率太小,迭代次數(shù)多,耗時(shí);若學(xué)習(xí)率太大,可能不收斂、產(chǎn)生跌蕩、發(fā)散。
兩個(gè)主要挑戰(zhàn):
- 隨機(jī)初始值可能收斂到局部最小值,而非全局最小值。(初始值在左側(cè))
- 需要很長時(shí)間才能收斂,若過早結(jié)束訓(xùn)練,則可能不會(huì)到全局最小值。(初始值在右側(cè))
(2)線性回歸的梯度下降
梯度下降可以無線接近全局最小值:
- 線性回歸模型的均方差損失函數(shù)是一個(gè)凸函數(shù),表示損失函數(shù)沒有局部最小值,只有一個(gè)全局最小值。
- 且它也是一個(gè)斜率不能突變的連續(xù)函數(shù)。
注意:在使用梯度下降的時(shí)候,應(yīng)保證所有的特征有著相近的尺度范圍(eg:StandardScaler類)
,否則它需要很長時(shí)間才能收斂。
(3)批量梯度下降
計(jì)算每一個(gè) θj\theta_jθj? 下?lián)p失函數(shù)的梯度(求偏導(dǎo)數(shù)),記為 ??θjMSE(θ)\frac{\partial}{\partial \theta_j}MSE(\theta)?θj???MSE(θ)
損失函數(shù)的偏導(dǎo)數(shù)
??θjMSE(θ)=2m∑i=1m(θT?x(i)?y(i))xj(i)\frac{\partial}{\partial \theta_j}MSE(\theta)=\frac{2}{m}\sum_{i=1}^{m}(\theta^T·x^{(i)}-y^{(i)})x_j^{(i)}?θj???MSE(θ)=m2?i=1∑m?(θT?x(i)?y(i))xj(i)?
梯度向量計(jì)算 ?θMSE(θ)\nabla_\theta{MSE(\theta)}?θ?MSE(θ),其包含損失函數(shù)所有的偏導(dǎo)數(shù)
?θMSE(θ)=(??θ0MSE(θ)??θ1MSE(θ)???θnMSE(θ))=2mXT?(X?θ?y)\nabla_\theta{MSE(\theta)}=\begin{pmatrix} \frac{\partial}{\partial \theta_0}MSE(\theta)\\ \frac{\partial}{\partial \theta_1}MSE(\theta)\\ {\vdots}\\ \frac{\partial}{\partial \theta_n}MSE(\theta)\\ \end{pmatrix}=\frac{2}{m}X^T·(X·\theta-y)?θ?MSE(θ)=???????θ0???MSE(θ)?θ1???MSE(θ)??θn???MSE(θ)???????=m2?XT?(X?θ?y)
該算法每一次訓(xùn)練過程都是用所有的訓(xùn)練數(shù)據(jù)。
參數(shù)更新:
θnextstep=θ?η?θMSE(θ)\theta^{next\ step}=\theta - \eta\nabla_\theta{MSE(\theta)}θnext?step=θ?η?θ?MSE(θ)
其中,學(xué)習(xí)率 η\etaη 和梯度向量的乘積決定了每一次更新的步長。
輸出結(jié)果
[[4.19096745][2.91710735]]學(xué)習(xí)率的選取:網(wǎng)格搜索
迭代次數(shù)選取:通常設(shè)置一個(gè)非常大的迭代次數(shù),但是當(dāng)梯度向量變得非常小的時(shí)候,結(jié)束迭代。即,梯度向量小于一個(gè)值 ε\varepsilonε (稱為容差)
收斂速率:損失函數(shù)是凸函數(shù),且斜率不能突變,則學(xué)習(xí)率固定后,它的收斂速率為 O(1iterations)O(\frac{1}{iterations})O(iterations1?)
缺點(diǎn):在較大規(guī)模數(shù)據(jù)集上計(jì)算每一步的梯度時(shí)非常慢。
(4)隨機(jī)梯度下降
關(guān)鍵點(diǎn):每次迭代,隨機(jī)在訓(xùn)練集中選取訓(xùn)練集中的一個(gè)樣本,所以隨機(jī)梯度下降算法可以在大規(guī)模數(shù)據(jù)記上使用。
==》由于隨機(jī)性,所以呈現(xiàn)更多的不規(guī)律性:它達(dá)到最小值不是平緩的下降,損失函數(shù)會(huì)忽高忽低,只是在大體上呈下降趨勢(shì)。當(dāng)算法停止時(shí),最后的參數(shù)還不錯(cuò),但非最優(yōu)值。
優(yōu)點(diǎn):
- 隨機(jī)梯度下降在尋找全局最小值上比批量梯度下降表現(xiàn)好,它可以跳過局部最優(yōu)值。
可以跳過局部最優(yōu)值,但是它卻不能達(dá)到最小值。
==》解決方法:模擬退火(逐漸降低學(xué)習(xí)率:開始時(shí),學(xué)習(xí)率較大,然后變得越來越小)
==》決定每次迭代的學(xué)習(xí)率的函數(shù):learning schedule
輸出結(jié)果
[[4.07764462][2.83037765]]由于每個(gè)實(shí)例的選擇是隨機(jī)的,所以有的實(shí)例可能未被選到,若要遍歷所有實(shí)例:
- 打亂訓(xùn)練集,然后依次選擇實(shí)例,但收斂速度會(huì)慢;
- sklearn中的 SGDRegressor 類,該類默認(rèn)優(yōu)化的是均方差損失函數(shù)。
迭代50代,學(xué)習(xí)率為0.1,使用默認(rèn)的 learning schedule,沒有正則項(xiàng)(penalty=None)
from sklearn.linear_model import SGDRegressor sgd_reg = SGDRegressor(n_iter=50, penalty=None, eta0=0.1) sgd_reg.fit(X, y.ravel()) ## 輸出參數(shù) print(sgd_reg.intercept_, sgd_reg.coef_)輸出結(jié)果
[3.96146609] [3.15715714](5)小批量梯度下降
使用一個(gè)隨機(jī)的小型實(shí)例集進(jìn)行每次的迭代,可以通過矩陣運(yùn)算的硬件優(yōu)化得到一個(gè)較好的訓(xùn)練表現(xiàn),尤其使用GPU時(shí)。
不同方法的參數(shù)空間的梯度下降路徑
如果你使用了一個(gè)較好的 learning schedule , 隨機(jī)梯度和小批量梯度也可以得到最小值。
6、優(yōu)化算法比較
| 正規(guī)方程 | Fast | No | Slow | 0 | No | LinearRegression |
| Batch GD | slow | No | Fast | 2 | Yes | N/A |
| Stochastic GD | Fast | Yes | Fast | >=2 | Yes | SGDRegressor |
| Mini-batch GD | Fast | Yes | Fast | >=2 | Yes | N/A |
二、多項(xiàng)式回歸
使用線性模型擬合非線性數(shù)據(jù)。
多項(xiàng)式回歸:對(duì)每個(gè)特征進(jìn)行加權(quán)后作為新的特征,然后訓(xùn)練一個(gè)線性模型在這個(gè)擴(kuò)展的特征集。
1、數(shù)據(jù)生成
m = 100 X = 6 * np.random.rand(m, 1) - 3 y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1) plt.plot(X, y, 'b.') plt.show()輸出結(jié)果
2、擬合
sklearn 中 PolynomialFeatures 類進(jìn)行訓(xùn)練集的轉(zhuǎn)換,讓訓(xùn)練集中的每個(gè)特偵的平方(2次多項(xiàng)式)作為新特征。
from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression## degree定義當(dāng)前階數(shù)下特征的所有組合 poly_features = PolynomialFeatures(degree=2, include_bias=False) # X_ploy 包含原始特征X并加上這個(gè)特征的平方 X^2 X_ploy = poly_features.fit_transform(X) print(X[0]) print(X_ploy[0])## 訓(xùn)練 line_reg = LinearRegression() line_reg.fit(X_ploy, y) print(line_reg.intercept_, line_reg.coef_)輸出結(jié)果
[-0.54569402] [-0.54569402 0.29778196] [2.03735568] [[0.94998295 0.51120366]]==》
模型預(yù)測(cè)函數(shù)為 y^=0.51120366x12+0.94998295x1+2.03735568\hat{y}=0.51120366x_1^2+0.94998295x_1+2.03735568y^?=0.51120366x12?+0.94998295x1?+2.03735568,
原始函數(shù)為 y=0.5x12+1.0x1+2.0y=0.5x_1^2+1.0x_1+2.0y=0.5x12?+1.0x1?+2.0 再加上一些高斯噪聲。
注意:PolynomialFeatures(degree=d) 將一個(gè)包含 nnn 個(gè)特征的數(shù)組轉(zhuǎn)換為一個(gè)包含 (n+d)!d!n!\frac{(n+d)!}{d!n!}d!n!(n+d)!? 特征的數(shù)組。
3、學(xué)習(xí)曲線
對(duì)于數(shù)據(jù)生成函數(shù)未知的數(shù)據(jù),如何決定模型的復(fù)雜度?如何檢驗(yàn)?zāi)P褪沁^擬合還是欠擬合?
- 交叉驗(yàn)證:
- 觀察學(xué)習(xí)曲線
(1)欠擬合
from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_splitdef plot_learning_curves(model, X, y):X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3)train_errors, val_errors = [], []for m in range(1, len(X_train)):model.fit(X_train[:m], y_train[:m])y_train_predict = model.predict(X_train[:m])y_val_predict = model.predict(X_val)train_errors.append(mean_squared_error(y_train_predict, y_train[:m]))val_errors.append(mean_squared_error(y_val_predict, y_val))plt.plot(np.sqrt(train_errors), "r-+", linewidth=2, label="train")plt.plot(np.sqrt(val_errors), "b-", linewidth=3, label="val")line_reg = LinearRegression() plot_learning_curves(line_reg, X, y) plt.legend() plt.show()
欠擬合:兩條曲線都達(dá)到高原地帶并趨于穩(wěn)定,且卒后兩條曲線非常接近,同時(shí)誤差值非常大。
==》更復(fù)雜的模型 或 更好的特征
(2)過擬合
相同數(shù)據(jù)上10階多項(xiàng)式模型擬合的學(xué)習(xí)曲線
from sklearn.pipeline import Pipelinepolynomial_regression = Pipeline((("poly_features", PolynomialFeatures(degree=10, include_bias=False)),("sgd_reg",LinearRegression()), )) plot_learning_curves(polynomial_regression, X, y) plt.axis([0, 70, 0, 3]) plt.legend() plt.show()
區(qū)別:
- 在訓(xùn)練集上,誤差比線性模型低很多;
- 兩條曲線之間有間隔,表示模型在訓(xùn)練集表現(xiàn)比驗(yàn)證集上好。
==》改善方法:增加訓(xùn)練數(shù)據(jù),直到訓(xùn)練誤差和驗(yàn)證誤差相等、正則化
(3)偏差和方差
一個(gè)模型的泛化誤差由三個(gè)不同誤差的和決定:偏差、方差和不可約誤差
- 偏差:由錯(cuò)誤的假設(shè)決定。一個(gè)高偏差的模型最容易出現(xiàn)欠擬合。eg:實(shí)際是一個(gè)二次模型,卻假設(shè)為一個(gè)線性模型。
- 方差:由于模型對(duì)訓(xùn)練數(shù)據(jù)的微小變化較為敏感,一個(gè)多自由度的模型容易有高方差(eg:一個(gè)高階多項(xiàng)式模型),因此會(huì)導(dǎo)致模型過擬合。
- 不可約誤差:數(shù)據(jù)本身的噪聲決定。方法:數(shù)據(jù)清洗(eg:修復(fù)數(shù)據(jù)源、修復(fù)傳感器、識(shí)別和剔除異常值)
三、正則化
限制模型的復(fù)雜度。
對(duì)于線性模型,正則化的典型實(shí)現(xiàn)就是約束模型中參數(shù)的權(quán)重。三種不同約束權(quán)重的方法:Ridge回歸、Lasso回歸和Elastic Net
1、嶺(Ridge)回歸
(1)概述
嶺回歸(也稱Tikhonov正則化):在損失函數(shù)上直接加上一個(gè)正則項(xiàng) α∑i=1nθi2\alpha\sum_{i=1}^{n}\theta_i^2α∑i=1n?θi2?。其中超參數(shù) α\alphaα 決定正則化模型的強(qiáng)度。
==》擬合數(shù)據(jù)+模型參數(shù)小
==》正則項(xiàng)僅在訓(xùn)練過程中有,在訓(xùn)練完之后,使用沒有正則化的測(cè)量方法來評(píng)價(jià)模型的表現(xiàn)。
一般情況下,訓(xùn)練過程中使用的損失函數(shù)和測(cè)試過程中使用的評(píng)價(jià)函數(shù)是不一樣的。此外,訓(xùn)練時(shí)的損失函數(shù)應(yīng)該在優(yōu)化過程中易于求導(dǎo),而在測(cè)試過程中,評(píng)價(jià)函數(shù)更應(yīng)該接近最后的客觀表現(xiàn)。eg:在分類訓(xùn)練中使用對(duì)數(shù)損失作為損失函數(shù),而使用精確率/召回率來作為它的評(píng)價(jià)函數(shù)。
(2)嶺回歸的損失函數(shù)
J(θ)=MSE(θ)+α12∑i=1nθi2J(\theta)=MSE(\theta)+\alpha\frac{1}{2}\sum_{i=1}^{n}\theta_i^2J(θ)=MSE(θ)+α21?i=1∑n?θi2?
注意,偏差 θ0\theta_0θ0? 沒有被正則化的。
定義 WWW 表示特征的權(quán)重向量(θ1\theta_1θ1?到θn\theta_nθn?),則正則化項(xiàng)可簡寫為 12(∣∣W∣∣2)2\frac{1}{2}(||W||_2)^221?(∣∣W∣∣2?)2,其中 ∣∣?∣∣2||·||_2∣∣?∣∣2? 表示權(quán)重的 l2l_2l2? 范數(shù)。
在使用嶺回歸之前,對(duì)數(shù)據(jù)進(jìn)行縮放(eg:StandardScaler)是非常重要的,算法對(duì)輸入特征的數(shù)值尺度(scale)非常敏感。大多數(shù)正則化模型都這樣。
下圖為相同線性數(shù)據(jù)上使用不同的 α\alphaα 值的嶺回歸模型最后的表現(xiàn)。其中,左圖為簡單的嶺回歸模型,右圖為10階的 PolynomialFeatures 進(jìn)行擴(kuò)展。
分析:當(dāng) α\alphaα 增大時(shí),導(dǎo)致預(yù)測(cè)曲線變得扁平(即少了極端值,多了一般值),這樣減少了模型的方差,卻增加了模型的偏差。
(3)嶺回歸的封閉方程
嶺回歸的封閉方程的解:
θ^=(XT?X+αA)?1?XT?y\hat{\theta}=(X^T·X+\alpha A)^{-1}·X^T·yθ^=(XT?X+αA)?1?XT?y
矩陣 AAA 是一個(gè)除了左上角有一個(gè) 0 的 n×nn\times nn×n 的單位矩陣,這個(gè) 0 代表偏差項(xiàng)。注意:偏差 θ0\theta_0θ0? 不被正則化的。
輸出結(jié)果
The predict is [[4.92157355]] The predict is [4.11126873]2、LASSO回歸
LASSO回歸(也稱 Least Absolute Shrinkage,或 Selection Operator Regression):其正則化項(xiàng)是權(quán)重向量的 l1l1l1 范數(shù)
(1)損失函數(shù)
J(θ)=MSE(θ)+α∑i=1n∣θi∣J(\theta)=MSE(\theta)+\alpha\sum_{i=1}^{n}{|\theta_i|}J(θ)=MSE(θ)+αi=1∑n?∣θi?∣
下圖為相同線性數(shù)據(jù)上使用不同的 α\alphaα 值的LASSO回歸模型最后的表現(xiàn)。其中,左圖為簡單的LASSO回歸模型,右圖為10階的 PolynomialFeatures 進(jìn)行擴(kuò)展。
分析:傾向于完全消除最不重要的特征的權(quán)重(置為0)
特性:自動(dòng)進(jìn)行特征選擇同時(shí)輸出一個(gè)稀疏模型。
(2)對(duì)比
其中,L1L_1L1? 范數(shù)正則化、L2L_2L2? 范數(shù)正則化都有助于降低過擬合風(fēng)險(xiǎn),L2L_2L2? 范數(shù)通過對(duì)參數(shù)向量各元素平方和求平方根,使得范數(shù)最小,從而使得參數(shù)的各個(gè)元素接近0 ,但不等于0。 而 L1L_1L1? 范數(shù)正則化比范數(shù)更易獲得“稀疏”解,即 L1L_1L1? 范數(shù)正則化求得的會(huì)有更少的非零分量,所以 L1L_1L1? 范數(shù)可用于特征選擇,而 L2L_2L2? 范數(shù)在參數(shù)規(guī)則化時(shí)經(jīng)常用到(事實(shí)上, L0L_0L0? 范數(shù)得到的“稀疏”解最多,但 L0L_0L0? 范數(shù)∣∣x∣∣=#(i∣xi≠0)||x||=\#(i|x_i\neq 0)∣∣x∣∣=#(i∣xi???=0) 是 xxx 中非零元素的個(gè)數(shù),不連續(xù),難以優(yōu)化求解。因此常用 L1L_1L1? 范數(shù)來近似代替)。
為什么 L1L_1L1? 正則化更易獲得“稀疏”解呢?
假設(shè)僅有兩個(gè)屬性,ω\omegaω 只有兩個(gè)參數(shù)ω1\omega_1ω1?, ω2\omega_2ω2?,繪制不帶正則項(xiàng)的目標(biāo)函數(shù)-平方誤差項(xiàng)等值線,再繪制 L1L_1L1?,L2L_2L2? 范數(shù)等值線,如下圖所示正則化后優(yōu)化目標(biāo)的解要在平方誤差項(xiàng)和正則化項(xiàng)之間折中,即出現(xiàn)在圖中等值線相交處采用。L1L_1L1? 范數(shù)時(shí),交點(diǎn)常出現(xiàn)在坐標(biāo)軸上,即 ω1\omega_1ω1? 或 ω2\omega_2ω2?為 0 ;而采用 L2L_2L2? 范數(shù)時(shí),交點(diǎn)常出現(xiàn)在某個(gè)象限中,即 ω1\omega_1ω1?, ω2\omega_2ω2?均非0。也就是說,L1L_1L1? 范數(shù)比 L2L_2L2? 范數(shù)更易獲得“稀疏”解。
注意:在Lasso損失函數(shù)中,批量梯度下降得路徑趨向在低谷有一個(gè)反彈。這是因?yàn)樵?ω1\omega_1ω1? 時(shí),斜率會(huì)有一個(gè)突變。為了最后收斂到全局最小值,需要降低學(xué)習(xí)率。
Lasso損失函數(shù)在 θi=0(i=1,2,...,n)\theta_i=0(i=1,2,...,n)θi?=0(i=1,2,...,n) 處無法進(jìn)行微分運(yùn)算,但是使用子梯度向量 ggg 后,它可以在任何 θi=0\theta_i=0θi?=0 的情況下進(jìn)行計(jì)算。如下式所示。
Lasso回歸子梯度向量:
g(θ,J)=?θMSE(θ)+α(sign(θ1)sign(θ2)?sign(θn))wheresign(θi)={?1,θi<00,θi=0+1,θi>0g(\theta,J)=\nabla_\theta{MSE(\theta)}+\alpha \left( \begin{matrix} sign(\theta_1)\\ sign(\theta_2) \\ {\vdots}\\ sign(\theta_n) \end{matrix} \right) where\ sign(\theta_i)= \begin{cases} -1,\ \theta_i<0\\ 0, \ \ \ \ \theta_i=0\\ +1,\ \theta_i>0\end{cases}g(θ,J)=?θ?MSE(θ)+α??????sign(θ1?)sign(θ2?)?sign(θn?)???????where?sign(θi?)=???????1,?θi?<00,????θi?=0+1,?θi?>0?
輸出結(jié)果
The predict of Lasso is [4.89631518]或可以使用 SGDRegressor(penalty="l1")
3、ElasticNet(彈性網(wǎng)絡(luò))
正則項(xiàng)是 Ridge回歸 和 Lasso回歸正則項(xiàng)的簡單混合,同時(shí)可以控制它們的混合率 rrr。當(dāng) r=0r=0r=0 時(shí),ElasticNet就是Ridge回歸,當(dāng) r=1r=1r=1 時(shí),其就是 Lasso 回歸。
(1)損失函數(shù)
J(θ)=MSE(θ)+rα∑i=1n∣θi∣+1?r2α∑i=1nθi2J(\theta)=MSE(\theta)+r\alpha\sum_{i=1}^{n}|\theta_i|+\frac{1-r}{2}\alpha\sum_{i=1}^{n}\theta_i^2J(θ)=MSE(θ)+rαi=1∑n?∣θi?∣+21?r?αi=1∑n?θi2?
(2)實(shí)現(xiàn)
l1_ratio 就是混合率 rrr
from sklearn.linear_model import ElasticNetelastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5) elastic_net.fit(X, y) predict4 = elastic_net.predict([[1.5]]) print("The predict of ElasticNet is ", predict4)結(jié)果輸出
The predict of ElasticNet is [4.895499]4、四種模型的選擇
三種模型:線性回歸、嶺回歸、Lasso回歸、彈性網(wǎng)絡(luò)。
- 避免使用簡單的線性回歸;
- 首選:嶺回歸;
- 若特征僅有少數(shù)是真正起作用的,則選擇:Lasso和彈性網(wǎng)絡(luò);==》可以將無用特征的權(quán)重降為零
- 一般來說,彈性網(wǎng)絡(luò)的表現(xiàn)要比Lasso好。
- 原因:當(dāng)特征數(shù)量比樣本的數(shù)量大的時(shí)候,或特征之間有很強(qiáng)的相關(guān)性時(shí),Lasso可能會(huì)表現(xiàn)得不規(guī)律。
5、早期停止法( Early Stopping)
(1)概述
隨著迭代次數(shù)(epoch)的增加,算法在訓(xùn)練集上的預(yù)測(cè)誤差(RMSE)逐漸下降,而對(duì)于驗(yàn)證誤差開始下降之后開始上升。這意味著模型在訓(xùn)練集上出現(xiàn)過擬合。
==》一旦驗(yàn)證錯(cuò)誤達(dá)到最小值,便提早停止訓(xùn)練。
==》“完美的免費(fèi)午餐”(Geoffrey Hinton)
注意:隨機(jī)梯度和mini-batch梯度下降不是平滑曲線,如何找到最小值。==》解決方案: 只有在驗(yàn)證誤差高于最小值一段時(shí)間后才停止,之后將模型參數(shù)回滾到驗(yàn)證誤差最小值。
(2)實(shí)現(xiàn)
注意:當(dāng) warm_start=True 時(shí),調(diào)用 fit() 方法后,訓(xùn)練會(huì)從停下來的地方繼續(xù),而不是重新開始。
from sklearn.base import clonesgd_reg = SGDRegressor(n_iter=1, warm_start=True, penalty=None,learning_rate="constant", eta0=0.0005) mininum_val_error = float("inf") best_epoch = None best_model = None for epoch in range(1000):sgd_reg.fit(X_train_ploy_scaled, y_train)y_val_predict = sgd_reg.predict(X_val_poly_scaled)val_error = mean_squared_error(y_val_predict, y_val)if val_error < mininum_val_error:mininum_val_error = val_errorbest_epoch = epochbest_model = clone(sgd_reg)四、邏輯回歸
Logistic回歸(也稱 Logit 回歸),通常用于估計(jì)一個(gè)實(shí)例屬于某個(gè)特定類別的概率,并根據(jù)sigoid函數(shù)劃分類別(二分類)。
1、概率估計(jì)
Logistic回歸模型計(jì)算輸入特征的加權(quán)和(加上偏差項(xiàng)),之后將中間結(jié)果輸入 logistic() 函數(shù)進(jìn)行二次加工后輸出。
邏輯回歸模型的概率估計(jì)(向量形式)
p^=hθ(x)=σ(θT?x)\hat{p}=h_\theta(x)=\sigma(\theta^T·x)p^?=hθ?(x)=σ(θT?x)
其中,σ()\sigma()σ() 表示 logistic 函數(shù)(也稱 logit 函數(shù))
σ(t)=11+e?t\sigma(t)=\frac{1}{1+e^{-t}}σ(t)=1+e?t1?
一旦 logistic 回歸模型估計(jì)得到了 XXX 屬于正類的概率 p^=hθ(x)\hat{p}=h_\theta(x)p^?=hθ?(x),則很容易得到預(yù)測(cè)結(jié)果 y^\hat{y}y^?。
邏輯回歸預(yù)測(cè)模型
y^={0,p^<0.51,p^≥0.5\hat{y}=\begin{cases} 0, \ \ \ \ \hat{p}<0.5\\ 1,\ \ \ \ \hat{p}\geq0.5\end{cases}y^?={0,????p^?<0.51,????p^?≥0.5?
2、訓(xùn)練和損失函數(shù)
注:該部分以手寫筆記為主
邏輯回歸的損失函數(shù)(對(duì)數(shù)損失)
J(θ)=?1m∑i=1m[y(i)log(hθ(xi))+(1?y(i))log(1?hθ(xi))]J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log(h_\theta(x_i))+(1-y^{(i)})log(1-h_\theta(x_i))]J(θ)=?m1?i=1∑m?[y(i)log(hθ?(xi?))+(1?y(i))log(1?hθ?(xi?))]
損失函數(shù)關(guān)于第 jjj 個(gè)模型參數(shù) θj\theta_jθj? 的偏導(dǎo)數(shù)
??θjJ(θj)=1m∑i=1m(σ(θT?X(i))?y(i))xj(i)\frac{\partial}{\partial\theta_j}J(\theta_j)=\frac{1}{m}\sum_{i=1}^{m}(\sigma(\theta^T·X^{(i)})-y^{(i)})x_j^{(i)}?θj???J(θj?)=m1?i=1∑m?(σ(θT?X(i))?y(i))xj(i)?
3、決策邊界
對(duì)鳶尾花數(shù)據(jù)進(jìn)行 logistic 回歸。
鳶尾花數(shù)據(jù):150朵三種不同的鳶尾花的萼片和花瓣的長度和寬度,類別為Setosa、Versicolor、Virginica
目標(biāo):建立一個(gè)分類器,僅使用花瓣的寬度特征識(shí)別Virginica。
from sklearn import datasets from sklearn.linear_model import LogisticRegression## 建立僅使用花瓣的寬度特征來識(shí)別 iris = datasets.load_iris() print(list(iris.keys())) X = iris["data"][:, 3:] ## 只讀最后一個(gè)特征 y = (iris["target"] == 2).astype(np.int) # 取出判斷是否為第3類的label## 訓(xùn)練 log_reg = LogisticRegression() log_reg.fit(X, y)# 花瓣寬度從 0 到 3 厘米的概率估計(jì) X_new = np.linspace(0, 3, 1000).reshape(-1, 1) y_proba = log_reg.predict_proba(X_new) plt.plot(X_new, y_proba[:, 1], "g-", label="Iris-Virginica") plt.plot(X_new, y_proba[:, 0], "b--", label="Not Iris-Virginica") plt.axis([0, 3, 0, 1]) plt.legend() plt.show()五、Softmax回歸
Logistic回歸擴(kuò)展到多分類==》Softmax回歸
1、原理
思路:給定實(shí)例 xxx 時(shí),Softmax回歸模型先計(jì)算 kkk 類的分?jǐn)?shù) sk(x)s_k(x)sk?(x),然后將分?jǐn)?shù)應(yīng)用到 Softmax函數(shù),估計(jì)出每類的概率。將估計(jì)概率最高(它只是得分最高的類)的類別作為預(yù)測(cè)結(jié)果。
softmax函數(shù):估計(jì)樣本屬于第 kkk 類的概率 p^k=σ(s(x))k=exp(sk(x))∑j=1Kexp(sj(x))\hat{p}_k=\sigma(s(x))_k=\frac{exp(s_k(x))}{\sum_{j=1}^{K}exp(s_j(x))}p^?k?=σ(s(x))k?=∑j=1K?exp(sj?(x))exp(sk?(x))?
其中:
sk(x)=θkT?xs_k(x)=\theta_k^T·xsk?(x)=θkT??x
其中,KKK 表示類別的個(gè)數(shù);需要注意的是 θkθ_kθk? 說明每個(gè)類別對(duì)應(yīng)有自己的 θθθ,所有 θkθ_kθk? 組合起來是全部的參數(shù)。s(x)s(x)s(x) 表示包含樣本 xxx 每一類得分的向量;σ(s(x))k\sigma(s(x))_kσ(s(x))k?表示給定每一類分?jǐn)?shù)之后,實(shí)例 xxx 屬于第 kkk 類的概率。
注意:softmax回歸分類器一次只能預(yù)測(cè)一個(gè)類(智能用于互斥的類別,不能用于多標(biāo)簽)
2、訓(xùn)練
目標(biāo):建立一個(gè)模型在目標(biāo)類別上有較高的概率。
==》損失函數(shù):交叉熵(衡量待測(cè)類別與目標(biāo)類別的匹配程度)
J(θ)=?1m∑i=1m∑k=1Kyk(i)log(p^k(i))J(\theta)=-\frac{1}{m}\sum_{i=1}^m\sum_{k=1}^Ky_k^{(i)}log(\hat{p}_k^{(i)})J(θ)=?m1?i=1∑m?k=1∑K?yk(i)?log(p^?k(i)?)
若對(duì)于第 iii 個(gè)實(shí)例的目標(biāo)類是 kkk,那么 yk(i)=1y_k^{(i)}=1yk(i)?=1, 反之 yk(i)=0y_k^{(i)}=0yk(i)?=0。
計(jì)算每一類的梯度向量,然后采用梯度下降(或其他優(yōu)化算法)找到使損失函數(shù)達(dá)到最小值的參數(shù)矩陣 θ\thetaθ。
kkk 類交叉熵關(guān)于 θk\theta_kθk? 的梯度向量:
?θkJ(θ)=1m∑i=1m(p^k(i)?yk(i))x(i)\nabla_{\theta_k}J(\theta)=\frac{1}{m}\sum_{i=1}^{m}(\hat{p}_k^{(i)}-y_k^{(i)})x^{(i)}?θk??J(θ)=m1?i=1∑m?(p^?k(i)??yk(i)?)x(i)
輸出結(jié)果
The predict is [2] The predict_proba is [[6.33134077e-07 5.75276067e-02 9.42471760e-01]]回答 94.2% 是 Virginica 花( 第二類) , 或者 5.8% 是其他鳶尾花。
總結(jié)
以上是生活随笔為你收集整理的用Scikit-learn和TensorFlow进行机器学习(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode】233. 数字1的个
- 下一篇: 用Scikit-learn和Tensor