[Hands On ML] 4. 训练模型
文章目錄
- 1. 線性回歸
- 1.1 正規(guī)方程求解
- 1.2 時間復(fù)雜度
- 1.3 梯度下降
- 1.4 批量梯度下降
- 1.5 隨機(jī)梯度下降
- 1.6 小批量梯度下降
- 2. 多項式回歸
- 3. 線性模型正則化
- 4. 早期停止法(Early Stopping)
本文為《機(jī)器學(xué)習(xí)實戰(zhàn):基于Scikit-Learn和TensorFlow》的讀書筆記。
中文翻譯參考
1. 線性回歸
如何得到模型的參數(shù)
1.1 正規(guī)方程求解
- 先生成帶噪聲的線性數(shù)據(jù)
- 采用矩陣解方程,得到參數(shù)
- 預(yù)測新的數(shù)據(jù)
- 畫出模型回歸線
- 使用sklearn求解
1.2 時間復(fù)雜度
求解過程需要矩陣求逆,矩陣求逆時間復(fù)雜度在 O(n2.4)O(n^{2.4})O(n2.4) 到 O(n3)O(n^3)O(n3) 之間,n 為特征數(shù)
- 特征個數(shù)很多的時候,這種計算方法將會非常慢
1.3 梯度下降
整體思路:通過的迭代來逐漸調(diào)整參數(shù)使得損失函數(shù)達(dá)到最小值
由上圖右側(cè)可見,一開始的方向跟梯度方向幾乎垂直,走了彎路。
當(dāng)我們使用梯度下降的時候,應(yīng)該確保所有的特征有著相近的尺度范圍
(例如:使用 Scikit Learn 的 StandardScaler類),否則它將需要很長的時間才能夠收斂。
- 參數(shù)越多,找到最佳參數(shù)的難度也越大
1.4 批量梯度下降
- 會使用全部的訓(xùn)練數(shù)據(jù)
- 在大數(shù)據(jù)集上會變得很慢
- 不同的學(xué)習(xí)率下,學(xué)習(xí)情況對比
求解過程動圖請參看博文:matplotlib 繪制梯度下降求解過程
- 實際使用時,設(shè)置較大的迭代次數(shù),和容差,當(dāng)梯度向量變得非常小的時候,小于容差時,認(rèn)為收斂,結(jié)束迭代
1.5 隨機(jī)梯度下降
每一步梯度計算只隨機(jī)選取訓(xùn)練集中的一個樣本。這使得算法變得非常快。
- 隨機(jī)梯度算法可以在大規(guī)模訓(xùn)練集上使用
- 由于隨機(jī)性,它到達(dá)最小值不是平緩下降,損失函數(shù)會忽高忽低,大體呈下降趨勢
- 迭代點不會停止在一個值上,會一直在這個值附近擺動,最后的參數(shù)還不錯,但不是最優(yōu)值
由于其隨機(jī)性,它能跳過局部最優(yōu)解,但同時它卻不能達(dá)到最小值。
解決辦法:逐漸降低學(xué)習(xí)率
- 開始時,走大步,快速前進(jìn)+跳過局部最優(yōu)解
- 然后逐步降低學(xué)習(xí)率,使算法到達(dá)全局最小值。 這個過程被稱為模擬退火,因為它類似于熔融金屬慢慢冷卻的冶金學(xué)退火過程
決定每次迭代的學(xué)習(xí)率的函數(shù)稱為 learning schedule
- 如果學(xué)習(xí)速度降得過快,可能陷入局部最小值,或者迭代次數(shù)到了半路就停止了
- 如果學(xué)習(xí)速度降得太慢,可能在最小值附近震蕩,如果過早停止訓(xùn)練,只得到次優(yōu)解
1.6 小批量梯度下降
每次迭代的時候,使用一個隨機(jī)的小型實例集
2. 多項式回歸
依然可以使用線性模型來擬合非線性數(shù)據(jù)
- 一個簡單的方法:對每個特征進(jìn)行加權(quán)后作為新的特征
- 然后訓(xùn)練一個線性模型基于這個擴(kuò)展的特征集。 這種方法稱為多項式回歸。
- 對原始特征進(jìn)行2階多項式轉(zhuǎn)換后,多出了 X2 項
- 進(jìn)行線性回歸
- 繪出預(yù)測線
注意,階數(shù)變大時,特征的維度會急劇上升,不僅有 ana^nan,還有 an?1b,an?2b2a^{n-1}b,a^{n-2}b^2an?1b,an?2b2等
如何確定選擇多少階:
1、交叉驗證
- 在訓(xùn)練集上表現(xiàn)良好,但泛化能力很差,過擬合
- 如果這兩方面都不好,欠擬合。可知模型是太復(fù)雜還是太簡單
2、觀察學(xué)習(xí)曲線
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.2)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")lin_reg = LinearRegression() plot_learning_curves(lin_reg, X, y)- 上圖顯示訓(xùn)練集和測試集在數(shù)據(jù)不斷增加的情況下,曲線趨于穩(wěn)定,同時誤差都非常大,欠擬合
- 欠擬合,添加樣本是沒用的,需要更復(fù)雜的模型或更好的特征
模型的泛化誤差由三個不同誤差的和決定:
- 偏差:模型假設(shè)不貼合,高偏差的模型最容易出現(xiàn)欠擬合
- 方差:模型對訓(xùn)練數(shù)據(jù)的微小變化較為敏感,多自由度的模型更容易有高的方差(如高階多項式),會導(dǎo)致過擬合
- 不可約誤差:數(shù)據(jù)噪聲,可進(jìn)行數(shù)據(jù)清洗
3. 線性模型正則化
限制模型的自由度,降低過擬合
- 嶺(Ridge)回歸 L2正則
- Lasso 回歸 L1正則
- 彈性網(wǎng)絡(luò)(ElasticNet),以上兩者的混合,r=0, 就是L2,r=1,就是 L1
J(θ)=MSE(θ)+rα∑i=1n∣θi∣+1?r2α∑i=1nθi2J(\theta)=M S E(\theta)+r \alpha \sum_{i=1}^{n}\left|\theta_{i}\right|+\frac{1-r}{2} \alpha \sum_{i=1}^{n} \theta_{i}^{2}J(θ)=MSE(θ)+rαi=1∑n?∣θi?∣+21?r?αi=1∑n?θi2?
4. 早期停止法(Early Stopping)
驗證集 誤差達(dá)到最小值,并開始上升時(出現(xiàn)過擬合),結(jié)束迭代,回滾到之前的最小值處
總結(jié)
以上是生活随笔為你收集整理的[Hands On ML] 4. 训练模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [编程启蒙游戏] 1. 猜数字
- 下一篇: LeetCode 旋转数组 系列