【Python・机器学习】多元回归模型(原理及代码)
前言
自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)~(部分讲解会参考知乎等平台)
本文重点:多元回归模型的建立以及在实际语言学数据的处理
【1.多元回归分析的基本原理】
【2.应用条件】
【3.数据实例以及Python代码】
【4.结果分析】
1.多元回归分析的基本原理
多元线性回归用于估计两个或多个自变量与一个因变量之间的线性关系。
其基本思想是,因变量可以表示为自变量的线性组合,加上一个随机误差项。通过最小二乘法估计回归系数,建立回归方程,可以用于预测和解释变量间的关系。
- 左侧蓝色框代表多个自变量(X₁, X₂, X₃, ...)
- 右侧橙色框代表因变量(Y)
- 连接线上的β₁、β₂、β₃表示回归系数,表示各个自变量对因变量的影响程度
- 底部的回归方程:Y = β₀ + β₁X₁ + β₂X₂ + β₃X₃ + ... + ε
- β₀ 是截距
- β₁, β₂, β₃ 等是回归系数
- ε 是误差项
这种关系表明:
- 每个自变量都可能对因变量产生影响
- 影响程度由回归系数β的大小决定
- 所有自变量的影响是综合的、同时存在的
- 模型中包含误差项(ε),表示存在其他未知或未计入的影响因素
2.应用条件
- 线性关系:因变量与自变量之间存在线性关系。可通过【散点图】初步判断。
- 误差项正态性:随机误差项服从均值为0的正态分布。
- 误差项独立性:随机误差项之间相互独立。
- 方差齐性:不同自变量水平下,因变量的方差相等。
- 自变量间无多重共线性:自变量之间不存在精确的线性关系。
3.数据实例以及Python代码
下面以一个语言教育学的数据为例,探讨多元回归分析的应用。
该数据包含了影响英语成绩的几个因素:学习时间、词汇量、语法能力和阅读理解能力得分。希望建立一个回归模型来预测英语成绩。
数据实例如下(随机生成)
序号 | 学习时间 (小时/周) | 词汇量 (个) | 语法能力 (分) | 阅读理解 (分) | 英语成绩 (分) |
---|---|---|---|---|---|
1 | 7.49 | 1884 | 83.94 | 66.21 | 73.87 |
2 | 8.77 | 2273 | 92.22 | 72.77 | 86.1 |
3 | 8.91 | 1731 | 85.51 | 67.37 | 77.47 |
4 | 9.41 | 2158 | 71.53 | 73.82 | 78.53 |
5 | 7.99 | 2023 | 82.66 | 69.11 | 77.18 |
... | ... | ... | ... | ... | ... |
1.导入必要的包和库
# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
import matplotlib.pyplot as plt
2.数据准备(以下数据随机生成,自己有数据的情况下直接读取即可,读取方法在后面)
# 生成模拟数据
np.random.seed(42) # 设置随机种子,确保结果可重现
n_students = 100 # 生成100名学生的数据# 生成自变量数据
study_time = np.random.normal(8, 2, n_students) # 学习时间
vocabulary = np.random.normal(2000, 500, n_students) # 词汇量
grammar_score = np.random.normal(75, 15, n_students) # 语法能力
reading_score = np.random.normal(70, 10, n_students) # 阅读理解#创建因变量(英语成绩)
english_score = (0.3 * study_time + 0.25 * vocabulary/100 + 0.25 * grammar_score + 0.2 * reading_score + np.random.normal(0, 5, n_students))# 创建数据框
data = pd.DataFrame({'学习时间': study_time,'词汇量': vocabulary,'语法能力': grammar_score,'阅读理解': reading_score,'英语成绩': english_score
})# 查看数据统计信息
print(data.describe())
输出结果:
# 相关性分析
correlation_matrix = data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('变量相关性热力图')
plt.tight_layout()
plt.show()
3.回归模型建立
# 准备建模数据(如果是从excel/csv文件读取的话需要替换相应的变量名,读取方法参考最后)
X = data[['学习时间', '词汇量', '语法能力', '阅读理解']]
y = data['英语成绩']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 建立并训练模型
model = LinearRegression()
model.fit(X_train, y_train)
这部分将数据划分为训练集和测试集,并使用线性回归建立模型。
4.模型评估
# 打印模型系数
print("\n回归系数:")
for feature, coef in zip(X.columns, model.coef_):print(f"{feature}: {coef:.4f}")
print(f"截距: {model.intercept_:.4f}")# 模型评估
y_pred = model.predict(X_test)
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print(f"\n模型评估:")
print(f"R² 分数: {r2:.4f}")
print(f"均方误差: {mse:.4f}")
这部分展示了每个变量的回归系数,以及模型的R²值和均方误差。
输出结果:
5.预测示例
# 预测示例
example_student = pd.DataFrame({'学习时间': [10],'词汇量': [2500],'语法能力': [85],'阅读理解': [80]
})
predicted_score = model.predict(example_student)
print(f"\n示例预测:")
print(f"对于学习时间为10小时/周、词汇量2500词、语法85分、阅读理解80分的学生:")
print(f"预测英语成绩为: {predicted_score[0]:.2f}")
6.可视化预测结果
# 可视化预测结果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('Actual Score')
plt.ylabel('Predicted Score')
plt.title('Predicted vs Actual Scores')
plt.tight_layout()
plt.show()
▷从excel 或者csv文件中读取数据的情况
# 读取Excel文件(路径按需修改)
excel_data = read_excel_file("language_education.xlsx")# 读取CSV文件(路径按需修改)
csv_data = read_csv_file("language_education.csv")# 读取自变量/因变量(以excel文件为例)
X, y = read_variables_by_names("language_education.xlsx",dependent_var='英语成绩',independent_vars=['词汇量', '语法能力', '阅读理解']
)#之后代码相通,记得修改变量名即可
完整代码如下:
# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
import matplotlib.pyplot as plt# 生成模拟数据
np.random.seed(42) # 设置随机种子,确保结果可重现# 生成100名学生的数据
n_students = 100# 生成自变量数据
study_time = np.random.normal(8, 2, n_students) # 平均8小时/周,标准差2
vocabulary = np.random.normal(2000, 500, n_students) # 平均2000词,标准差500
grammar_score = np.random.normal(75, 15, n_students) # 平均75分,标准差15
reading_score = np.random.normal(70, 10, n_students) # 平均70分,标准差10# 生成因变量(英语成绩)
# 设定一些权重来模拟各因素对成绩的影响
english_score = (0.3 * study_time + 0.25 * vocabulary/100 + 0.25 * grammar_score + 0.2 * reading_score + np.random.normal(0, 5, n_students)) # 添加一些随机噪声# 创建数据框
data = pd.DataFrame({'学习时间': study_time,'词汇量': vocabulary,'语法能力': grammar_score,'阅读理解': reading_score,'英语成绩': english_score
})# 查看数据的基本统计信息
print("\n数据基本统计信息:")
print(data.describe())# 准备建模数据
X = data[['学习时间', '词汇量', '语法能力', '阅读理解']]
y = data['英语成绩']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 建立并训练模型
model = LinearRegression()
model.fit(X_train, y_train)# 打印模型系数
print("\n回归系数:")
for feature, coef in zip(X.columns, model.coef_):print(f"{feature}: {coef:.4f}")
print(f"截距: {model.intercept_:.4f}")# 模型评估
y_pred = model.predict(X_test)
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print(f"\n模型评估:")
print(f"R² 分数: {r2:.4f}")
print(f"均方误差: {mse:.4f}")# 预测示例
example_student = pd.DataFrame({'学习时间': [10],'词汇量': [2500],'语法能力': [85],'阅读理解': [80]
})
predicted_score = model.predict(example_student)
print(f"\n示例预测:")
print(f"对于学习时间为10小时/周、词汇量2500词、语法85分、阅读理解80分的学生:")
print(f"预测英语成绩为: {predicted_score[0]:.2f}")# 可视化预测结果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('Actual Score')
plt.ylabel('Predicted Score')
plt.title('Predicted vs Actual Scores')
plt.tight_layout()
plt.show()
4.结果分析:
1.回归系数解释
- 学习时间: 0.1710
- 含义:每增加1小时的学习时间,预期英语成绩会增加0.171分
- 影响程度相对较小
- 词汇量: 0.0050
- 含义:每增加1个词汇量,预期英语成绩会增加0.005分
- 看似很小,但考虑到词汇量通常以百或千为单位增长,实际影响不小
- 例如:增加100个词汇量,预期成绩增加0.5分
- 语法能力: 0.2181
- 含义:语法测试分数每提高1分,预期英语成绩会增加0.218分
- 影响程度中等
- 阅读理解: 0.3077
- 含义:阅读理解分数每提高1分,预期英语成绩会增加0.308分
- 在所有因素中影响最大
2.模型评估指标解释
- R² (R平方) = 0.4948
- 含义:模型可以解释约49.48%的英语成绩变异
- 这个R²值表明模型的拟合程度一般,还有约50%的变异无法被当前自变量解释
- 说明可能还有其他重要因素影响英语成绩未被纳入模型
- MSE(均方误差)= 33.0542
- 含义:预测值与实际值的平均偏差的平方
- 开平方后约为5.75分,表示预测值平均偏离实际值约5.75分
- 这个误差相对于英语成绩的总分范围来说中等偏大
3.结论和建议
- 阅读理解能力对英语成绩的影响最大,应优先提升
- 语法能力的影响次之
- 学习时间的效果相对较小,可能需要关注学习效率而不仅是时间投入
- 模型的预测能力一般,建议:
- 考虑增加其他相关变量(如听力能力、口语水平等)
- 可能存在非线性关系,考虑使用更复杂的模型
- 增加样本量以提高模型稳定性
4.实践意义
- 教学重点应放在提升阅读理解和语法能力上
- 单纯增加学习时间的收益可能有限
- 在预测学生成绩时,需要考虑较大的误差范围
本文展示了多元回归分析的基本实现流程。在实际应用中,还可以使用交叉检验评估模型稳定性。
按需更新!
相关文章:

