点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

上一节我们讲到预防过拟合方法的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

有了上一讲的代码框架,我们直接在原基础上对损失函数和梯度计算公式进行修改即可。下面来看具体代码。

导入相关模块:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

读入示例数据并划分:

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)

模型参数:

定义模型预测函数:

# 定义预测函数
def predict(X, params):w=
params
[
'w'
]b = params['b']y_pred = np.dot(X, w) + breturn y_predy_pred = predict(X_test, params)
y_pred[:5]

测试集数据和模型预测数据的绘图展示:

# 简单绘图
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的实现方式:

# 导入线性模型模块
from sklearn.linear_model import Ridge
# 创建Ridge模型实例
clf = Ridge(alpha=1.0)
# 对训练集进行拟合
clf.fit(X_train, y_train)
# 打印模型相关系数
print("sklearn Ridge intercept :", clf.intercept_)
print("\nsklearn Ridge coefficients :\n", clf.coef_)

以上就是本节内容,下一节我们将延伸树模型,重点关注集成学习和GBDT系列。

更多内容可参考笔者GitHub地址:

https://github.com/luwill/machine-learning-code-writing

代码整体较为粗糙,还望各位不吝赐教。

好消息!

小白学视觉知识星球

开始面向外开放啦

数学推导+纯Python实现机器学习算法14:Ridge岭回归相关推荐

  1. 【机器学习基础】数学推导+纯Python实现机器学习算法14:Ridge岭回归

    Python机器学习算法实现 Author:louwill 上一节我们讲到预防过拟合方法的Lasso回归模型,也就是基于L1正则化的线性回归.本讲我们继续来看基于L2正则化的线性回归模型. L2正则化 ...

  2. 【机器学习基础】数学推导+纯Python实现机器学习算法13:Lasso回归

    Python机器学习算法实现 Author:louwill 第13讲和第14讲我们来关注一下回归模型的两个变种模型.本节我们要介绍的是基于L1正则化的Lasso模型,下一节介绍基于L2正则化的Ridg ...

  3. 【机器学习基础】数学推导+纯Python实现机器学习算法2:逻辑回归

    自本系列第一讲推出以来,得到了不少同学的反响和赞成,也有同学留言说最好能把数学推导部分写的详细点,笔者只能说尽力,因为打公式实在是太浪费时间了..本节要和大家一起学习的是逻辑(logistic)回归模 ...

  4. python 怎么算l2范数_数学推导+纯Python实现机器学习算法13:Lasso回归

    版权说明:本公号转载文章旨在学习交流,不用于任何商业用途,版权归原作者所有,如有异议,敬请后台联络我们,议定合作或删除,我们将第一时间按版权法规定妥善处理,非常感谢! Python机器学习算法实现 A ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法30:系列总结与感悟

    Python机器学习算法实现 Author:louwill Machine Learning Lab 终于到了最后的总结.从第一篇线性回归的文章开始到现在,已经接近有两年的时间了.当然,也不是纯写这3 ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法24:HMM隐马尔可夫模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab HMM(Hidden Markov Model)也就是隐马尔可夫模型,是一种由隐藏的马尔可夫链随机 ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法28:CRF条件随机场

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文我们来看一下条件随机场(Conditional Random Field,CRF)模型.作为概 ...

  8. 【机器学习基础】数学推导+纯Python实现机器学习算法27:EM算法

    Python机器学习算法实现 Author:louwill Machine Learning Lab 从本篇开始,整个机器学习系列还剩下最后三篇涉及导概率模型的文章,分别是EM算法.CRF条件随机场和 ...

  9. 【机器学习基础】数学推导+纯Python实现机器学习算法26:随机森林

    Python机器学习算法实现 Author:louwill Machine Learning Lab 自从第14篇文章结束,所有的单模型基本就讲完了.而后我们进入了集成学习的系列,整整花了5篇文章的篇 ...

最新文章

  1. windows10上使用一个tomcat部署2个项目
  2. python分类流程_文本分类指南:你真的要错过 Python 吗?
  3. 【区块链基础知识系列】 第8课 区块链之零知识证明
  4. 怎么像编辑提供wb原图_PLoS One:7月1日起,投稿必须提供原始WB图片!
  5. sap权限激活_sap角色权限设置手册V1.0
  6. 什么?船开上高架了!
  7. 【排序】剑指offer:数组中重复的数字
  8. 计算机丢失disrupt,disrupt造句
  9. linux嵌入式面试300问,经典嵌入式Linux面试题3问
  10. Linux下载安装NodeJS
  11. cmd net命令详解与图片示意
  12. AE的QuickTime问题
  13. 谷歌浏览器 Chrome 安装 Tampermonkey 油猴插件的方法
  14. 在word或wps中使用宏代码自动生成手写体
  15. ifconfig结果详解
  16. PhysX之旅(初章)--PhysXは虾米?
  17. 80后的风口,80公里的感悟
  18. Excel查找函数(VLOOKUP\SEARCH\FIND\MATCH)
  19. NNDL 实验三 线性模型
  20. Geant 4中Run、Event、Step等数据提取(初学笔记)

热门文章

  1. 将两个ISO文件挂载至同一个虚拟光驱
  2. 从虚拟光驱启动计算机,手把手教你使用win10/win8自带的”虚拟光驱“(资源管理器)挂载打开ISO镜像文件-系统操作与应用 -亦是美网络...
  3. 一、MicroApp快速入门示例
  4. ug许可服务器文件名什么呢,ug许可证是什么文件 是什么格式 什么名字?
  5. 如何应对面试官问你职业规划问题
  6. 排序算法-python
  7. java计算机毕业设计教师教学质量评估系统MyBatis+系统+LW文档+源码+调试部署
  8. WIN10键盘无法使用,什么按键都不管用
  9. 算法设计与分析第三章作业
  10. 骄傲! 咱中国人的区块链技术闯进了国际学术顶会!