【机器学习04】岭回归

article/2025/9/13 1:23:31

4 岭回归

4.1 简介

普通线性回归模型使用基于梯度下降的最小二乘法,在最小化损失函数的前提下,寻找最优模型参数,在此过程中,包括少数异常样本在内的全部训练数据都会对最终模型参数造成程度相等的影响,异常值对模型所带来影响无法在训练过程中被识别出来

岭回归(Ridge回归):在模型迭代过程所依据的代价函数中增加了正则惩罚项(L2范数正则化),以限制模型参数对异常样本的匹配程度,进而提高模型面对多数正常样本的拟合精度,解决过拟合问题

正则化:

  1. 目的:防止过拟合
  2. 本质:约束(限制)要优化的模型参数

代价函数

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∥ θ ∥ 2 2 = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \left\|\theta\right\|_2^2=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum\limits_{j=1}^n\theta_j^{2} J(θ)=2m1i=1m(hθ(x(i))y(i))2+λθ22=2m1i=1m(hθ(x(i))y(i))2+λj=1nθj2

说明:λ>0

  1. L2范数:向量中的各个元素平方之和的开平方,即 ∥ θ ∥ 2 = ∑ j = 1 n θ j 2 {\left\| \theta \right\|_2} = \sqrt {\sum\limits_{j = 1}^n {\theta _j^2} } θ2=j=1nθj2
  2. 正则强度λ(惩罚因子)越大,曲线的拟合度越低,忽略异常样本(噪音)的效果越好

4.2 梯度下降法(GD)

岭回归代价函数之梯度求解

α J ( θ ) α θ j = α α θ j ( 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ) \frac{\alpha J(\theta)}{\alpha \theta_j}=\frac{\alpha}{\alpha \theta_j}(\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum\limits_{j=1}^n\theta_j^{2}) αθjαJ(θ)=αθjα(2m1i=1m(hθ(x(i))y(i))2+λj=1nθj2)

= 1 m ∑ i = 1 m [ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] + λ α α θ j ( θ 1 2 + θ 2 2 + . . . + θ j 2 + . . . + θ n 2 ) =\frac{1}{m}{\sum\limits_{i=1}^m[(h_\theta(x^{(i)})-y^{(i)})}x_j^{(i)}]+\lambda\frac{\alpha}{\alpha \theta_j}(\theta_1^{2}+\theta_2^{2}+...+\theta_j^{2}+...+\theta_n^{2}) =m1i=1m[(hθ(x(i))y(i))xj(i)]+λαθjα(θ12+θ22+...+θj2+...+θn2)

= 1 m ∑ i = 1 m [ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] + 2 λ θ j =\frac{1}{m}{\sum\limits_{i=1}^m[(h_\theta(x^{(i)})-y^{(i)})}x_j^{(i)}]+2\lambda\theta_j =m1i=1m[(hθ(x(i))y(i))xj(i)]+2λθj

梯度下降迭代公式——>更新模型参数θj

θ j = θ j − α α J ( θ ) α θ j = θ j − α ( 1 m ∑ i = 1 m [ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] + 2 λ θ j ) \theta_j=\theta_j-\alpha\frac{\alpha J(\theta)}{\alpha \theta_j}=\theta_j-\alpha(\frac{1}{m}{\sum\limits_{i=1}^m[(h_\theta(x^{(i)})-y^{(i)})}x_j^{(i)}]+2\lambda\theta_j) θj=θjααθjαJ(θ)=θjα(m1i=1m[(hθ(x(i))y(i))xj(i)]+2λθj)

其中, h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n = ∑ i = 0 n θ i x i = θ T x , x 0 ( i ) = 1 h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n=\sum\limits_{i = 0}^n{{\theta_i}{x_i}}={\theta^T}x,x_0^{(i)}=1 hθ(x)=θ0+θ1x1+θ2x2+...+θnxn=i=0nθixi=θTxx0(i)=1

4.3 Sklearn之岭回归

岭回归相关API:

# sklearn库
import sklearn.linear_model as lm# 创建模型
model=lm.Ridge(正则强度,fit_intercept=是否训练截距,max_iter=最大迭代次数,normalize=是否特征归一化)
# 训练模型
# 输入:一个二维数组表示的样本矩阵
# 输出:每个样本最终的结果
model.fit(输入,输出)
# 预测输出
# 输入array是一个二维数组,每一行是一个样本,每一列是一个特征
result=model.predict(array)

案例:加载abnormal.txt文件中的数据,基于岭回归算法训练回归模型