【Python・机器学习】多元回归模型(原理及代码)
前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)&am…...

mysql数据被误删的恢复方案
文章目录 一、使用备份恢复二、使用二进制日志(Binary Log)三、使用InnoDB表空间恢复四、使用第三方工具预防措施 数据误删是一个严重的数据库管理问题,但通过合理的备份策略和使用适当的恢复工具,可以有效地减少数据丢失的风险…...

使用EasyExcel(FastExcel) 的模板填充报Create workbook failure
场景 使用 EasyExcel (FastExcel) 做数据导出时,用了通过模板导出数据的形式。 在读取模板文件的时候出现错误导致创建Workbook 失败, 错误日志: Create workbook failure... No valid entries or contents found, this is not a valid OOX…...

[C]基础8.详解操作符
博客主页:算法歌者本篇专栏:[C]您的支持,是我的创作动力。 文章目录 0、总结1、操作符的分类2、二进制和进制转换2.1、2进制转10进制2.2、10进制转2进制2.3、2进制转8进制和16进制 3、原码、反码、补码4、移位操作符4.1 左移操作符4.2 右移操…...

MySQL篇之对MySQL进行参数优化,提高MySQL性能
1. MySQL参数优化说明 MySQL 参数调优是提高数据库性能的重要手段之一。通过调整 MySQL 的配置参数,可以优化查询速度、提升并发处理能力、减少资源消耗等。 MySQL 的性能优化涉及到多个方面,包括内存管理、磁盘 I/O、查询优化、连接管理、复制配置等。…...

