机器学习-利用 scikit-learn 使用梯度下降实现线性回归

线性回归是一种基本的统计学习方法,用于建立特征与连续目标变量之间的线性关系模型。其核心思想是通过最小化预测值与实际观测值之间的误差来拟合数据。这种模型假设自变量(特征)与因变量(目标)之间的关系是线性的,即可以用直线或超平面来描述。在实际应用中,线性回归广泛用于预测和建模,例如预测房价、分析市场趋势、评估影响因素等。优点包括简单易理解、计算效率高,但也存在对数据分布和特征线性关系的假设限制,需要在实践中谨慎应用和验证。

实现线性回归涉及多个步骤,从数据预处理到模型评估,每个步骤都至关重要。以下是详细的步骤解释:

1. 数据准备和预处理

首先,准备数据并进行必要的预处理:

  • 数据加载:从数据源(文件、数据库等)加载数据集。

  • 特征选择:根据问题定义选择适当的特征,这些特征应该与目标变量有相关性。

  • 数据清洗:处理缺失值、异常值和重复数据,确保数据质量。

  • 数据标准化:对特征进行标准化或归一化处理,以确保特征具有相似的尺度,例如使用 StandardScalerMinMaxScaler

2. 定义模型

选择适当的线性回归模型:

  • 线性假设:确认自变量与因变量之间的线性关系,即假设目标变量可以通过特征的线性组合来预测。

  • 模型选择:选择合适的线性回归模型,如普通最小二乘法(OLS)、岭回归、Lasso回归或梯度下降法等,根据数据集的大小和复杂度进行选择。

3. 模型训练

使用训练数据拟合模型:

  • 拟合模型:将选定的线性回归模型与标准化后的训练数据拟合,以确定模型参数(斜率和截距)。

  • 损失函数:定义损失函数,通常为均方误差(MSE)或平均绝对误差(MAE),用于衡量模型预测与实际观测值之间的误差。

4. 模型评估和调优

评估模型性能并进行必要的调优:

  • 模型评估:使用验证集或交叉验证技术评估模型的泛化能力,避免过拟合或欠拟合问题。

  • 参数调优:根据评估结果调整模型超参数(如正则化系数、学习率等),以提高模型的预测能力。

5. 预测和解释

使用训练好的模型进行预测并解释结果:

  • 预测:使用测试集或新数据进行预测,生成对目标变量的预测值。

  • 结果解释:分析模型的预测结果,理解每个特征对目标变量的影响程度(系数解释)。

6. 模型部署和监控

最后,将训练好的模型部署到生产环境,并定期监控模型的表现,以确保模型的稳定性和准确性。

这些步骤组成了实现线性回归的完整过程,每一步都需要仔细处理和验证,以保证模型的有效性和可靠性。

我们以 scikit-learn为例来实现线性回归模型,具体步骤如下所示:

1. 宏观理解

代码主要依赖于以下几个步骤:

  • 加载房屋数据并进行预处理。
  • 使用随机梯度下降(SGD)线性回归模型训练数据。
  • 对模型进行评估,并可视化预测结果与真实值的比较。

2. 详细步骤

导入必要的库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from lab_utils_multi import load_house_data
from lab_utils_common import dlc
  • numpy:用于数值计算和数组操作。
  • matplotlib.pyplot:用于绘图。
  • SGDRegressor:Scikit-Learn 中的随机梯度下降线性回归模型。
  • StandardScaler:用于数据标准化,将特征缩放到均值为0,方差为1的标准正态分布。
  • load_house_datadlc:从自定义工具包中导入,用于加载房屋数据和其他通用工具。

加载和预处理数据

# 加载数据
X_train, y_train = load_house_data()
X_features = ['size(sqft)', 'bedrooms', 'floors', 'age']# 数据标准化
scaler = StandardScaler()
X_norm = scaler.fit_transform(X_train)
  • load_house_data():加载房屋数据,返回特征 X_train 和目标值 y_train
  • X_features:特征的名称列表。
  • StandardScaler:创建一个标准化的对象 scaler,并使用 fit_transform() 方法对 X_train 进行标准化处理,得到 X_norm

训练 SGD 回归模型

# 创建并训练SGD回归模型
sgdr = SGDRegressor(max_iter=1000)
sgdr.fit(X_norm, y_train)
  • 创建 SGDRegressor 对象 sgdr,并设定最大迭代次数 max_iter=1000
  • 使用 fit() 方法训练模型,传入标准化后的特征数据 X_norm 和目标数据 y_train

进行预测

# 使用 sgdr.predict() 进行预测
y_pred_sgd = sgdr.predict(X_norm)# 使用 np.dot() 和 w, b 进行预测
y_pred = np.dot(X_norm, w_norm) + b_norm
  • sgdr.predict():使用训练好的模型 sgdr 对标准化后的特征 X_norm 进行预测,得到 y_pred_sgd
  • np.dot() 和模型参数 w_norm, b_norm:手动计算预测值 y_pred,通过特征 X_norm 和模型参数进行点积计算。