import numpy as np
import matplotlib.pyplot as plt
# sklearn库
import sklearn.linear_model as lm
import sklearn.metrics as sm# 加载数据:读文本
def loaddata():# x,y=np.loadtxt("data/abnormal.txt",delimiter=",",unpack=True)data=np.loadtxt("data/abnormal.txt",delimiter=",")cols=data.shape[1]    # data.shape[1]:列数x=data[:,0:cols-1] y=data[:,-1].reshape(-1,1)          # data[:,-1]:获取所有行的最后一列return x,yx,y=loaddata()# 绘制散点图
plt.figure(figsize=(10,6))
plt.title("Linear Regression & Ridge Regression",fontsize=18)
plt.grid(linestyle=":")
# s:散点大小
plt.scatter(x,y,s=70,color="dodgerblue",label="Sample Points")
plt.xlabel("x")
plt.ylabel("y")## 线性回归
model1=lm.LinearRegression()
model1.fit(x,y)
lr_pred_y=model1.predict(x)
plt.plot(x,lr_pred_y,color="orangered",label="LR")
# MAE(平均绝对值误差):1/mΣ|实际输出-预测输出|
print("MAE(平均绝对值误差):",sm.mean_absolute_error(y,lr_pred_y))
# MSE(均方误差):1/mΣ(实际输出-预测输出)^2
print("MSE(均方误差):",sm.mean_squared_error(y,lr_pred_y))
# RMSE(均方根误差):SQRT(1/mΣ(实际输出-预测输出)^2)
print("RMSE(均方根误差):",np.sqrt(sm.mean_squared_error(y,lr_pred_y)))
# R2_score(R方值):(0,1]区间的分值,即分数越高,误差越小
print("R2_score(R方值):",sm.r2_score(y,lr_pred_y))## 岭回归
model2=lm.Ridge(0.3,fit_intercept=True,max_iter=1000,normalize=True)  # 模型构建
model2.fit(x,y)  # 模型训练 
print("\n")
print("系数:",model2.coef_)
print("截距:",model2.intercept_)
ridge_pred_y=model2.predict(x)
plt.plot(x,ridge_pred_y,color="green",label="Ridge")
print("\n")
# MAE(平均绝对值误差):1/mΣ|实际输出-预测输出|
print("MAE(平均绝对值误差):",sm.mean_absolute_error(y,ridge_pred_y))
# MSE(均方误差):1/mΣ(实际输出-预测输出)^2
print("MSE(均方误差):",sm.mean_squared_error(y,ridge_pred_y))
# RMSE(均方根误差):SQRT(1/mΣ(实际输出-预测输出)^2)
print("RMSE(均方根误差):",np.sqrt(sm.mean_squared_error(y,ridge_pred_y)))
# R2_score(R方值):(0,1]区间的分值,即分数越高,误差越小
print("R2_score(R方值):",sm.r2_score(y,ridge_pred_y))plt.legend()
plt.show()

image-20220424112914261

4.4 数据集划分与交叉验证

  1. 数据集划分

    • Training set(训练集): 训练模型

    • Validation set(验证集): 调整参数来选择模型,避免过拟合

    • Testing set(测试集): 评估模型

  2. 交叉验证(cross validation)

img

在机器学习模型中,需要人工选择的参数称为超参数

GridSearchCV(模型调参利器):包含GridSearch和CV,即网格搜索和交叉验证

GridSearch:一种调参手段,即穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。这种方法的主要缺点是比较耗时!

所以网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时,网格搜索的计算复杂度会呈现指数增长,这时候则使用随机搜索),用户列出一个较小的超参数值域,这些超参数值域的笛卡尔积(排列组合)为一组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的超参数组合

GridSearchCV的常用参数含义:模型调参利器(网格搜索与交叉验证)GridSearchCV参数详解

  • estimator:选择使用的模型名
  • param_grid: 需要最优化的参数取值,值为字典或者列表
  • scoring:模型评价指标
  • cv=k:k折交叉验证(训练集分成k份,其中1份为验证集),默认为3

4.5 Sklearn之模型保存与加载

模型训练是一个耗时的过程,一个优秀的机器学习模型是非常宝贵的

可以将模型保存到磁盘中,也可以在需要使用的时候从磁盘中重新加载模型即可,不需要重新训练,与训练好的模型具有相同的参数

模型保存与加载相关API:

# sklearn库
from sklearn.externals import joblibjoblib.dump(模型对象,磁盘文件)     # 保存模型
model=joblib.load(磁盘文件)       # 加载模型

案例:将训练好的模型保存到磁盘中

# sklearn库
from sklearn.externals import joblib# 模型保存(将训练好的模型对象保存到磁盘文件中)
joblib.dump(model,"model/house_train_model.pkl")# 模型加载(从磁盘文件中加载模型对象,与训练好的模型具有相同的参数)
model=joblib.load("model/house_train_model.pkl")# 模型预测测试集数据输出
model.predict(X_test)

