日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Hands On ML] 4. 训练模型

發(fā)布時間:2024/7/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Hands On ML] 4. 训练模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 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ù)
import numpy as np import matplotlib.pyplot as plt X = 2*np.random.rand(100,1) y = 4+3*X+np.random.randn(100,1) plt.plot(X,y,"b.") plt.axis([0,2,0,15])

  • 采用矩陣解方程,得到參數(shù)
X_b = np.c_[np.ones((100,1)),X] theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) theta_best array([[4.46927218],[2.71589368]])
  • 預(yù)測新的數(shù)據(jù)
X_new = np.array([[0],[2]]) X_new_b = np.c_[np.ones((2,1)),X_new] y_pred = X_new_b.dot(theta_best) y_pred array([[4.46927218],[9.90105954]])
  • 畫出模型回歸線
plt.plot(X_new,y_pred,"r-") plt.plot(X,y,"b.") plt.axis([0,2,0,15]) plt.show()

  • 使用sklearn求解
from sklearn.linear_model import LinearRegression lin_reg = LinearRegression() lin_reg.fit(X,y) lin_reg.intercept_, lin_reg.coef_ # (array([4.15725481]), array([[2.97840411]])) lin_reg.predict(X_new) array([[ 4.15725481],[10.11406304]])

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ù)集上會變得很慢
eta = 0.1 # 學(xué)習(xí)率 n_iter = 1000 m = 100 theta = np.random.randn(2,1)for iter in range(n_iter):gradients = 2/m*X_b.T.dot(X_b.dot(theta)-y)theta = theta - eta*gradients theta array([[4.33118102],[2.8597418 ]])
  • 不同的學(xué)習(xí)率下,學(xué)習(xí)情況對比
eta = 0.1 # 學(xué)習(xí)率 n_iter = 1000 m = 100 theta = np.random.randn(2,1)plt.figure(figsize=(8,6)) plt.ion()# 打開交互模式 plt.axis([0,2,0,15]) plt.rcParams["font.sans-serif"] = "SimHei"for iter in range(n_iter):plt.cla() # 清除原圖像gradients = 2/m*X_b.T.dot(X_b.dot(theta)-y)theta = theta - eta*gradientsX_new = np.array([[0],[2]])X_new_b = np.c_[np.ones((2,1)),X_new]y_pred = X_new_b.dot(theta)plt.plot(X,y,"b.")plt.plot(X_new,y_pred,"r-")plt.title("學(xué)習(xí)率:{:.2f}".format(eta))plt.pause(0.1) # 暫停一會display.clear_output(wait=True)# 刷新圖像 plt.ioff()# 關(guān)閉交互模式 plt.show() theta

求解過程動圖請參看博文: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)解
from sklearn.linear_model import SGDRegressor # help(SGDRegressor) sgd_reg = SGDRegressor(max_iter=100, penalty=None, eta0=0.1) sgd_reg.fit(X,y.ravel()) sgd_reg.intercept_, sgd_reg.coef_ (array([3.71001759]), array([2.99883799]))

1.6 小批量梯度下降

每次迭代的時候,使用一個隨機(jī)的小型實例集

2. 多項式回歸

依然可以使用線性模型來擬合非線性數(shù)據(jù)

  • 一個簡單的方法:對每個特征進(jìn)行加權(quán)后作為新的特征
  • 然后訓(xùn)練一個線性模型基于這個擴(kuò)展的特征集。 這種方法稱為多項式回歸。
m = 100 X = 6*np.random.rand(m,1)-3 y = 0.5*X**2 + X + 2 + np.random.randn(m,1) plt.rcParams["axes.unicode_minus"] = False # 顯示負(fù)號 plt.plot(X, y, "g.")

from sklearn.preprocessing import PolynomialFeatures pf = PolynomialFeatures(degree=2, include_bias=False) # help(PolynomialFeatures) X_ploy = pf.fit_transform(X) print(X[0]) print(X_ploy[0])
  • 對原始特征進(jìn)行2階多項式轉(zhuǎn)換后,多出了 X2
[2.43507761] [2.43507761 5.92960298]
  • 進(jìn)行線性回歸
lin_reg = LinearRegression() lin_reg.fit(X_ploy, y) lin_reg.intercept_, lin_reg.coef_ (array([1.95147614]), array([[1.0462516 , 0.48003845]]))
  • 繪出預(yù)測線
plt.plot(X, y, "g.") x = np.linspace(-3.5, 3.5, 500) print(x.shape) y_pred = lin_reg.intercept_ + lin_reg.coef_[0][0]*x + lin_reg.coef_[0][1]*x**2 plt.plot(x, y_pred, 'r-')


注意,階數(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=1n?θi?+21?r?αi=1n?θi2?
from sklearn.linear_model import Ridge ridge_reg = Ridge(alpha=1, solver="cholesky") ridge_reg.fit(X, y) ridge_reg.predict([[1.5]]) # array([[5.04581676]])from sklearn.linear_model import Lasso lasso_reg = Lasso(alpha=0.1) lasso_reg.fit(X, y) lasso_reg.predict([[1.5]]) # array([5.00189893])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([4.99822842])

4. 早期停止法(Early Stopping)


驗證集 誤差達(dá)到最小值,并開始上升時(出現(xiàn)過擬合),結(jié)束迭代,回滾到之前的最小值處

總結(jié)

以上是生活随笔為你收集整理的[Hands On ML] 4. 训练模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。