机器学习 ---线性回归

目录

摘要:

一、简单线性回归与多元线性回归

1、简单线性回归

2、多元线性回归

3、残差

二、线性回归的正规方程解

1、线性回归训练流程

2、线性回归的正规方程解

(1)适用场景

(2)正规方程解的公式

三、衡量线性回归的性能指标

四、scikit-learn线性回归实践 - 波斯顿房价预测

1、数据集介绍

2、LinearRegression

摘要:

        文章主要介绍了线性回归相关内容,包括简单线性回归与多元线性回归的概念及示例,阐述了残差的定义、在理想与非理想模型中的情况及意义,还讲解了线性回归的正规方程解,涵盖其适用场景、公式推导与代码实现,提及衡量线性回归性能指标可参考其他文章,最后以 scikit-learn 中的 LinearRegression 类为例,介绍了其在波士顿房价预测实践中的应用,包括数据集情况、类的常用参数及训练、预测函数的使用等。

一、简单线性回归与多元线性回归

1、简单线性回归

        在生活中,我们常常能碰到这么一种情况,一个变量会跟着另一个变量的变化而变化,如圆的周长与半径的关系,当圆的半径确定了,那么周长也就确定了。还有一种情况就是,两个变量之间看似存在某种关系,但又没那么确定,如青少年的身高与体重,他们存在一种近似的线性关系:
身高/cm = 体重/kg +105。
        但是,并不是每个青少年都符合这个公式,只能说每个青少年的身高体重都存在这么一种近似的线性关系。这就是其实就是简单的线性回归,那么,到底什么是线性回归呢?假如我们将青少年的身高和体重值作为坐标,不同人的身高体重就会在平面上构成不同的坐标点,然后用一条直线,尽可能的去拟合这些点,这就是简单的线性回归,如下图:

        简单的线性回归模型:y=wx+b

        其中x表示特征值(如:体重值),w表示权重,b表示偏置,y表示标签(如:身高值)。

2、多元线性回归

        简单线性回归中,一个变量跟另一个变量的变化而变化,但是生活中,还有很多变量,可能由多个变量的变化决定着它的变化,比如房价,影响它的因素可能有:房屋面积、地理位置等等。如果我们要给它们建立出近似的线性关系,这就是多元线性回归,多元线性回归模型如下:

y = b + w_{1}x_{1}+ w_{2}x_{2}+ ...+w_{n}x_{n}

其中,x_{n}表示第n个特征值,w_{i}表示第n个特征对应的权重,b表示偏置,y表示标签。

3、残差

  • 定义
    • 残差是指在回归分析中,观测值与预测值之间的差异,即e_{i}=y_{i}-\hat{y}_{i},其中\hat{y}_{i}是第个观测值,是对应的预测值。残差均值就是所有残差的平均值,即\bar{e}=\frac{1}{n}\sum_{i=1}^{n}e_{i},其中n是样本数量。
  • 在理想线性回归模型中的情况
    • 在理想的线性回归模型(基于普通最小二乘法估计参数)中,残差均值为零。这是因为普通最小二乘法的目标是最小化残差平方和。
    • 从几何角度看,线性回归是在寻找一条直线(在简单线性回归中)或一个超平面(在多元线性回归中),使得数据点到该直线或超平面的垂直距离(即残差)的平方和最小。在这个最优拟合的情况下,残差会在零附近分布,正残差和负残差相互抵消,导致残差均值为零。
  • 残差均值不为零的情况及意义
    • 如果残差均值不为零,这可能意味着模型存在偏差。例如,如果残差均值大于零,说明模型整体上低估了观测值;如果残差均值小于零,则说明模型整体上高估了观测值。
    • 这可能是由于模型设定不正确(如遗漏了重要的变量、函数形式错误等)或者数据存在异常情况(如存在离群点等)导致的。在实际应用中,残差均值是评估模型拟合质量的一个简单指标,发现残差均值不为零后,需要进一步分析模型和数据,以改进模型的拟合效果。

如果线性回归方程有多个解,可以如何解决?

解决方法包括但不限于:

  • 获取更多的训练样本
  • 选取样本有效的特征,使样本数量大于特征数
  • 加入正则化项

二、线性回归的正规方程解

1、线性回归训练流程

        以波士顿房价数据集为例,该数据集每条数据包括对指定房屋的13项数值型特征和目标房价组成:

        由数据集可以知道,每一个样本有13个特征与目标房价,而我们要做的事就是通过这13个特征来预测房价,我们可以构建一个多元线性回归模型,来对房价进行预测。模型如下:

y = b + w_{1}x_{1}+ w_{2}x_{2}+ ...+w_{n}x_{n}

        其中,x_{n}表示第n个特征值,w_{n}表示第n个特征对应的权重,b表示偏置,y表示目标房价。

        为了方便,我们稍微将模型进行变换(下面求解会用到):

y = w_{0}x_{0} + w_{1}x_{1}+ w_{2}x_{2}+ ...+w_{n}x_{n}

        其中x_{0}=1。令Y=\Theta X,其中\Theta =(w_{0},w_{1},w_{2},...,w_{n})X=(1,x_{1},x_{2},...,x_{n})

        而我们的目的就是找出能够正确预测的多元线性回归模型,即找出正确的参数\Theta。那么如何寻找呢?通常在监督学习里面都会使用这么一个套路,构造一个损失函数,用来衡量真实值与预测值之间的差异,然后将问题转化为最优化损失函数。既然损失函数是用来衡量真实值与预测值之间的差异,那么很多人自然而然的想到了用所有真实值与预测值的差的绝对值来表示损失函数。不过带绝对值的函数不容易求导,所以我们可以采用采用MSE(均方误差)作为损失函数(相关内容可以查看另一篇文章:机器学习 ---模型评估、选择与验证(1)),公式如下:

\frac{1}{m}\sum_{i = 1}^{m}(y^{i}-p^{i})^{2}

        其中y^{i} 表示第 i 个样本的真实标签,p^{i} 表示模型对第 i 个样本的预测标签,m为样本总个数。最后,我们再使用正规方程解来求得我们所需要的参数。线性回归模型训练流程如下:

2、线性回归的正规方程解

(1)适用场景

  • 数据集规模较小且特征数量不是很多的情况下,正规方程解是比较常用的(对于其他方法,比如梯度下降法等将在之后的文章中提到)。例如,当我们处理一些简单的实验数据或者小型的商业分析数据集时,假设特征数量m较小(比如m<1000),数据样本数量n也不大(比如n<10000)。
  • 因为正规方程解的公式在这种情况下计算起来相对简单直接。它不需要像梯度下降法那样进行多次迭代来收敛到最优解,只要能够计算矩阵的逆,就可以一次性得到参数θ的最优解
  • 例如,在一个简单的房价预测模型中,我们仅考虑房屋面积、房间数量这两个特征来预测房价。数据集包含 100 套房子的数据,通过正规方程解可以快速得到线性回归模型的参数,从而构建预测模型。

(2)正规方程解的公式

        对线性回归模型,假设训练集中m个训练样本,每个训练样本中有n个特征,可以使用矩阵的表示方法,预测函数可以写为:Y=\Theta X,其损失函数可以表示为:(Y-\Theta X)^{T}(Y-\Theta X)

其中,标签Y为m\times 1的矩阵,训练特征X为m\times (n+1)的矩阵,回归系数θ为(n+1)\times1的矩阵,对θ求导,并令其导数等于0,可以得到:X^{T}(Y-\Theta X)=0。所以,最优解为:

\Theta =(X^{T}X)^{-1}X^{T}Y

这个就是正规方程解,我们可以通过最优方程解直接求得我们所需要的参数。

代码实现:

import numpy as np
def mse_score(y_predict,y_test):'''input:y_predict(ndarray):预测值y_test(ndarray):真实值ouput:mse(float):mse损失函数值'''mse = np.mean((y_predict-y_test)**2)return mseclass LinearRegression :def __init__(self):'''初始化线性回归模型'''self.theta = Nonedef fit_normal(self,train_data,train_label):'''input:train_data(ndarray):训练样本train_label(ndarray):训练标签'''# 在训练数据的特征矩阵前面添加一列全为1的列,用于表示截距项X = np.hstack((np.ones((train_data.shape[0], 1)), train_data))# 根据正规方程公式计算模型参数theta# 先计算X的转置与X的乘积的逆矩阵inverse_term = np.linalg.inv(X.T.dot(X))# 再计算X的转置与训练标签的乘积product_term = X.T.dot(train_label)# 最后将逆矩阵与上述乘积相乘,得到模型参数thetaself.theta = inverse_term.dot(product_term)return self.theta

三、衡量线性回归的性能指标

        这部分在上面提到的另外一篇文章中有提到过,感兴趣的话可以去看一看,这里就不再过多赘述。

四、scikit-learn线性回归实践 - 波斯顿房价预测