4.6 案例:波士顿房价预测

import numpy as np
import matplotlib.pyplot as plt
# sklearn库
from sklearn import linear_model
from sklearn.datasets import load_boston# 获取数据
# 方式1:
# 加载sklearn库中自带的波士顿房价数据集
boston = load_boston()# 查看数据集以及结构描述
print(boston.DESCR)
print(boston)X = boston.data   # 取特征值X
y = boston.target # 取标签y# 方式2:
import pandas as pd
df = pd.read_excel('data/boston.xls')
print(df)# 取特征值X
X = df[df.columns[0:-1]]  # 切片:左闭右开,即第0列至倒数第2列数据
# 取标签y
y = df[df.columns[-1]]    # 切片:最后一列数据# 创建模型(定义岭回归)
model = linear_model.Ridge(alpha=0.1)
# 训练模型
model.fit(X,y)
# 模型预测
y_hat = model.predict(X)# ---------------------- 训练模型(使用交叉验证选择合适的参数)------------------------
from sklearn.model_selection import train_test_split# 划分训练集(70%)和测试集(30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)# GridSearchCV(模型调参利器):包含GridSearch和CV,即网格搜索和交叉验证
from sklearn.model_selection import GridSearchCV
# 创建模型(定义岭回归)
ridge_model = linear_model.Ridge()
# 参数字典(多次设置尝试)
param_test={'alpha':[0.01,0.03,0.05,0.07,0.1,0.5,0.8,1],'normalize':[True,False]}
# 定义模型调参(estimator:选择使用的模型名,param_grid:参数字典或列表,scoring:模型评价指标,cv=k:k折交叉验证)
gsearch = GridSearchCV(estimator=ridge_model, param_grid = param_test, scoring='neg_mean_squared_error', cv=5)
# 训练模型
gsearch.fit(X_train,y_train)# 查看网格搜索和交叉验证的最好参数组合以及最好得分
print(gsearch.best_params_)
print(gsearch.best_score_)# ---------------------------- 模型评估---------------------------
from sklearn.metrics import mean_squared_error# 使用最好参数组合来创建模型(定义岭回归)
ridge_model = linear_model.Ridge(alpha=0.3,normalize=True)
# 训练模型
ridge_model.fit(X_train,y_train)
# 模型预测
# 训练集
y_train_pred = ridge_model.predict(X_train)
print('Train MSE=',mean_squared_error(y_train,y_train_pred))
# 测试集
y_test_pred = ridge_model.predict(X_test)
print('Test MSE=',mean_squared_error(y_test,y_test_pred))#---------------------------- 模型部署使用 ------------------------
from sklearn.externals import joblib# 模型保存
joblib.dump(ridge_model, "house_train_model.pkl")# 模型加载
clf = joblib.load("house_train_model.pkl")
clf.predict(X_test)

http://chatgpt.dhexx.cn/article/SQC9K8Ob.shtml

相关文章

机器学习——岭回归

岭回归的简单介绍 什么是岭回归?什么时候要用到岭回归?岭回归是一种解决标准方程法不能求逆矩阵时的办法。我们都知道,用标准方程法最大的一个缺点就是当数据的特征多于数据的样本时,标准方程法是不能使用的,因为不能…

数学建模学习:岭回归和lasso回归

线性回归 在多元线性回归模型中,估计回归系数使用的是OLS,并在最后讨论异方差和多重共线性对模型的影响。事实上,回归中自变量的选择大有门道,变量过多可能会导致多重共线性问题导致回归系数不显著,甚至造成OLS估计失…

python机器学习| 岭回归介绍及实现

岭回归介绍及实现 1 岭回归的引入2 岭回归的原理2.1 原理介绍2.2 原理代码实现 3 API 实现 1 岭回归的引入 在线性回归-正规方程和梯度下降中,我们介绍了基于正规方程或者梯度下降的优化算法,来寻找最优解。 在正规方程解中,它是基于直接求导…

岭回归与lasso回归算法

模型压缩与正则化主要包含岭回归(Ridge regression)和Lasso两种方法,二者的主要原理是将系数往等于0的方向压缩。 岭回归 lasso 全称:Least absolute shrinkage and selection operator最小绝对缩减和选择算子 一、岭回归示…

岭回归-回归实操

python 岭回归算法之回归实操 基本概念 正则化 正则化是指对模型做显式约束,以避免过拟合。本文用到的岭回归就是L2正则化。(从数学的观点来看,岭回归惩罚了系数的L2范数或w的欧式长度) 正则化的具体原理就不在这里多叙述了&a…

线性回归与岭回归