评估模型和输出结果

# 检查两种预测方法是否匹配
print(f"prediction using np.dot() and sgdr.predict match: {(y_pred == y_pred_sgd).all()}")# 打印训练集上的预测值和目标值
print(f"Prediction on training set:\n{y_pred[:4]}")
print(f"Target values \n{y_train[:4]}")
  • 检查两种预测方法是否匹配,打印是否完全一致的布尔值。
  • 打印训练集的前四个预测值 y_pred 和目标值 y_train

可视化预测结果

# 绘制预测值和目标值相对于原始特征的散点图
fig, ax = plt.subplots(1, 4, figsize=(12, 3), sharey=True)
for i in range(len(ax)):# 绘制目标值的散点图ax[i].scatter(X_train[:, i], y_train, label='target')ax[i].set_xlabel(X_features[i])# 绘制预测值的散点图ax[i].scatter(X_train[:, i], y_pred, color=dlc["dlorange"], label='predict')# 设置Y轴标签和图例
ax[0].set_ylabel("Price")
ax[0].legend()# 设置标题
fig.suptitle("target versus prediction using z-score normalized model")# 显示图像
plt.show()
  • 创建包含四个子图的图形 fig,每个子图显示一个特征与目标值和预测值的散点图。
  • 使用循环遍历每个子图 ax[i],分别绘制目标值和预测值的散点图。
  • dlc["dlorange"] 是颜色标识,用于标记预测值的散点。
  • 设置 Y 轴标签为 “Price”,添加图例和整体标题。
  • 最后,通过 plt.show() 显示图形。

这样,代码完成了加载数据、模型训练、预测和结果可视化的整个流程。完整代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from lab_utils_multi import load_house_data
from lab_utils_common import dlcnp.set_printoptions(precision=2)
plt.style.use('./deeplearning.mplstyle')# 加载数据
X_train, y_train = load_house_data()
X_features = ['size(sqft)', 'bedrooms', 'floors', 'age']# 数据标准化
scaler = StandardScaler()
X_norm = scaler.fit_transform(X_train)# 创建并训练SGD回归模型
sgdr = SGDRegressor(max_iter=1000)
sgdr.fit(X_norm, y_train)# 获取模型参数
b_norm = sgdr.intercept_
w_norm = sgdr.coef_# 使用 sgdr.predict() 进行预测
y_pred_sgd = sgdr.predict(X_norm)# 使用 np.dot() 和 w, b 进行预测
y_pred = np.dot(X_norm, w_norm) + b_norm# 检查两种预测方法是否匹配
print(f"prediction using np.dot() and sgdr.predict match: {(y_pred == y_pred_sgd).all()}")# 打印训练集上的预测值和目标值
print(f"Prediction on training set:\n{y_pred[:4]}")
print(f"Target values \n{y_train[:4]}")# 绘制预测值和目标值相对于原始特征的散点图
fig, ax = plt.subplots(1, 4, figsize=(12, 3), sharey=True)
for i in range(len(ax)):# 绘制目标值的散点图ax[i].scatter(X_train[:, i], y_train, label='target')ax[i].set_xlabel(X_features[i])# 绘制预测值的散点图ax[i].scatter(X_train[:, i], y_pred, color=dlc["dlorange"], label='predict')
# 设置Y轴标签和图例
ax[0].set_ylabel("Price")
ax[0].legend()
# 设置标题
fig.suptitle("target versus prediction using z-score normalized model")
# 显示图像
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于字典学习的地震数据降噪(MATLAB R2021B)

稀疏表示基于研究者们提出了许多变换基函数的方法逐渐成型,比如小波域,曲波域,dreamlet 域等,其原理是利用地震信号在变换域内的稀疏性和可分离性以去除噪声。继 Donoho发表非线性去噪方法-小波阈值萎缩方法,在后续的研…

半导体芯闻--20240707

1、韩国基础科学研究所团队开发出的亚纳米级半导体逻辑电路技术,实现了宽度小于1纳米的一维金属材料在二维电路中的应用。这一突破标志着下一代半导体及基础材料科学的重大进展,对解决传统半导体制造过程中的技术问题具有重要意义。 2、英特尔选择台积电…

HackTheBox--Headless

Headless测试过程 1 信息收集 NMAP端口扫描 nmap -sSCV 10.10.11.85000端口测试 检查页面功能,请求 For questions 功能,跳转到 /support 目录 目录扫描 发现 /dashboard 目录 访问 /dashboard 目录,显示未认证,如果通过认证…

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序,其中必定有很多辅助内容,这只会增加篇幅,在这里我们更愿意列举一些典型的备份脚本功能,展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…

图解 RocketMQ 架构