1、数据集介绍

        波斯顿房价数据集共有506条波斯顿房价的数据,每条数据包括对指定房屋的13项数值型特征和目标房价组成。用数据集的80%作为训练集,数据集的20%作为测试集,训练集和测试集中都包括特征和目标房价。

数据集中部分数据与标签如下图所示:

2、LinearRegression

LinearRegression 是 scikit-learn 库(通常简称为sklearn)中用于实现线性回归算法的一个类。

LinearRegression的构造函数中有两个常用的参数可以设置:

  • fit_intercept:是否有截距,如果没有则直线过原点,默认为Ture。
  • normalize:是否将数据归一化,默认为False。

LinearRegression类中的fit函数用于训练模型,fit函数有两个向量输入:

  • X:大小为[样本数量,特征数量]的ndarray,存放训练样本。
  • Y:值为整型,大小为[样本数量]的ndarray,存放训练样本的标签值。

LinearRegression类中的predict函数用于预测,返回预测值,predict函数有一个向量输入:

  • X:大小为[样本数量,特征数量]的ndarray,存放预测样本。

        利用LinearRegression进行线性回归,代码及相应的注释如下:(此处仅为一个简单的线性回归的示例)

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score# 加载波士顿房价数据集
boston = load_boston()# 将数据转换为DataFrame格式,这里的特征数据
train_data = pd.DataFrame(boston.data, columns=boston.feature_names)# 目标数据(房价)作为训练标签
train_label = pd.Series(boston.target)# 划分训练集和测试集,测试集占比可自行设置,这里设为0.2(即20%)
X_train, X_test, y_train, y_test = train_test_split(train_data, train_label, test_size=0.2, random_state=42)# 创建线性回归模型对象
lr = LinearRegression()# 模型训练
lr.fit(X_train, y_train)# 模型预测
pred = lr.predict(X_test)# 将预测结果转换为DataFrame
pred_df = pd.DataFrame({'result': pred})# 模型评估
mse = mean_squared_error(y_test, pred)
mae = mean_absolute_error(y_test, pred)
r2 = r2_score(y_test, pred)print("\n模型评估指标:")
print(f"均方误差(MSE): {mse}")
print(f"平均绝对误差(MAE): {mae}")
print(f"决定系数(R²): {r2}")

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

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

相关文章

