【Python・机器学习】多元回归模型(原理及代码)

news2025/3/1 14:12:17

前言

自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)~(部分讲解会参考知乎等平台)

本文重点:多元回归模型的建立以及在实际语言学数据的处理

1.多元回归分析的基本原理

2.应用条件

3.数据实例以及Python代码

4.结果分析


1.多元回归分析的基本原理

  多元线性回归用于估计两个或多个自变量一个因变量之间的线性关系。

其基本思想是,因变量可以表示为自变量的线性组合,加上一个随机误差项。通过最小二乘法估计回归系数,建立回归方程,可以用于预测和解释变量间的关系。

  1. 左侧蓝色框代表多个自变量(X₁, X₂, X₃, ...)
  2. 右侧橙色框代表因变量(Y)
  3. 连接线上的β₁、β₂、β₃表示回归系数,表示各个自变量对因变量的影响程度
  4. 底部的回归方程:Y = β₀ + β₁X₁ + β₂X₂ + β₃X₃ + ... + ε
    • β₀ 是截距
    • β₁, β₂, β₃ 等是回归系数
    • ε 是误差项

这种关系表明:

  • 每个自变量都可能对因变量产生影响
  • 影响程度由回归系数β的大小决定
  • 所有自变量的影响是综合的、同时存在的
  • 模型中包含误差项(ε),表示存在其他未知或未计入的影响因素

2.应用条件

  • 线性关系:因变量与自变量之间存在线性关系。可通过【散点图】初步判断。
  • 误差项正态性:随机误差项服从均值为0的正态分布。
  • 误差项独立性:随机误差项之间相互独立。
  • 方差齐性:不同自变量水平下,因变量的方差相等。
  • 自变量间无多重共线性:自变量之间不存在精确的线性关系。 

3.数据实例以及Python代码

下面以一个语言教育学的数据为例,探讨多元回归分析的应用。

该数据包含了影响英语成绩的几个因素:学习时间词汇量语法能力阅读理解能力得分。希望建立一个回归模型预测英语成绩

数据实例如下(随机生成)
序号学习时间
(小时/周)
词汇量
(个)
语法能力
(分)
阅读理解
(分)
英语成绩
(分)
17.49188483.9466.2173.87
28.77227392.2272.7786.1
38.91173185.5167.3777.47
49.41215871.5373.8278.53
57.99202382.6669.1177.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.实践意义
  • 教学重点应放在提升阅读理解和语法能力上
  • 单纯增加学习时间的收益可能有限
  • 在预测学生成绩时,需要考虑较大的误差范围

本文展示了多元回归分析的基本实现流程。在实际应用中,还可以使用交叉检验评估模型稳定性。

按需更新!

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

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

相关文章

Vue中设置报错页面和“Uncaught runtime errors”弹窗关闭

文章目录 前言操作步骤大纲1.使用Vue自带的报错捕获机制添加报错信息2.在接口报错部分添加相同机制3.把报错信息添加到Vuex中方便全局使用4.添加报错页面备用5.app页面添加if判断替换报错界面 效果备注:vue项目中Uncaught runtime errors:怎样关闭 前言 在开发Vue项…

Adobe的AI生成3D数字人框架:从自拍到生动的3D化身

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

2025.1.20——四、[强网杯 2019]Upload1 文件上传|反序列化

题目来源:buuctf [强网杯 2019]Upload 1 目录 一、打开靶机,查看信息 二、解题思路 step 1:登陆进去看情况 step 2:大佬来支援——问题在cookie step 3:测试两个思路 1.目录穿越 2.目录扫描 step 4&#xff…

Docker—搭建Harbor和阿里云私有仓库

Harbor概述 Harbor是一个开源的企业级Docker Registry管理项目,由VMware公司开发。‌它的主要用途是帮助用户迅速搭建一个企业级的Docker Registry服务,提供比Docker官方公共镜像仓库更为丰富和安全的功能,特别适合企业环境使用。‌12 Harb…

组播IGMP协议报文介绍

1 IGMP协议 1.1 定义 IGMP(Internet Group Management Protocol)是因特网协议家族中的一个组播协议,它共有三个版本:v1、v2和v3。 IGMPv1中定义了基本的组成员查询和报告过程,IGMPv2在此基础上添加了查询器选举和组…

hedfs和hive数据迁移后校验脚本