目录 一、什么是线性回归 1.线性回归简述 2.数组和矩阵 3.线性回归的算法 二、权重的求解 1.正规方程 2.梯度下降 三、线性回归案例 1.案例概述 2.数据获取 3.数据分割 4.数据标准化 5.模型训练 6.回归性能评估 7.梯度下降与正规方程区别 四、岭回归Ridge 1.过拟…

什么是岭回归?

问题引出: 当使用最小二乘法解决一下线性回归: 假设:已知x1,x2与y的关系服从线性回归模型: y102x13x2c 当x1和x2存在线性相关性时,使用最小二乘法来预测回归模型,就变得困难起来,因此物品们必须使用逐步回…

岭回归总结

岭回归存在的目的: 解决多重共线性下,最小二乘估计失效的问题 岭回归的作用:(在引入变量太多,又存在多重共线性,难以抉择去留哪个变量时可以通过该方法筛选变量) 1.找出多重共线性的变量,并提剔除部分 2…

岭回归(ridge regression)

岭回归(ridge regression) 在处理回归问题时,常遇到的问题 在处理复杂的数据的回归问题时,普通的线性回归会遇到一些问题,主要表现在:   预测精度:这里要处理好这样一对为题,即样…

【回归分析】一文读懂岭回归,附案例教学

1、作用 岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强…

人工智能——岭回归(Python)

目录 1 概述 1.1 线性回归 1.2 岭回归 1.3 过拟合 2 sklearn中的岭回归 3 案例 3.1 数据介绍: 3.2 实验目的: 3.3 数据特征如下: 4 Python实现 4.1 代码 4.2 结果 5 正则化 1 概述 1.1 线性回归 对于一般地线性回归问题&am…

岭回归(Ridge Regression)和Lasso回归

1、岭回归(Ridge Regression) 标准线性回归(简单线性回归)中: 如果想用这个式子得到回归系数,就要保证(X^TX)是一个可逆矩阵。 下面的情景:如果特征的数据比样本点还要多,数据特征…

岭回归详解 从零开始 从理论到实践

岭回归详解 从零开始 从理论到实践 一、岭回归的理解1.1、LinearRegression的回顾1.2、岭回归 - Ridge Regression 二、sklearn的使用2.1、方法、参数与属性2.1.1、特征标准化 - StandardScaler2.1.2、岭回归 - Ridge2.1.3、内置交叉验证岭回归 - RidgeCV 2.2、实例应用2.2、简…

分布式之Quorum NWR算法

写在前面 假设现在我们实现了AP 系统,但是公司突然要对某些业务进行实时的数据计算,并且要求按照强一致性的方式来读取数据,此时作为系统设计这的我们该怎么办呢?单独为这部分业务实时抽出最新数据?还是修改原有系统&…

glusterfs:Server-quorum和Client Quorum

overview 这两个参数在容错场景中发挥着巨大的作用。用户借助这两个参数 既可以手动控制存在多少个活着的节点表示集群健康,也可以把这个控制权交给集群。 Server-quorum 由两个参数组成 cluster.server-quorum-type: none | server 如果设置为server表示启动了s…

Quorum机制

/******************************************************** 原文链接:http://www.cnblogs.com/jzhlin/archive/2012/07/23/2605077.html ********************************************************/ 分布式系统的设计中会涉及到许多的协议、机制用来解决可靠性问…

Elasticsearch:理解 Master,Elections,Quorum 及 脑裂

集群中的每个节点都可以分配多个角色:master、data、ingest、ml(机器学习)等。 我们在当前讨论中感兴趣的角色之一是 master 角色。 在 Elasticsearch 的配置中,我们可以配置一个节点为 master 节点。master 角色的分配表明该节点…

Quorum简介部署

文章目录 简介账户/密钥管理隐私私有交易管理器 (Private transaction Manager)enclave公有/私有状态 状态验证交易和合约隐私 (Transaction and Contract Privacy)参考 简介 GoQuorum基于geth,在其基础上增加了一些联盟链需要的组件,主要包括以下几点&…

分布式系统理论之Quorum机制

一,Quorum机制介绍 对于数据存储而言,为了提高可用性(Availability),采用了副本备份,比如对于HDFS,默认每块数据存三份。某数据块所在的机器宕机了,就去该数据块副本所在的机器上读…

Hyperledger/Quorum等区块链技术综述

[1]邵奇峰,张召,朱燕超,周傲英.企业级区块链技术综述[J].软件学报,2019,30(09):2571-2592. 摘要:在传统跨机构交易的企业应用中,各个机构都是独立记录己方的交易数据,机构间数据的差异会引起争议,通常需要人工对账或中介机构来解决,因而增加了结算时间和交易费用.区…