Vue 3 的 keep-alive 及生命周期钩子
在 Vue 3 中,keep-alive 是一个内置组件,用于提高性能和减少不必要的组件销毁与重建。它与组件的生命周期紧密相关,特别是在动态组件和路由切换场景下,能够缓存组件的状态并避免重新渲染。 而 onActivated 和 onDeactivated 是 …...

ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)解决天坑问题及加速pip下载
AI修复老照片,试试吧,不一定好~~哈哈 2023年4月曾用过ComfyUI,当时就感慨这个工具和虚幻的蓝图很像,以后肯定是专业人玩的。 2024年我写代码去了,AI做图没太关注,没想到,现在ComfyUI真的变成了工…...

OpenEuler学习笔记(十一):OpenEuler上搭建LAMP环境
LAMP环境指的是Linux、Apache、MySQL(或MariaDB)和PHP的组合,下面为你介绍在OpenEuler上搭建LAMP环境的详细步骤: 1. 系统更新 首先要更新系统中的软件包,保证系统处于最新状态。 sudo dnf update -y2. 安装Apache…...

Mongodb 慢查询日志分析 - 1
Mongodb 慢查询日志分析 使用 mloginfo 处理过的日志会在控制台输出, 显示还是比较友好的. 但是如果内容较大, 就不方便查看了, 如果可以导入到 excel 就比较方便筛选/排序. 但是 mloginfo 并没有提供生成到 excel 的功能. 可以通过一个 python 脚本辅助生成: import pandas…...

