梯度下降、過擬合和歸一化

Eternally_陪伴發表於2018-09-08

好的課程應該分享給更多人:人工智慧視訊列表-尚學堂,點開任意一個之後會發現他們會提供系列課程整合到一起的百度網盤下載地址,包括視訊+程式碼+資料,免費的優質資源。當然,現在共享非常多,各種mooc、部落格、論壇等,很容易就可以找到各種各樣的知識,能走到哪一步,都在我們自己。希望我能夠一直堅持下去,加油!

參考書籍:《機器學習》-周志華,中文書,各種概念都講解的很清晰,贊。點這裡下載,在百度網盤上,密碼是:8tmk

參見官方文件:scikit-learn官網http://scikit-learn.org/stable/supervised_learning.html#supervised-learning

看這個吧,簡書上的:深入淺出–梯度下降法及其實現

批量梯度下降

  · 初始化W,即隨機W,給初值

  · 沿著負梯度方向迭代,更新後的W使得損失函式J(w)更小

  · 如果W維度是幾百維度,直接算SVD也是可以的,幾百維度以上一般是梯度下降演算法

# 批量梯度下降
import numpy as np

# 自己建立建資料,哈哈
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]

learning_rate = 0.1     # 學習率,步長=學習率x梯度
n_iterations = 1000     # 迭代次數,一般不設定閾值,只設定超引數,迭代次數
m = 100     # m個樣本

theta = np.random.randn(2, 1)   # 初始化引數theta,w0,...,wn
count = 0   # 計數

for iteration in range(n_iterations):
    count += 1
    # 求梯度,每次迭代使用m個樣本求梯度
    gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)
    # 迭代更新theta值
    theta = theta - learning_rate * gradients
    # print(count, theta)
    
print(count, theta)

隨機梯度下降

  · 優先選擇隨機梯度下降

  · 有些時候隨機梯度下降可以跳出區域性最小# 隨機梯度下降

import numpy as np

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]

n_epochs = 500 
t0, t1 = 5, 50
m = 100

def learning_schedule(t):
    return t0/(t + t1)

# 隨機初始化引數值
theta = np.random.randn(2, 1)

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) learning_rate = learning_schedule(epoch*m + i) theta = theta - learning_rate * gradients print(theta)

歸一化

預處理

這個CSDN的部落格挺好的:機器學習常見歸一化方法及實現,我覺得還是看書效果最好了。

基於梯度下降法求最優解時,都要歸一化,why,為什麼?

資料的歸一化/標準化/規範化,顧名思義,就是有量綱資料集經過某種變換後,變成無量綱的資料,比如變到[0,1],應該是這樣便於處理吧,使各個維度梯度儘量同時收斂。

過擬合、擬合與欠擬合

過擬合:模型很好的擬合了訓練集資料,但預測的準確率反而降低了,擬合過度,泛化能力弱。

欠擬合:與過擬合相反,模型尚未能很好的擬合訓練資料集,擬合不足。

擬合:模型適當擬合訓練集且預測準確率較高,泛化能力強。

主要做的是防止過擬合:

  · 通過正則化修改損失函式,考慮懲罰項的影響,如L1、L2正則化

    L1 = n個維度的w的絕對值和

    L2 = n個維度的w的平方和

    即,loss_function = loss_function + α(L1 or L2),使用懲罰項,模型泛化能力提高,可能影響訓練資料集正確率,在懲罰項裡面,會有個alpha,即懲罰項的權重,我們可以通過調整alpha超引數,根據需求來決定是更看重模型的正確率還是模型的泛化能力!

難受的,程式碼:

損失函式 + L2正則項:

# 嶺迴歸/脊迴歸,隨機梯度下降,crtl+B檢視函式文件以調整引數…
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor

# 模擬真實資料集
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# # 方法一:脊/嶺迴歸,損失函式=最小二乘+L2正則項
# # alpha=1,懲罰項權重-Regularization strength;
# ridge_reg = Ridge(alpha=1, solver=`auto`)
# ridge_reg.fit(X, y)    # 模型
# print(ridge_reg.predict(2))    # 預測x=2時,y=?
# print("w0 =", ridge_reg.intercept_)    # 列印w0或者說bias
# print("w1 =", ridge_reg.coef_)     # 列印weights

# 方法二:隨機梯度下降
# # penalty=`l2`,使用L2正則化,迭代n_iter=100次
sgd_reg = SGDRegressor(penalty=`l1`, n_iter=100)
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(2))
print("w0 =", sgd_reg.intercept_)
print("w1 =", sgd_reg.coef_)

 損失函式 + L1正則項:

# 套索迴歸,隨機梯度下降回歸函式
import numpy as np
from sklearn.linear_model import Lasso, SGDRegressor

# 模擬真實資料集
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# One:lasso regression,損失函式=最小二乘項? + L1正則項
lasso_reg = Lasso(alpha=0.15, max_iter=1000)
lasso_reg.fit(X, y)
print(lasso_reg.predict(2))
print(lasso_reg.intercept_, lasso_reg.coef_)

# # Two:sgd regression
# sgd_reg = SGDRegressor(penalty=`l1`, n_iter=1000)
# sgd_reg.fit(X, y)
# print(sgd_reg.predict(2))
# print(sgd_reg.intercept_, sgd_reg.coef_)

 

 

相關文章