Unity类银河战士恶魔城学习总结(P127 Stat ToolTip属性提示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了把鼠标放到属性上面就会显示属性的作用 UI_StatToolTip.cs 这段代码实现了一个UI提示框&#xff08;ToolTip&#xff09;功能…

C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 initializer_list表达式、tuple元组、pair对组再C日常还是比较常用的&#xff0c;尤其是对组在刷算法还是挺好用的&#xff0c;这里做一个简介&#xff1b;这三个语法结合C17的结构化绑定会更好用&#xff…

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

[JAVA]有关MyBatis环境配置介绍

什么是MyBatis环境配置&#xff1f; MyBatis是基于JDBC对数据库进行操作&#xff0c;在我们进行数据操作时&#xff0c;我们需要告诉MyBatis我们连接哪个数据库&#xff0c;ip地址&#xff0c;数据库名称&#xff0c;用户名密码等。以此来进行环境配置。 首先&#xff0c;MyB…

微搭低代码入门05循环

目录 1 for 循环2 while 循环3 do...while 循环4 break 语句5 循环展示组件总结 在编程中&#xff0c;循环是一种非常强大的控制结构&#xff0c;它允许我们重复执行一段代码直到满足某个条件为止。在微搭中&#xff0c;我们一般用循环来处理我们数据库返回的结果。 在微搭中&a…

11.13机器学习_线性回归

十 集成学习方法之随机森林 机器学习中有一种大类叫集成学习&#xff08;Ensemble Learning&#xff09;&#xff0c;集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话&#xff1a;三个…

活动|华院计算作为联盟理事单位出席进博会全球人工智能合作论坛

第七届中国国际进口博览会&#xff08;进博会&#xff09;于11月5日至10日在上海举行&#xff0c;作为本次进博会的重要配套活动&#xff0c;首届人工智能全球合作论坛也于9日圆满落幕。本次论坛由全球招商中心委员会、人工智能全球合作论坛组委会主办&#xff0c;中国国际科技…

2、开发工具和环境搭建

万丈高楼平地起&#xff0c;学习C语言先从安装个软件工具开始吧。 1、C语言软件工具有两个作用 1、编辑器 -- 写代码的工具 2、编译器 -- 将代码翻译成机器代码0和1 接下来我们介绍两种C语言代码工具&#xff1a;devcpp 和 VS2019&#xff0c;大家可以根据自己的喜好安装。 dev…

【Qt实现虚拟键盘】

Qt实现虚拟键盘 &#x1f31f;项目分析&#x1f31f;实现方式&#x1f31f;开发流程 &#x1f31f;项目分析 需求&#xff1a;为Linux环境下提供可便捷使用的虚拟键盘OS环境&#xff1a;Windows 7/11、CentOS 7开发语言&#xff1a;Qt/C IDE&#xff1a;QtCreator 、Qt5.14.2功…

领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐

​无线麦克风凭借其无与伦比的便携性与灵活性&#xff0c;成为在演讲、表演以及会议等多种场合中不可或缺的有力帮手。它挣脱了线缆的束缚&#xff0c;使得声音的传播更加自由自在。其操作十分简便&#xff0c;只需简单配对就能投入使用&#xff0c;从而可以轻松地适应各类场景…

ADC输出码和输入电压转换关系

ADC输出码和输入电压转换关系 转换公式&#xff1a;ADC输出码(Vin / Vref) *2n 。其中Vin 是输入ADC芯片的电压&#xff0c;Vref是参考电压&#xff0c;n是ADC芯片的位数。 举个例子MS5182是一个16bit的ADC&#xff08;21665536&#xff09;&#xff0c;参考电压Vref4.096V&a…

IROS讲座:如何写出受欢迎的论文

讲座原名称&#xff1a;How to write papers people love reading 时间地点&#xff1a;2024年10月中旬&#xff0c;阿布扎比国家展览中心&#xff0c;阿联酋 演讲嘉宾照片&#xff1a; 以下是拍摄的部分PPT&#xff0c;并添加了中文笔记&#xff1a;

【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?

目录 一、背景描述 二、解决办法 三、清理效果 四、理论参考 解决方法 1. 清理未使用的 Docker 镜像、容器和卷 2. 查看 Docker 使用的磁盘空间 3. 调整 Docker 的存储位置 4. 增加磁盘空间 5. 调整 Docker Desktop 配置 6. 使用 Docker 清理工具&#xff08;例如 D…

Tiktok对接和内容发布申请流程

这段时间在搞AI生成视频&#xff0c;希望用户能一键发布到Tiktok&#xff0c;因此研究了一下Tiktok的开发者申请流程&#xff0c;发现好复杂&#xff0c;同时也发现Tiktok的开发也跟我一样&#xff0c;挺草台班子的 0、流程简述 废话不多说&#xff0c;Tiktok的开发者申请和…

Android ART知多少?

Android 虚拟机 ART&#xff08;Android Runtime&#xff09;是 Android 平台上的应用程序运行时环境&#xff0c;用于执行应用程序的字节码。ART 自 Android 5.0&#xff08;Lollipop&#xff09;开始取代了 Dalvik&#xff0c;成为 Android 的默认运行时环境。本文将从以下几…

黑马嵌入式开发入门模电基础学习笔记

学习视频: 黑马程序员嵌入式开发入门模电&#xff08;模拟电路&#xff09;基础 文章目录 背景介绍电流电压组件仿真三极管ne555PCBEDA案例&#xff1a;非接触式电笔案例&#xff1a;电子琴 背景介绍 电流 电压 组件 仿真 三极管 mos管 ne555 PCB EDA 案例&#xff1a;非接触…

Ubuntu 18 EDK2 环境编译

视频&#xff1a;在全新的Ubuntu上从零搭建UEFI的EDK2开发环境 开始&#xff1a;git clone https://github.com/tianocore/edk2.git 开始编译BaseTools前先更新一下子模块&#xff1a;git submodule update --init &#xff0c;然后&#xff1a;make -C BaseTools/ 问题1&a…

第9章 DIV+CSS布局

9.1 DIVCSS概述 DIVCSS是Web设计标准&#xff0c;它是一种网页的布局方法。与传统中通过表格&#xff08;table)布局定位的方式不同&#xff0c;它可以实现网页页面内容与表现相分离。DIV组成了网页的格局&#xff0c;CSS则装饰了格局&#xff0c;比如建一栋房子&#xff0c;…

QT QLineEdit失去焦点事件问题与解决

本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题&#xff01; 目录 一、QLineEdit获得失去焦点事件 1.自定义类继承自QLineEdit 2.重写 focusOutEvent 3.使用 二、失去焦点事件问题 1.问题描述 2.问题解决 三、源码分享 lineed…