先谈论校验方法,本人腾讯云大数据工程师。 1、hdfs的校验 这个通常就是distcp校验,hdfs通过distcp迁移到另一个集群,怎么校验你的对不对。 有人会说,默认会有校验CRC校验。我们关闭了,为什么关闭?全量迁…

性能优化之动态加载

在过去近三十年的职业生涯里,有几年专注于运行时环境的开发与实现。在runtime中,动态加载技术是其中的基石之一。动态加载技术是指在系统运行过程中,根据需要把程序和数据从外存或网络加载到内存中的过程。其中,lazy loading&…

数据从前端传到后端入库过程分析

数据从前端传到后端入库过程分析 概述 积累了一些项目经验,成长为一个老程序员了,自认为对各种业务和技术都能得心应手的应对了,殊不知很多时候我们借助了搜索引擎的能力,当然现在大家都是通过AI来武装自己。 今天要分析的话题是…

【线性代数】列主元法求矩阵的逆

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

LabVIEW太赫兹二维扫描成像系统

使用LabVIEW设计太赫兹二维扫描成像系统。通过LabVIEW平台开发,结合硬件如太赫兹源、平移台、锁相放大器等,实现了高效、精准的成像功能。系统采用蛇形扫描方式,通过动态调整扫描参数,达到优化成像质量的目的。 ​ 项目背景 在非…

Quartus:开发使用及 Tips 总结

Quartus是Altera(现已被Intel收购)推出的一款针对其FPGA产品的综合性开发环境,用于设计、仿真和调试数字电路。以下是使用Quartus的一些总结和技巧(Tips),帮助更高效地进行FPGA项目开发: 这里写目录标题 使用总结TIPS…

Android 自定义View时四个构造函数使用详解

该文章我们以自定义View继承TextView为例来讲解 创建自定义View命名MyTextView,并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…

C#PaddleOCRSharp使用

using PaddleOCRSharp;namespace PaddleOCRSharpDemo {internal class Program{static void Main(string[] args){//中英文模型V3模型OCRModelConfig config null;//OCR参数OCRParameter oCRParameter new OCRParameter();oCRParameter.cpu_math_library_num_threads 6;//预…

vscode配置C/C++环境(详细步骤教程)

本章教程,主要介绍如何在vscode中配置c/c++环境的具体步骤。 一、安装mingw64 链接:https://pan.baidu.com/s/1fwS-CwC7dgIYJTanaINOhA?pwd=rdks 提取码:rdks 下载之后,配置将mingw64添加到系统环境变量中。 二、安装vscode插件 需要在vscode插件商店,安装c/c++插件 三、配…

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全

RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具,采用先进的 WinUI 3 框架开发,以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观,还提供了多样化的系统优化选项,旨在帮助用户最大化设备…

JAVA:Spring WebClient 的应用指南

1、简述 随着微服务架构的普及,服务间的 HTTP 通信需求也越来越多。Spring 提供的 WebClient 是 RestTemplate 的替代方案,支持响应式编程,具有非阻塞的特点,非常适合处理高并发的 HTTP 请求。本文将介绍 WebClient 的基本用法及…

如何给自己的域名配置免费的HTTPS How to configure free HTTPS for your domain name

今天有小伙伴给我发私信,你的 https 到期啦 并且随手丢给我一个截图。 还真到期了。 javapub.net.cn 这个网站作为一个用爱发电的编程学习网站,用来存编程知识和面试题等,平时我都用业余时间来维护,并且还自费买了服务器和阿里云…

深度学习 Pytorch 动态计算图与梯度下降入门

在上节末尾我们发现autograd.grad函数可以灵活进行函数某一点的导数和偏导数的运算,但微分运算只是AutoGrad模块中的一小部分功能,本节将继续讲解这个模块的其他常用功能,并在此基础上介绍另一个常用优化算法:梯度下降算法。 imp…

gitlab使用多数据库

1. 说明 默认情况下,GitLab 使用一个单一的应用数据库,称为主数据库。为了扩展 GitLab,您可以将 GitLab 配置为使用多个应用数据库。 设置多个数据库后,GitLab 将使用第二个应用数据库用于 CI/CD 功能,称为 CI 数据库…

Docker网段和服务器ip冲突导致无法访问网络的解决方法

若宿主机所在网络的网段为172.[17-31].xx.xx,则会与Docker本身内部网络间出现冲突,此时需要重新配置Docker默认地址池 一:查看docker的默认网段 route 二:修改docker的默认网段 etc/docker/daemon.json文件增加修改网段信息 {…