彈性網絡介于 Ridge 回歸和 Lasso 回歸之間。它的正則項是 Ridge 回歸和 Lasso 回歸正則項的簡單混合,同時你可以控制它們的混合率 $r$,當 $r=0$ 時,彈性網絡就是 Ridge 回歸,當 $r=1$ 時,其就是 Lasso 回歸。具體表示如公式 4-12。
公式 4-12:彈性網絡損失函數
$$ J( heta)=MSE( heta)+ralphasumlimits_{i=1}^nleft| heta_i ight|+frac{1-r}{2}alphasumlimits_{i=1}^n heta_i^2 $$
那么我們該如何選擇線性回歸,嶺回歸,Lasso 回歸,彈性網絡呢?一般來說有一點正則項的表現更好,因此通常你應該避免使用簡單的線性回歸。嶺回歸是一個很好的首選項,但是如果你的特征僅有少數是真正有用的,你應該選擇 Lasso 和彈性網絡。就像我們討論的那樣,它兩能夠將無用特征的權重降為零。一般來說,彈性網絡的表現要比 Lasso 好,因為當特征數量比樣本的數量大的時候,或者特征之間有很強的相關性時,Lasso 可能會表現的不規律。下面是一個使用 Scikit-Learn ElasticNet(l1_ratio指的就是混合率 $r$)的簡單樣本:
>>> from sklearn.linear_model import ElasticNet >>> elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5) >>> elastic_net.fit(X, y) >>> elastic_net.predict([[1.5]]) array([ 1.54333232])
早期停止法(Early Stopping)
對于迭代學習算法,有一種非常特殊的正則化方法,就像梯度下降在驗證錯誤達到最小值時立即停止訓練那樣。我們稱為早期停止法。圖 4-20 表示使用批量梯度下降來訓練一個非常復雜的模型(一個高階多項式回歸模型)。隨著訓練的進行,算法一直學習,它在訓練集上的預測誤差(RMSE)自然而然的下降。然而一段時間后,驗證誤差停止下降,并開始上升。這意味著模型在訓練集上開始出現過擬合。一旦驗證錯誤達到最小值,便提早停止訓練。這種簡單有效的正則化方法被 Geoffrey Hinton 稱為“完美的免費午餐”
圖 4-20:早期停止法
提示
隨機梯度和小批量梯度下降不是平滑曲線,你可能很難知道它是否達到最小值。 一種解決方案是,只有在驗證誤差高于最小值一段時間后(你確信該模型不會變得更好了),才停止,之后將模型參數回滾到驗證誤差最小值。
下面是一個早期停止法的基礎應用:
from sklearn.base import clone sgd_reg = SGDRegressor(n_iter=1, warm_start=True, penalty=None,learning_rate="constant", eta0=0.0005) minimum_val_error = float("inf") best_epoch = None best_model = None for epoch in range(1000): sgd_reg.fit(X_train_poly_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 < minimum_val_error: ? ? ? ?minimum_val_error = val_error ? ? ? ?best_epoch = epoch ? ? ? ?best_model = clone(sgd_reg)
注意:當warm_start=True時,調用fit()方法后,訓練會從停下來的地方繼續,而不是從頭重新開始。
邏輯回歸
正如我們在第1章中討論的那樣,一些回歸算法也可以用于分類(反之亦然)。 Logistic 回歸(也稱為 Logit 回歸)通常用于估計一個實例屬于某個特定類別的概率(例如,這電子郵件是垃圾郵件的概率是多少?)。 如果估計的概率大于 50%,那么模型預測這個實例屬于當前類(稱為正類,標記為“1”),反之預測它不屬于當前類(即它屬于負類 ,標記為“0”)。 這樣便成為了一個二元分類器。
概率估計
那么它是怎樣工作的? 就像線性回歸模型一樣,Logistic 回歸模型計算輸入特征的加權和(加上偏差項),但它不像線性回歸模型那樣直接輸出結果,而是把結果輸入logistic()函數進行二次加工后進行輸出(詳見公式 4-13)。
公式 4-13:邏輯回歸模型的概率估計(向量形式)
$$ hat{p}=h_ heta(mathbf{x})=sigma( heta^T cdot mathbf{x}) $$
Logistic 函數(也稱為 logit),用 $sigma()$ 表示,其是一個 sigmoid 函數(圖像呈 S 型),它的輸出是一個介于 0 和 1 之間的數字。其定義如公式 4-14 和圖 4-21 所示。
公式 4-14:邏輯函數
$$ sigma(t)=frac{1}{1+exp(-t)} $$
圖4-21:邏輯函數
一旦 Logistic 回歸模型估計得到了 $mathbf{x}$ 屬于正類的概率 $hat{p}=h_ heta(mathbf{x})$,那它很容易得到預測結果 $hat{y}$(見公式 4-15)。
公式 4-15:邏輯回歸預測模型
$$ hat{y}= egin{cases} 0, &hat{p}<0.5 1,&hat{p}geq0.5 end{cases} $$
注意當 $t<0$ 時 $sigma(t)<0.5$,當 $tgeq0$時$sigma(t)geq0.5$,因此當$ heta^T ?cdot mathbf{x}$ 是正數的話,邏輯回歸模型輸出 1,如果它是負數的話,則輸出 0。
訓練和損失函數
好,現在你知道了 Logistic 回歸模型如何估計概率并進行預測。 但是它是如何訓練的? 訓練的目的是設置參數向量 $ heta$,使得正例($y=1$)概率增大,負例($y=0$)的概率減小,其通過在單個訓練實例 $mathbf{x}$ 的損失函數來實現(公式 4-16)。
公式 4-16:單個樣本的損失函數
$$ c( heta)= egin{cases} -log(hat{p}), &y=1 -log(1-hat{p}),&y=0 end{cases} $$
這個損失函數是合理的,因為當 $t$ 接近 0 時,$-log(t)$ 變得非常大,所以如果模型估計一個正例概率接近于 0,那么損失函數將會很大,同時如果模型估計一個負例的概率接近 1,那么損失函數同樣會很大。 另一方面,當 $t$ 接近于 1 時,$-log(t)$ 接近 0,所以如果模型估計一個正例概率接近于 0,那么損失函數接近于 0,同時如果模型估計一個負例的概率接近 0,那么損失函數同樣會接近于 0, 這正是我們想的。
整個訓練集的損失函數只是所有訓練實例的平均值。可以用一個表達式(你可以很容易證明)來統一表示,稱為對數損失,如公式 4-17 所示。
公式 4-17:邏輯回歸的損失函數(對數損失)
$$ J( heta)=-frac{1}{m}sumlimits_{i=1}^mleft[y^{(i)}logleft(hat{p}^{(i)} ight)+left(1-y^{(i)} ight)logleft(1-hat{p}^{(i)} ight) ight] $$
但是這個損失函數對于求解最小化損失函數的 $ heta$ 是沒有公式解的(沒有等價的正態方程)。 但好消息是,這個損失函數是凸的,所以梯度下降(或任何其他優化算法)一定能夠找到全局最小值(如果學習速率不是太大,并且你等待足夠長的時間)。公式 4-18 給出了損失函數關于第 $j$ 個模型參數 $ heta_j$ 的偏導數。
公式 4-18:邏輯回歸損失函數的偏導數
$$ frac{partial}{partial heta_j}J( heta_j)=frac{1}{m} sumlimits_{i=1}^m{left(sigmaleft( heta^T cdot mathbf{x}^{(i)} ight)-y^{(i)} ight)}{x_j}^{(i)} $$
這個公式看起來非常像公式 4-5:首先計算每個樣本的預測誤差,然后誤差項乘以第 $j$ 項特征值,最后求出所有訓練樣本的平均值。 一旦你有了包含所有的偏導數的梯度向量,你便可以在梯度向量上使用批量梯度下降算法。 也就是說:你已經知道如何訓練 Logistic 回歸模型。 對于隨機梯度下降,你當然只需要每一次使用一個實例,對于小批量梯度下降,你將每一次使用一個小型實例集。
決策邊界
我們使用鳶尾花數據集來分析 Logistic 回歸。 這是一個著名的數據集,其中包含 150 朵三種不同的鳶尾花的萼片和花瓣的長度和寬度。這三種鳶尾花為:Setosa,Versicolor,Virginica(如圖 4-22)。
圖4-22:三種不同的鳶尾花
讓我們嘗試建立一個分類器,僅僅使用花瓣的寬度特征來識別 Virginica,首先讓我們加載數據:
>>> from sklearn import datasets >>> iris = datasets.load_iris() >>> list(iris.keys()) ['data', 'target_names', 'feature_names', 'target', 'DESCR'] >>> X = iris["data"][:, 3:] # petal width >>> y = (iris["target"] == 2).astype(np.int)
接下來,我們訓練一個邏輯回歸模型:
from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression() log_reg.fit(X, y)
我們來看看模型估計的花瓣寬度從 0 到 3 厘米的概率估計(如圖 4-23):
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"
圖 4-23:概率估計和決策邊界
Virginica 花的花瓣寬度(用三角形表示)在 1.4 厘米到 2.5 厘米之間,而其他種類的花(由正方形表示)通常具有較小的花瓣寬度,范圍從 0.1 厘米到 1.8 厘米。注意,它們之間會有一些重疊。在大約 2 厘米以上時,分類器非常肯定這朵花是Virginica花(分類器此時輸出一個非常高的概率值),而在1厘米以下時,它非常肯定這朵花不是 Virginica 花(不是 Virginica 花有非常高的概率)。在這兩個極端之間,分類器是不確定的。但是,如果你使用它進行預測(使用predict()方法而不是predict_proba()方法),它將返回一個最可能的結果。因此,在 1.6 厘米左右存在一個決策邊界,這時兩類情況出現的概率都等于 50%:如果花瓣寬度大于 1.6 厘米,則分類器將預測該花是 Virginica,否則預測它不是(即使它有可能錯了):
>>> log_reg.predict([[1.7], [1.5]]) array([1, 0])
圖 4-24 表示相同的數據集,但是這次使用了兩個特征進行判斷:花瓣的寬度和長度。 一旦訓練完畢,Logistic 回歸分類器就可以根據這兩個特征來估計一朵花是 Virginica 的可能性。 虛線表示這時兩類情況出現的概率都等于 50%:這是模型的決策邊界。 請注意,它是一個線性邊界。每條平行線都代表一個分類標準下的兩兩個不同類的概率,從 15%(左下角)到 90%(右上角)。越過右上角分界線的點都有超過 90% 的概率是 Virginica 花。
圖 4-24:線性決策邊界
就像其他線性模型,邏輯回歸模型也可以 $ell_1$ 或者 $ell_2$ 懲罰使用進行正則化。Scikit-Learn 默認添加了 $ell_2$ 懲罰。
注意
在 Scikit-Learn 的LogisticRegression模型中控制正則化強度的超參數不是 $alpha$(與其他線性模型一樣),而是它的逆:$C$。 $C$ 的值越大,模型正則化強度越低。
Softmax 回歸
Logistic 回歸模型可以直接推廣到支持多類別分類,不必組合和訓練多個二分類器(如第 3 章所述), 其稱為 Softmax 回歸或多類別 Logistic 回歸。
這個想法很簡單:當給定一個實例 $mathbf{x}$ 時,Softmax 回歸模型首先計算 $k$ 類的分數 $s_k(mathbf{x})$,然后將分數應用在Softmax函數(也稱為歸一化指數)上,估計出每類的概率。 計算 $s_k(mathbf{x})$ 的公式看起來很熟悉,因為它就像線性回歸預測的公式一樣(見公式 4-19)。
公式 4-19:k類的 Softmax 得分
$$ s_k(mathbf{x})= heta^T cdot mathbf{x} $$
注意,每個類都有自己獨一無二的參數向量 $ heta_k$。 所有這些向量通常作為行放在參數矩陣 $Theta$ 中。
一旦你計算了樣本 $mathbf{x}$ 的每一類的得分,你便可以通過Softmax函數(公式 4-20)估計出樣本屬于第 $k$ 類的概率 $hat{p}_k$:通過計算 $e$ 的 $s_k(mathbf{x})$ 次方,然后對它們進行歸一化(除以所有分子的總和)。
公式 4-20:Softmax 函數
$$ hat{p_k}=sigma{(mathbf{s}(mathbf{x}))}k= frac{expleft(s_k(mathbf{x}) ight)} {sum_{j=1}^{K}expleft(s_j(mathbf{x}) ight)} $$
$K$ 表示有多少類
$mathbf{s}(mathbf{x})$ 表示包含樣本 $mathbf{x}$ 每一類得分的向量
$sigma{(mathbf{s}(mathbf{x}))_k}$ 表示給定每一類分數之后,實例 $mathbf{x}$ 屬于第 $k$ 類的概率
和 Logistic 回歸分類器一樣,Softmax 回歸分類器將估計概率最高(它只是得分最高的類)的那類作為預測結果,如公式 4-21 所示。
公式 4-21:Softmax 回歸模型分類器預測結果
$$ hat{y}=argmax sigma{(mathbf{s}(mathbf{x}))_k}=argmax s_k(mathbf{x})=argmax left( heta_k^T cdot mathbf{x} ight) $$
argmax運算返回一個函數取到最大值的變量值。 在這個等式,它返回使 $sigma{(mathbf{s}(mathbf{x}))_k}$ 最大時的 $k$ 的值
注意
Softmax 回歸分類器一次只能預測一個類(即它是多類的,但不是多輸出的),因此它只能用于判斷互斥的類別,如不同類型的植物。 你不能用它來識別一張照片中的多個人。
現在我們知道這個模型如何估計概率并進行預測,接下來將介紹如何訓練。我們的目標是建立一個模型在目標類別上有著較高的概率(因此其他類別的概率較低),最小化公式 4-22 可以達到這個目標,其表示了當前模型的損失函數,稱為交叉熵,當模型對目標類得出了一個較低的概率,其會懲罰這個模型。 交叉熵通常用于衡量待測類別與目標類別的匹配程度(我們將在后面的章節中多次使用它)
公式 4-22:交叉熵
$$ J(Theta)=-frac{1}{m}sumlimits_{i=1}^msumlimits_{k=1}^Ky_k^{(i)}logleft(hat{p}_k^{(i)} ight) $$
如果對于第 $i$ 個實例的目標類是 $k$,那么 $y_k^{(i)}=1$,反之 $y_k^{(i)}=0$。
可以看出,當只有兩個類($K=2$)時,此損失函數等同于 Logistic 回歸的損失函數(對數損失;請參閱公式 4-17)。
交叉熵
交叉熵源于信息論。假設你想要高效地傳輸每天的天氣信息。如果有八個選項(晴天,雨天等),則可以使用3位對每個選項進行編碼,因為 $2^3=8$。但是,如果你認為幾乎每天都是晴天,更高效的編碼“晴天”的方式是:只用一位(0)。剩下的七項使用四位(從 1 開始)。交叉熵度量每個選項實際發送的平均比特數。 如果你對天氣的假設是完美的,交叉熵就等于天氣本身的熵(即其內部的不確定性)。 但是,如果你的假設是錯誤的(例如,如果經常下雨)交叉熵將會更大,稱為 Kullback-Leibler 散度(KL 散度)。
兩個概率分布 $p$ 和 $q$ 之間的交叉熵定義為:$H(p,q)=-sum_xp(x)log q(x)$(分布至少是離散的)
這個損失函數關于 $ heta_k$ 的梯度向量為公式 4-23:
公式 4-23:k類交叉熵的梯度向量
$$ abla_{ heta_k}J(Theta)=frac{1}{m}sumlimits_{i=1}^mleft(hat{p}_k^{(i)}-y_k^{(i)} ight)mathbf{x}^{(i)} $$
現在你可以計算每一類的梯度向量,然后使用梯度下降(或者其他的優化算法)找到使得損失函數達到最小值的參數矩陣 $Theta$。
讓我們使用 Softmax 回歸對三種鳶尾花進行分類。當你使用LogisticRregression對模型進行訓練時,Scikit Learn 默認使用的是一對多模型,但是你可以設置multi_class參數為“multinomial”來把它改變為 Softmax 回歸。你還必須指定一個支持 Softmax 回歸的求解器,例如“lbfgs”求解器(有關更多詳細信息,請參閱 Scikit-Learn 的文檔)。其默認使用 $ell_12$ 正則化,你可以使用超參數 $C$ 控制它。
X = iris["data"][:, (2, 3)] # petal length, petal width y = iris["target"] softmax_reg = LogisticRegression(multi_class="multinomial",solver="lbfgs", C=10) softmax_reg.fit(X, y)
所以下次你發現一個花瓣長為 5 厘米,寬為 2 厘米的鳶尾花時,你可以問你的模型你它是哪一類鳶尾花,它會回答 94.2% 是 Virginica 花(第二類),或者 5.8% 是其他鳶尾花。
>>> softmax_reg.predict([[5, 2]]) array([2]) >>> softmax_reg.predict_proba([[5, 2]]) array([[ 6.33134078e-07, 5.75276067e-02, 9.42471760e-01]])
圖 4-25:Softmax 回歸的決策邊界
圖 4-25 用不同背景色表示了結果的決策邊界。注意,任何兩個類之間的決策邊界是線性的。 該圖的曲線表示 Versicolor 類的概率(例如,用 0.450 標記的曲線表示 45% 的概率邊界)。注意模型也可以預測一個概率低于 50% 的類。 例如,在所有決策邊界相遇的地方,所有類的估計概率相等,分別為 33%。
練習
如果你有一個數百萬特征的訓練集,你應該選擇哪種線性回歸訓練算法?
假設你訓練集中特征的數值尺度(scale)有著非常大的差異,哪種算法會受到影響?有多大的影響?對于這些影響你可以做什么?
訓練 Logistic 回歸模型時,梯度下降是否會陷入局部最低點?
在有足夠的訓練時間下,是否所有的梯度下降都會得到相同的模型參數?
假設你使用批量梯度下降法,畫出每一代的驗證誤差。當你發現驗證誤差一直增大,接下來會發生什么?你怎么解決這個問題?
當驗證誤差升高時,立即停止小批量梯度下降是否是一個好主意?
哪個梯度下降算法(在我們討論的那些算法中)可以最快到達解的附近?哪個的確實會收斂?怎么使其他算法也收斂?
假設你使用多項式回歸,畫出學習曲線,在圖上發現學習誤差和驗證誤差之間有著很大的間隙。這表示發生了什么?有哪三種方法可以解決這個問題?
假設你使用嶺回歸,并發現訓練誤差和驗證誤差都很高,并且幾乎相等。你的模型表現是高偏差還是高方差?這時你應該增大正則化參數 $alpha$,還是降低它?
你為什么要這樣做:
使用嶺回歸代替線性回歸?
Lasso 回歸代替嶺回歸?
彈性網絡代替 Lasso 回歸?
假設你想判斷一副圖片是室內還是室外,白天還是晚上。你應該選擇二個邏輯回歸分類器,還是一個 Softmax 分類器?
在 Softmax 回歸上應用批量梯度下降的早期停止法(不使用 Scikit-Learn)。
-
函數
+關注
關注
3文章
4307瀏覽量
62432 -
機器學習
+關注
關注
66文章
8378瀏覽量
132411
原文標題:【翻譯】Sklearn 與 TensorFlow 機器學習實用指南 —— 第4章( 下) 訓練模型
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論