MySQL面试题2025 每日20道【其四】
1、你们生产环境的 MySQL 中使用了什么事务隔离级别?为什么? 中等 在生产环境中,MySQL数据库的事务隔离级别通常由开发团队或数据库管理员根据应用的需求来设定。MySQL支持四种标准的事务隔离级别: 读未提交(Read Unc…...

微服务学习-Nacos 注册中心实战
1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心? 服务与服务之间调用需要有服务发现功能;例如订单服务调用库存服务,库存服务如果有多个,订单服务到底调用那个库存服务呢(负载均衡器)࿰…...

k8s服务StatefulSet部署模板
java 服务StatefulSet部署模板 vim templates-test.yamlapiVersion: apps/v1 kind: StatefulSet metadata:labels:app: ${app_labels}name: ${app_name}namespace: ${app_namespace} spec:replicas: ${app_replicas_count}selector:matchLabels:app: ${app_labels}template:la…...

07 区块链安全技术
概述 区块链的安全特性 区块链解决了在不可靠网络上可靠地传输信息的难题,由于不依赖与中心节点的认证和管理,因此防止了中心节点被攻击造成的数据泄露和认证失败的风险。 区块链安全防护的三大特点 共识机制代替中心认证机制数据篡改“一发动全身”…...

Adobe的AI生成3D数字人框架:从自拍到生动的3D化身
一、引言 随着人工智能技术的发展,我们见证了越来越多创新工具的出现,这些工具使得图像处理和视频编辑变得更加智能与高效。Adobe作为全球领先的创意软件公司,最近推出了一项令人瞩目的新技术——一个能够将普通的二维自拍照转换成栩栩如生的三维(3D)数字人的框架。这项技…...

dfs专题四:综合练习
key:画出决策树(就是找个简单例子模拟一下的树状决策图) dfs传参 or 全局变量: int, double等常量/比较小的变量,可以dfs参数传递vector等线性O(N)变量,要用全局变量 回溯&#x…...

【线性代数】列主元法求矩阵的逆
列主元方法是一种用于求解矩阵逆的数值方法,特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵,然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤: [精确算法] 列主元高斯消元法 步骤 1&am…...

大写——蓝桥杯
1.题目描述 给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母转换成大写字母后将字符串输出。 输入描述 输入一行包含一个字符串。 输出描述 输出转换成大写后的字符串。 输入输出样例 示例 输入 LanQiao输出 LANQIAO评测用例规模与约定 对…...

HTML `<head>` 元素详解
在 HTML 文档中,<head> 元素是一个非常重要的部分,它包含了文档的元数据(metadata)和其他与文档相关的信息。虽然 <head> 中的内容不会直接显示在网页上,但它对网页的行为、样式和搜索引擎优化(…...

一文速通stack和queue的理解与使用
CSTL之stack和queue 1.stack1.1.stack的基本概念1.2.stack的接口 2.queue2.1.queue的基本概念2.2.queue的接口 3.priority_queue3.1.priority_queue的基本概念3.2.priority_queue的接口3.3.仿函数 4.容器适配器5.deque5.1.deque的简单了解5.2.deque的优缺点 🌟&…...

Antd React Form使用Radio嵌套多个Select和Input的处理
使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理,需要多层嵌套和处理默认事件和冒泡,具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…...

Vue - toRefs() 和 toRef() 的使用
一、toRefs() 在 Vue 3 中,toRefs()可以将响应式对象的属性转换为可响应的 refs。主要用于在解构响应式对象时,保持属性的响应性。 1. 导入 toRefs 函数 import { toRefs } from vue;2. 将响应式对象的属性转换为 ref const state reactive({count: 0,message:…...

Python3 OS模块中的文件/目录方法说明九
一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法:os.pipe() 方法、os.popen() 方法。 二. Python3 OS模块中的文件/目录方法 1. os.pipe() 方法 os.pipe() 方法用于创建一个管道, 返回…...

OpenCV文字绘制支持中文显示
OpenCV版本:4.4 IDE:VS2019 功能描述 OpenCV绘制文本的函数putText()不支持中文的显示,网上很多方法推荐的都是使用FreeType来支持,FreeType是什么呢?FreeType的官网上有介绍 FreeType官网 https://www.freetype.or…...

opengrok_windows_多工程环境搭建
目录 多工程的目录 工程代码下载和log配置 工程的索引 工程部署 工程测试 参考列表 多工程的目录 工程代码下载和log配置 工程代码下载 在每个工程的src目录下,下载工程代码,以下载pulseaudio的代码为例。 git clone gitgithub.com…...

基于ollama,langchain,springboot从零搭建知识库三【解析文档并存储到向量数据库】
安装环境 安装pgvector,先设置docker镜像源: vim /etc/docker/daemon.json {"registry-mirrors": ["https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com","https://mirror.ccs.tencentyun.com",&…...

Elasticsearch 和arkime 安装
安装一定要注意版本号,不然使用不了 这里Ubuntu使用ubuntu-20.04.6-desktop-amd64.iso elasticsearch这里使用Elasticsearch 7.17.5 | Elastic arkime这里使用wget https://s3.amazonaws.com/files.molo.ch/builds/ubuntu-20.04/arkime_3.4.2-1_amd64.deb 大家想…...

git回退
git回退 1、未使用 git add 缓存代码时 git checkout –- filepathname 放弃单个文件的修改 git checkout . 放弃所有的文件修改 此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不…...

pytest+playwright落地实战大纲
前言 很久没有更新博客,是因为在梳理制作Playwright测试框架实战相关的课程内容。现在课程已经完结,开个帖子介绍下这门课程(硬广, o(〃^▽^〃)o) 课程放在CSDN学习频道, 欢迎关注~ PyTestPl…...

01-硬件入门学习/嵌入式教程-CH340C使用教程
前言 CH340C广泛应用于DIY项目和嵌入式开发中,用于USB数据转换和串口通信。本文将详细介绍CH340C的基本功能、引脚接线及使用方法。 CH340C简介 CH340C是一款USB转TTL电平转换器,可以将电脑的USB数据转换成串口数据,方便与单片机ÿ…...

小试牛刀调整Prompt,优化Token消耗
在上一篇文章 荒腔走板Mac电脑本地部署 LLM 中介绍过本地部署大模型之后,可以通过定制 prompt 来实现 domain 提取等各种各样的需求。 但是实际上,部署本地大模型 这种方式对于个人开发者来说实在是不太友好。一方面需要投入大量资金确保设备的算力足够支…...