写在前面 Kafka、RocketMQ都是很出名的中间件,上次我们讲解了Kafka,这次我们来讲讲RocketMQ的原理。 基本架构图 解析 RocketMQ 总共可以分成四个模块 NameServer:提供服务发现和路由功能,管理各种元数据信息。Broker&#xf…

基于最大相邻夹角的边缘点提取(matlab)

1、背景介绍 边缘点是指点云数据中代表物体或场景几何形状突变的那些点。在三维点云中,边缘点通常标志着不同表面或物体的分界,或者是物体表面上的不规则性,如裂缝、棱角、突起等。点云边缘检测的作用非常重要,最常见是进行特征点…

php校园二手交易网站-计算机毕业设计源码041148

目 录 摘要 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2 校园二手交易网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结…

AI学习指南机器学习篇-K均值聚类聚类数目选择

AI学习指南机器学习篇-K均值聚类聚类数目选择 在机器学习领域,K均值聚类是一种常用的无监督学习方法,用于将数据集分成K个类别。然而,选择适当的聚类数目K是一个常见的问题,因为不恰当的聚类数目选择可能导致聚类结果不理想。本文…

nginx配置代理

nginx配置代理 1. 安装并启动Nginx:2. 加载Nginx配置文件:3. 创建虚拟主机配置文件:4. 创建符号链接以启用虚拟主机:5. 检查配置文件语法是否正确:6. 重新加载Nginx配置:7. 配置反向代理:8. 高级…

MySQL安全加固

安全加固 禁止MySQL以管理员的身份账号权限运行 #用普通账户运行mysqld#加固方法: my.cnf配置文件中配置usermysql是否存在密码为空的用户 #1、sql_mode启用 NO_CREATE_AUTO_USER,这个参数(NO_CREATE_AUTO_USER)禁止自动创建密…

基于AOP的数据字典实现:实现前端下拉框的可配置更新

作者:后端小肥肠 创作不易,未经允许严禁转载。 目录 1. 前言 2. 数据字典 2.1. 数据字典简介 2.2. 数据字典如何管理各模块的下拉框 3. 数据字典核心内容解读 3.1. 表结构 3.2. 核心代码 3.2.1. 根据实体类名称获取下属数据字典 3.2.2. 数据字…

回顾 DTC 2024 大会——聚焦数据技术创新:揭秘下一代纯实时搜索引擎 INFINI Pizza

2024 年 4 月 12 日至 13 日,备受瞩目的第十三届“数据技术嘉年华”(DTC2024)在北京新云南皇冠假日酒店盛大开幕。本次大会由中国 DBA 联盟(ACDU)与墨天轮社区联合主办,以“智能云原生一体化——DB 与 AI 协…

在先企业字号被申请注册成商标!

今天一网友联系普推商标知产老杨,说自己注册的商标被某公司无效宣告了,去年联系老杨时,当时就给说这个商标名称存在风险,与别人的字号权存在高度近似,而且是同行业同地区在后面注册的。 十几年前某公司先成功注册成字号…

Ubuntu 安装CGAL

一、什么是CGAL CGAL(Computational Geometry Algorithms Library)是一个广泛使用的开源库,主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构,适用于各种应用领域。以下是 CGAL 的主要功能…

postcss-pxtorem

postcss-pxtorem屏幕自适应 //安装插件 npm install postcss postcss-pxtorem --save-dev//在根目录中新增postcss.config.cjs或postcss.config.js文件,并写上如下代码 module.exports {plugins: {"postcss-pxtorem": {rootValue: 16,selectorBlackList…

如何利用Java Stream API简化集合操作?

如何利用Java Stream API简化集合操作? 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! Java Stream API是Java 8引入的一种新的抽象概念,用于对集合对象进行函数式风格的操作…

算力共享和联邦学习的关系

目录 算力 共享和联邦学习的关系 算力共享 联邦学习 算力共享与联邦学习的关系 算力 共享和联邦学习的关系 算力共享和联邦学习之间存在着紧密的关系,它们都是现代数据处理和机器学习领域中的重要概念,尤其在处理大规模数据和保护数据隐私方面发挥着关键作用。 算力共享…

JD-GUI下载和使用

JD-GUI是专门查看jar包的,包括source.jar和doc.jar。JD-GUI可以把.class文件反编译为可编辑的.java文件,有图形化界面。 github下载地址:https://github.com/java-decompiler/jd-gui/releases 下载windows版本的zip包,如下图&…

智能化代码审查系统设计

设计一个智能化代码审查系统,特别是针对Java开发,需要综合考虑多个维度来提升代码质量、提高审查效率,并促进团队间的协作。以下是该系统设计的关键要素和功能特性: 系统架构 客户端-服务器架构:前端提供友好的Web界面…

2477. 到达首都的最少油耗

Problem: 2477. 到达首都的最少油耗 文章目录 思路解题过程复杂度Code 思路 为了解决这个问题,我们使用深度优先搜索(DFS)算法来遍历给定的树形结构。在这个过程中,我们维护两个数组,size 和 cost,分别用于…