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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

用Scikit-learn和TensorFlow进行机器学习(四)

發(fā)布時(shí)間:2025/3/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Scikit-learn和TensorFlow进行机器学习(四) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 訓(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=1m?(θ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) 的值。

import numpy as np import matplotlib.pyplot as plt# 生成數(shù)據(jù) X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1)## 參數(shù)求解:inv() 計(jì)算矩陣的逆,dot() 計(jì)算矩陣的乘法 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) print(theta_best)## 利用theta_best預(yù)測(cè) X_new = np.array([[0], [2]]) X_new_b = np.c_[np.ones((2, 1)), X_new] y_predict = X_new_b.dot(theta_best) print(y_predict)## 繪制圖像 plt.plot(X_new, y_predict,"r--",label="Predict") plt.plot(X, y, "b.", label="Train") plt.axis([0, 2, 0, 15]) plt.show()

輸出結(jié)果

[[4.1001622 ][2.89052294]] [[4.1001622 ][9.88120808]]

等價(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=1m?(θ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η 和梯度向量的乘積決定了每一次更新的步長。

eta = 0.1 # learning rate n_iterations = 60000 # 迭代次數(shù) m = 100 # 樣本個(gè)數(shù)theta = np.random.randn(2, 1) ## 隨機(jī)初始值 for iteration in range(n_iterations):gradients = 2 / m * X_b.T.dot(X_b.dot(theta) - y)theta = theta - eta * gradientsprint(theta)

輸出結(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

n_epochs = 50 t0, t1 = 5, 50def learning_schedule(t):return t0 / (t + t1) theta = np.random.randn(2, 1) # 每一輪迭代:一代,epoch for epoch in range(n_epochs): for i in range(m):random_index = np.random.randint(m)xi = X_b[random_index : random_index + 1]yi = y[random_index : random_index + 1]gradients = 2 * xi.T.dot(xi.dot(theta) - yi)eta = learning_schedule(epoch * m + 1)theta = theta - eta * gradients print(theta)

輸出結(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)化算法比較

算法樣本個(gè)數(shù)mOut-of-core support特征個(gè)數(shù) n超參數(shù)個(gè)數(shù)scalingsklearn庫
正規(guī)方程FastNoSlow0NoLinearRegression
Batch GDslowNoFast2YesN/A
Stochastic GDFastYesFast>=2YesSGDRegressor
Mini-batch GDFastYesFast>=2YesN/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=1n?θ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?(W2?)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? 不被正則化的。

from sklearn.linear_model import Ridge## 封閉方程求解——cholesky法:進(jìn)行矩陣分解 ridge_reg = Ridge(alpha=1, solver="cholesky") ridge_reg.fit(X, y) predict1 = ridge_reg.predict([[1.5]]) print("The predict is ", predict1)## 梯度下降法求解 # penalty參數(shù):正則項(xiàng)的懲罰類型 sgd_reg = SGDRegressor(penalty="l2") sgd_reg.fit(X, y.ravel()) predict2 = sgd_reg.predict([[1.5]]) print("The predict is ", predict2)

輸出結(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=1n?θ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=#(ixi???=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&lt;00,θi=0+1,θi&gt;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&lt;0\\ 0, \ \ \ \ \theta_i=0\\ +1,\ \theta_i&gt;0\end{cases}g(θ,J)=?θ?MSE(θ)+α??????sign(θ1?)sign(θ2?)?sign(θn?)???????where?sign(θi?)=???????1,?θi?<00,????θi?=0+1,?θi?>0?

from sklearn.linear_model import Lassolasso_reg = Lasso(alpha=0.1) lasso_reg.fit(X, y) predict3 = lasso_reg.predict([[1.5]]) print("The predict of Lasso is ", predict3)

輸出結(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=1n?θi?+21?r?αi=1n?θ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^&lt;0.51,p^≥0.5\hat{y}=\begin{cases} 0, \ \ \ \ \hat{p}&lt;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=1m?[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=1m?(σ(θ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=1m?k=1K?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=1m?(p^?k(i)??yk(i)?)x(i)

from sklearn.linear_model import LogisticRegression X = iris["data"][:,(2, 3)] # petal length, petal width y = iris["target"]# multinomial設(shè)置為softmax回歸,lbfgs求解器 softmax_reg = LogisticRegression(multi_class="multinomial", solver="lbfgs", C=10) softmax_reg.fit(X, y) predict = softmax_reg.predict([[5, 2]]) predict_proba = softmax_reg.predict_proba([[5, 2]]) print("The predict is ", predict) print("The predict_proba is ", predict_proba)

輸出結(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)容,希望文章能夠幫你解決所遇到的問題。

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