【机器学习基础】数学推导+纯Python实现机器学习算法14:Ridge岭回归
Python機器學習算法實現
Author:louwill
? ? ?
? ? ?上一節我們講到預防過擬合方法的Lasso回歸模型,也就是基于L1正則化的線性回歸。本講我們繼續來看基于L2正則化的線性回歸模型。
L2正則化
???? 相較于L0和L1,其實L2才是正則化中的天選之子。在各種防止過擬合和正則化處理過程中,L2正則化可謂第一候選。L2范數是指矩陣中各元素的平方和后的求根結果。采用L2范數進行正則化的原理在于最小化參數矩陣的每個元素,使其無限接近于0但又不像L1那樣等于0,也許你又會問了,為什么參數矩陣中每個元素變得很小就能防止過擬合?這里我們就拿深度神經網絡來舉例說明吧。在L2正則化中,如何正則化系數變得比較大,參數矩陣W中的每個元素都在變小,線性計算的和Z也會變小,激活函數在此時相對呈線性狀態,這樣就大大簡化了深度神經網絡的復雜性,因而可以防止過擬合。
?????加入L2正則化的線性回歸損失函數如下所示。其中第一項為MSE損失,第二項就是L2正則化項。
? ? ? L2正則化相比于L1正則化在計算梯度時更加簡單。直接對損失函數關于w求導即可。這種基于L2正則化的回歸模型便是著名的嶺回歸(Ridge Regression)。
Ridge
???? 有了上一講的代碼框架,我們直接在原基礎上對損失函數和梯度計算公式進行修改即可。下面來看具體代碼。
導入相關模塊:
讀入示例數據并劃分:
data = pd.read_csv('./abalone.csv') data['Sex'] = data['Sex'].map({'M':0, 'F':1, 'I':2}) X = data.drop(['Rings'], axis=1) y = data[['Rings']] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25) X_train, X_test, y_train, y_test = X_train.values, X_test.values, y_train.values, y_test.values print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)模型參數初始化:
# 定義參數初始化函數 def initialize(dims):w = np.zeros((dims, 1))b = 0return w, b定義L2損失函數和梯度計算:
# 定義ridge損失函數 def l2_loss(X, y, w, b, alpha):num_train = X.shape[0]num_feature = X.shape[1]y_hat = np.dot(X, w) + bloss = np.sum((y_hat-y)**2)/num_train + alpha*(np.sum(np.square(w)))dw = np.dot(X.T, (y_hat-y)) /num_train + 2*alpha*wdb = np.sum((y_hat-y)) /num_trainreturn y_hat, loss, dw, db定義Ridge訓練過程:
# 定義訓練過程 def ridge_train(X, y, learning_rate=0.001, epochs=5000):loss_list = []w, b = initialize(X.shape[1])for i in range(1, epochs):y_hat, loss, dw, db = l2_loss(X, y, w, b, 0.1)w += -learning_rate * dwb += -learning_rate * dbloss_list.append(loss)if i % 100 == 0:print('epoch %d loss %f' % (i, loss))params = {'w': w,'b': b}grads = {'dw': dw,'db': db}return loss, loss_list, params, grads執行示例訓練:
# 執行訓練示例 loss, loss_list, params, grads = ridge_train(X_train, y_train, 0.01, 1000)模型參數:
定義模型預測函數:
測試集數據和模型預測數據的繪圖展示:
# 簡單繪圖 import matplotlib.pyplot as plt f = X_test.dot(params['w']) + params['b']plt.scatter(range(X_test.shape[0]), y_test) plt.plot(f, color = 'darkorange') plt.xlabel('X') plt.ylabel('y') plt.show();???? 可以看到模型預測對于高低值的擬合較差,但能擬合大多數值。這樣的模型相對具備較強的泛化能力,不會產生嚴重的過擬合問題。
最后進行簡單的封裝:
import numpy as np import pandas as pd from sklearn.model_selection import train_test_splitclass Ridge():def __init__(self):passdef prepare_data(self):data = pd.read_csv('./abalone.csv')data['Sex'] = data['Sex'].map({'M': 0, 'F': 1, 'I': 2})X = data.drop(['Rings'], axis=1)y = data[['Rings']]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)X_train, X_test, y_train, y_test = X_train.values, X_test.values, y_train.values, y_test.valuesreturn X_train, y_train, X_test, y_testdef initialize(self, dims):w = np.zeros((dims, 1))b = 0return w, bdef l2_loss(self, X, y, w, b, alpha):num_train = X.shape[0]num_feature = X.shape[1]y_hat = np.dot(X, w) + bloss = np.sum((y_hat - y) ** 2) / num_train + alpha * (np.sum(np.square(w)))dw = np.dot(X.T, (y_hat - y)) / num_train + 2 * alpha * wdb = np.sum((y_hat - y)) / num_trainreturn y_hat, loss, dw, dbdef ridge_train(self, X, y, learning_rate=0.01, epochs=1000):loss_list = []w, b = self.initialize(X.shape[1])for i in range(1, epochs):y_hat, loss, dw, db = self.l2_loss(X, y, w, b, 0.1)w += -learning_rate * dwb += -learning_rate * dbloss_list.append(loss)if i % 100 == 0:print('epoch %d loss %f' % (i, loss))params = {'w': w,'b': b}grads = {'dw': dw,'db': db}return loss, loss_list, params, gradsdef predict(self, X, params):w = params['w']b = params['b']y_pred = np.dot(X, w) + breturn y_predif __name__ == '__main__':ridge = Ridge()X_train, y_train, X_test, y_test = ridge.prepare_data()loss, loss_list, params, grads = ridge.ridge_train(X_train, y_train, 0.01, 1000)print(params)sklearn中也提供了Ridge的實現方式:
???? 以上就是本節內容,下一節我們將延伸樹模型,重點關注集成學習和GBDT系列。
更多內容可參考筆者GitHub地址:
https://github.com/luwill/machine-learning-code-writing
代碼整體較為粗糙,還望各位不吝賜教。
參考資料:
Ridge Regression: Biased Estimation for Nonorthogonal Problems
往期精彩:
數學推導+純Python實現機器學習算法13:Lasso回歸
數學推導+純Python實現機器學習算法12:貝葉斯網絡
數學推導+純Python實現機器學習算法11:樸素貝葉斯
數學推導+純Python實現機器學習算法10:線性不可分支持向量機
數學推導+純Python實現機器學習算法8-9:線性可分支持向量機和線性支持向量機
數學推導+純Python實現機器學習算法7:神經網絡
數學推導+純Python實現機器學習算法6:感知機
數學推導+純Python實現機器學習算法5:決策樹之CART算法
數學推導+純Python實現機器學習算法4:決策樹之ID3算法
數學推導+純Python實現機器學習算法3:k近鄰
數學推導+純Python實現機器學習算法2:邏輯回歸
數學推導+純Python實現機器學習算法1:線性回歸
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請掃碼進群:總結
以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法14:Ridge岭回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达家免费NLP课程上线啦!
- 下一篇: 【机器学习基础】数学推导+纯Python