机器学习 ---线性回归

目录

摘要:

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

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.mzph.cn/news/886211.shtml

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

相关文章

琐碎笔记——pytest实现前置、后置、参数化、跳过用例执行以及重试

pytest的fixture中文介绍可参考&#xff08;不过文档稍微有点老&#xff09;&#xff1a; https://www.osgeo.cn/pytest/fixture.html#what-fixtures-are pytest各个作用域的fixture scope “function” 可作用于每个用例 fixture使用的声明放在类定义前面&#xff0c;类中的…

蓝桥杯c++算法学习【3】之思维与贪心(重复字符串、翻硬币、乘积最大、皮亚诺曲线距离【难】:::非常典型的必刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 思维与贪心 一、重复字符串 【问题描述】 如果一个字符串S恰好可以由某个字符串重复K次得到&#xff0c;我们就称S是K次重复字 符串…

Vue3 -- 基于Vue3+TS+Vite项目【项目搭建及初始化】

兼容性注意&#xff1a; Vite 需要 Node.js 版本 18 或 20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。【摘抄自vite官网】 这里我用的node版本是 v18.20.2 创建项目&#xf…

低代码集成多方API的简单实现

在现代软件开发中&#xff0c;集成多个API服务提供商已成为常见需求。然而&#xff0c;不同的API认证机制和数据格式使得集成过程变得复杂且耗时。为了应对这些挑战&#xff0c;本文将介绍一种低代码解决方案&#xff0c;通过配置化管理和简化的代码逻辑&#xff0c;帮助开发者…

C++ 编程基础(5)类与对象 | 5.8、面向对象五大原则

文章目录 一、面向对象五大原则1、单一功能&#xff08;Single Responsibility Principle, SRP&#xff09;2、开放封闭原则&#xff08;Open/Closed Principle, OCP&#xff09;3、里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;4、接口隔离原则&am…

计算机网络中的域名系统(DNS)及其优化技术

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机网络中的域名系统&#xff08;DNS&#xff09;及其优化技术 计算机网络中的域名系统&#xff08;DNS&#xff09;及其优化…

STM32单片机CAN总线汽车线路通断检测

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…

第二十一课 Vue组件实用示例

Vue组件实用示例 本课主要介绍组件的一些小练习&#xff0c;通过这些小练习巩固下之前课程中的学习 1&#xff09;组件中值的双向绑定 <div id"app"><test></test> </div> <script>Vue.component(test, {template: <div><…

(实战)WebApi第13讲:怎么把不同表里的东西,包括同一个表里面不同的列设置成不同的实体,所有的给整合到一起?【前端+后端】、前端中点击标签后在界面中显示

一、实现全局跨域&#xff1a;新建一个Controller&#xff0c;其它的controller都继承它 1、新建BaseController 2、在后端配置&#xff0c;此处省略【详情见第12讲四、3、】 3、其它的控制器继承BaseController&#xff0c;这个时候就能够完成全局的跨域 【向后台传cookie和…

前缀和技巧解析

前缀和技巧解析 前缀和&#xff08;Prefix Sum&#xff09;是一种常用的算法技巧&#xff0c;用于高效地处理一系列连续子数组和的问题。通过构建一个额外的数组来存储从数组起始位置到当前位置的累计和&#xff0c;可以在常数时间内快速计算任意区间的和。 前缀和应用的典型…

云安全之云计算基础

0x00 前言 本文主要是针对云计算相关的基础梳理和整理。 云计算 NIST 800-145ISO/IEC 17788ISO/IEC 17789云安全 NIST 500-299 云安全ISO / IEC FDIS 27017 云安全0x01 云计算基础 什么是云计算: 一种新的运作模式和一组用于管理计算资源共享池的技术。云计算是一种颠覆性的…

Mysql每日一题(行程与用户,困难※)

今天给大家分享一个截止到目前位置&#xff0c;我遇到最难的一道mysql题目&#xff0c;非常建议大家亲手做一遍 完整代码如下&#xff0c;这道题的主要难点是它有两个外键&#xff0c;以前没遇到过&#xff0c;我也没当回事&#xff0c;分享一下错误经验哈 当时我写的where判断…

离线 快速搭建 docker docker-compose k8s 环境

所需资源 sealos_5.0.1_linux_arm64.tar.gzkubernetes.tar等docker-compose-linux-aarch64 离线安装sealos&#xff0c;用于安装k8sdocker 首先安装sealos工具 tar zxvf sealos_5.0.1_linux_arm64.tar.gz sealos && chmod x sealos && mv sealos /usr/bin*…

Python的Web请求:requests库入门与应用

Python的Web请求&#xff1a;requests库入门与应用 在Python中&#xff0c;进行网络请求和获取数据是许多应用程序的基础功能。requests库是Python中最流行的HTTP库之一&#xff0c;它以简洁、易用、功能强大的特点著称&#xff0c;可以帮助开发者高效地进行各种类型的Web请求…

已解决:spark代码中sqlContext.createDataframe空指针异常

这段代码是使用local模式运行spark代码。但是在获取了spark.sqlContext之后&#xff0c;用sqlContext将rdd算子转换为Dataframe的时候报错空指针异常 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.Nu…

【Electron】Electron Forge如何支持Element plus?

在 Electron Forge 项目中集成 Element Plus 是一个相对直接的过程。Element Plus 是一个基于 Vue 3 的 UI 组件库&#xff0c;因此你需要确保你的 Electron 项目已经集成了 Vue 3。以下是集成 Element Plus 到 Electron Forge 项目的步骤&#xff1a; 1. 初始化 Electron For…

WebGIS四大地图框架:Leaflet、OpenLayers、Mapbox、Cesium

地理信息系统&#xff08;GIS&#xff09;已经成为现代应用开发中不可或缺的一部分&#xff0c;尤其在前端开发中。随着Web技术的快速发展&#xff0c;许多强大而灵活的GIS框架涌现出来&#xff0c;为开发人员提供了丰富的工具和功能&#xff0c;使他们能够创建交互式、高性能的…

cooladmin 后端 查询记录

查询记录&#xff1a;pageQueryOp中列表查询的group by node ts controller代码如下 import { CoolController, BaseController } from cool-midway/core; import { Inject, Post, Get, Param } from midwayjs/decorator; import { ComparePricesPlanInfoEntity } from ../../…

UE5运行时创建slate窗口

加入"Slate","SlateCore"模块 Actor.cpp // Fill out your copyright notice in the Description page of Project Settings.#include "MyWindowClass.h"// Sets default values AMyWindowClass::AMyWindowClass() {// Set this actor to call…

react 受控组件和非受控组件

在 React 中&#xff0c;受控组件和非受控组件是两种处理表单元素&#xff08;如输入框、选择框等&#xff09;值的方式。 1. 受控组件 受控组件是指 React 组件的表单元素的值是由 React 组件的 state 来管理的。换句话说&#xff0c;React 会全程控制表单元素的值&#xff…