sklearn之线性回归——以上证红利指数为例

文章目录

    • 线性回归
      • 概念
      • 使用sklearn实现上证中立指数预测
        • 内置数据集的加载与处理
      • 外部数据集的加载和处理
        • 数据内容
        • 数据加载和处理
      • 开始预测
        • 分割数据集
        • 导入线性回归模型
        • 查看线性回归模型的系数
        • 绘制预测结果
        • 预测效果评估
      • 最终代码

线性回归

线性回归(Linear Regression)模型是最简单的线性模型之一,很具代表性

概念

我们在高中时代其实就学过使用最小二乘法进行线性回归分析

这实际上是统计学部分的内容,会有大量的自变量,或者说解释变量,还有就是对应的因变量,也就是输出结果,回归分析就是找出他们对应的关系,并且使用某个模型描述出来,这样一来给出新的变量,就能利用模型实现预测

这也就是我们一开始介绍机器学习说明的过程,给出输入和输出,找到一个模型T能够很好的拟合这些数据,从而使用T就能预测结果了

从几何层面,回归就是找到具有代表性的直线、曲线、甚至是面,来进行拟合

回归的种类有很多,一元和多元,那么一元其实就是线性回归。我们这里先讨论线性回归,而且我们假设因变量和自变量之间是满足线性关系的,也就是 y = w 0 + w 1 x y=w_0+w_1x y=w0+w1x

这里的 w 0 w_0 w0 w 1 w_1 w1我们称之为回归系数,我们需要拟合的,求出来的就是这两个权值,一个经典的示意图是这样的

image.png

这里的每一个点就是实际的数据,红色的线是我们拟合出来的,很容易可以看得到,有些点离线近,有些点离线远,我们使用残差(Residual)来描述这里的远和近,也就是误差,简单说就是从点向x轴做垂线与拟合线相交的点的距离就是残差, ϵ = ∣ y ^ i − y i ∣ \epsilon=|\hat y_i-y_i| ϵ=y^iyi

这里的小帽子表示的是预测数据,就是不准的意思,没啥难理解的

那么我们的目标就变成了,要求一条拟合的线,让所有的误差最小

这里的思想就是使用最小二乘法(Ordinary Least Squares,OLS)了,就是要让残差的平方和最小即可,那我们的损失函数就可以变成这样了 H = ∑ i = 1 m ( y ^ i − y i ) 2 = ∑ i = 1 m ( y i − w 1 x i − w 0 ) 2 H=\sum_{i=1}^{m}(\hat y_i-y_i)^2=\sum_{i=1}^{m}(y_i-w_1x_i-w_0)^2 H=i=1m(y^iyi)2=i=1m(yiw1xiw0)2

以上就是求解这两个参数,也就是求一个二元函数 H ( w 0 , w 1 ) H(w_0,w_1) H(w0,w1)的最小值,然后取出对应的 w 0 w_0 w0 w 1 w_1 w1即可

事实上我们也可以利用优化算法(随机梯度下降法、牛顿迭代法)来快速逼近最优参数

使用sklearn实现上证中立指数预测

内置数据集的加载与处理

以导入波士顿房价数据集为例

form sklearn.datasets import load_boston

这里的boston可以换成别的数据集

名称数据集
load_boston波士顿房价
load_breast_cancer乳腺癌
load_iris鸢尾花
load_diabetes糖尿病
load_linnerud体能训练
load_wine红酒品类

然后对应的就是数据处理的部分了

boston = load_boston() # boston是一个字典对象,我们可以使用key方法查看他对应的属性值

在取出来字典之后,我们就可以进行数据预处理和分析了

外部数据集的加载和处理

我们首先需要收集数据,这里我们直接在官网可以下载上证红利指数

数据内容

image.png

这里我把所有的非数值类型的数据全部删除了,这里是五年的数据

那么这里的特征值有,开盘,最高,最低,收盘,涨跌,涨跌幅,成交量,成交金额

数据加载和处理

下载之后我们获取到的就是一份表格文件了,下载可能是xlsx格式的,可以另存为csv格式的,方便处理

我这里使用pandas进行读取和预处理工作

import pandas as pd
file_path = './000015perf.csv'

data = pd.read_csv(file_path)

这里使用read_csv直接读取的data是DataFrame类型的数据了

如果我们使用的是内置数据,就要通过pd.DataFrame(boston.data)来转换成DataFrame类型

之后我们可以给他加上标签,数据清洗等操作

# 删除含有缺失值的行
data_clean = data.dropna()

我们直接把有缺失的情况给扔掉

开始预测

分割数据集

正如我们前面所说,我们至少要把整个数据集分割成两部分,训练集和测试集,为了保证数据分割的随机性和专业性,sklearn提供了专门的分割函数,train_test_split

我们直接读取的内容是预测的结果y,我们称之为标签数据,和特征值x,我们称之为特征数据

这个专门的分割函数是要求特征数据和标签数据必须是分开的,我们可以使用pandas的drop方法去除

X = data_clean.drop(columns=['日期Date', '涨跌Change', '涨跌幅(%)Change(%)'])
y = data_clean['涨跌Change']

这里我们删除了日期,因为没啥太大作用,还有可能影响预测结果的涨跌和涨跌幅度,并且把涨跌作为预测的对象

有一个细节是特征数据一般用大写的X,特征值一般用小写的y

接下来就是进行训练集和测试集的分割

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=20)

test_size是表示测试集合所占的比例,random_state表示随机的状态

这里的随机状态其实是相反的意思,就是为了保证某些数据是固定的,因为一旦全随机可能会导致预测不够准确,从而无法调参,而固定下一部分数据作为训练集和测试集的话是提供了一定的稳定性,这种稳定性也方便了调参的进行

导入线性回归模型

在数据分割完成之后,我们就可以导入线性回归模型,训练数据并且进行模型预测了

from sklearn.linear_model import LinearRegression

# 创建线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 使用模型进行预测
y_pred = model.predict(X_test)

在sklearn中,训练模型的方法统称为fit

回归分析属于监督学习,所以fit提供两个参数,前者是特征数据,后者是标签数据

查看线性回归模型的系数

线性回归的核心目的就是找到关键的参数,我们可以通过print直接输出查看每个特征的权值

print("w0 = ", model.intercept_)
print("W = ", model.coef_)

image.png

我们之前所有的特征值去除影响之后共计6个特征,所以至少有6个权值,再加上w0是截距,应该是7个权值

对于这些权值我们也可以做出一些解释,例如第一个权值对应的是开盘价格,那其实说明开盘价格越高跌的概率就越大,第四个是收盘价格,那其实也很好说明问题了

出现这样直白的结果其实是由于我们特征数据类型收集的不够多,或者是不够具备我们想要研究的特征数据

绘制预测结果

我们可以使用matplotlib来进行预测涨跌和实际涨跌的对比

plt.figure(figsize=(10, 6))
sns.regplot(x=y_test.values, y=y_pred, scatter_kws={'color': 'blue'}, line_kws={'color': 'red', 'linewidth': 2})
plt.xlabel('Actual Stock Change')
plt.ylabel('Predicted Stock Change')
plt.title('Seaborn Regression Plot of Actual vs Predicted Stock Change')
plt.grid(True)
plt.show()

image.png

从结果上看基本都集中在直线附近,还是比较准确的

预测效果评估

由于回归分析的目标值是连续的,所以我们不能用准确率来评估,而应该比较预测值和实际值的差值评估,其中均方根误差(root-mean-square error、RMSE)是最常见的评估标准之一

R M S E = ∑ i = 1 n ( P r e d i c t i − A c t u a l i ) 2 n RMSE=\sqrt\frac{\sum_{i=1}^{n}(Predict_i-Actual_i)^2}{n} RMSE=ni=1n(PredictiActuali)2

还有一个是R方分数,表示预测数据和实际数据的相关性,范围是从0到1,越大表示相关性越好

$ R^2 = 1 - \frac{SS_{res}}{SS_{tot}} $
其中:

  • ( S S r e s SS_{res} SSres ) 是残差平方和(Sum of Squares of the Residuals),它衡量了模型预测值与实际值之间的差异。
  • ( S t o t S_{tot} Stot ) 是总平方和(Total Sum of Squares),它衡量了实际值与平均值之间的差异。
    更具体地说,这些平方和的计算方式如下:
    S S r e s = ∑ ( y i − y ^ i ) 2 SS_{res} = \sum (y_i - \hat{y}_i)^2 SSres=(yiy^i)2
    S S t o t = ∑ ( y i − y ˉ ) 2 SS_{tot} = \sum (y_i - \bar{y})^2 SStot=(yiyˉ)2
from sklearn.metrics import mean_squared_error, r2_score

print(f'Mean Squared Error (MSE): {mse}')
print(f'R^2 Score: {r2}')

image.png

当然如果我们想查看线性回归输出的预测涨跌和实际涨跌的对比情况,也可以很容易的实现

df = pd.DataFrame({'实际涨跌':y_test, '预测涨跌':y_pred})
print(df)

image.png

最终代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns

file_path = './000015perf.csv'

data = pd.read_csv(file_path)

# 删除含有缺失值的行
data_clean = data.dropna()

# 删除日期列,因为它对预测可能没有直接作用
X = data_clean.drop(columns=['日期Date', '涨跌Change', '涨跌幅(%)Change(%)'])
y = data_clean['涨跌Change']

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=20)

# 创建线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 使用模型进行预测
y_pred = model.predict(X_test)

# 计算预测的均方误差和R^2分数
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

plt.figure(figsize=(10, 6))
sns.regplot(x=y_test.values, y=y_pred, scatter_kws={'color': 'blue'}, line_kws={'color': 'red', 'linewidth': 2})
plt.xlabel('Actual Stock Change')
plt.ylabel('Predicted Stock Change')
plt.title('Seaborn Regression Plot of Actual vs Predicted Stock Change')
plt.grid(True)
plt.show()

print("w0 = ", model.intercept_)
print("W = ", model.coef_)


print(f'Mean Squared Error (MSE): {mse}')
print(f'R^2 Score: {r2}')

df = pd.DataFrame({'实际涨跌':y_test, '预测涨跌':y_pred})
print(df)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter开发实战-人脸识别相机使用

flutter开发实战-人脸识别相机使用 当需要拍摄的时候,需要检测到人脸再进行后续的操作,这里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 检测人脸face_camera: ^0.0.8iOS端需要设置相关权限 在info.plist文件中&…

数据库出现死锁的解决方法参考

死锁引起的原因一般是多个用户并发访问数据库导致的问题,或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…

YOLOv5 V7.0 - rknn模型的验证 输出精度(P)、召回率(R)、mAP50、mAP50-95

1.简介 RKNN官方没有提供YOLOv5模型的验证工具,而YOLOv5自带的验证工具只能验证pytorch、ONNX等常见格式的模型性能,无法运行rknn格式。考虑到YOLOv5模型转换为rknn会有一定的精度损失,但是需要具体数值才能进行评估,所以需要一个…

【目标检测论文解读复现NO.37】基于改进的 YOLOv8 变电设备红外图像检测

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Python 将Excel转换为多种图片格式(PNG, JPG, BMP, SVG)

目录 安装Python Excel库 使用Python将Excel工作表转换为PNG,JPG或BMP图片 使用Python将Excel特定单元格区域转换为PNG,JPG或BMP图片 使用Python将Excel工作表转换为SVG图片 有时,你可能希望以图片形式分享Excel数据,以防止他…

【C++】string底层的实现原理(简单详细)

前言 本篇文章我将按照C文档库中的模块顺序来实现和讲解其实现原理,我们只讲各板块中常用的 目录 一,Member functions(成员函数) 二、Iterators(迭代器) 三、Capacity(容器) 常…

ElasticSearch集群环境

ElasticSearch集群环境 1、Linux单机 下载地址:LINUX X86_64 (elastic.co) 下载之后进行解压 tar -zxf elasticsearch-7.8.0-linux-x86_64.tar.gz 名字太长了改个名字改成es mv elasticsearch-7.8.0 es因为安全问题,Elasticsearch 不允许 root 用户…

基于单片机的空气质量检测系统设计(51+4G版)-设计说明书

设计摘要: 本设计是基于单片机的空气质量检测系统设计涉及以下主要功能,旨在监测甲烷和一氧化碳的浓度,并在浓度过高时采取相应措施,以确保室内空气质量的安全。该系统使用传感器对甲烷和一氧化碳的浓度进行检测。传感器将收集到…

虚拟化技术 安装和配置StartWind iSCSI目标服务器

一、实验内容 安装StartWind iSCSI目标服务器配置StartWind iSCSI目标服务器 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑,建议4C8G或以上配置已安装vSphere Client已创建虚拟机并在其上安装CentOS6.5StarWind安装介质starwind.…

主机和ubuntu连接

在这里插入图片描述 提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 最近在hw使用Clion连接服务器,就想把自己的电脑配置好,翻出来正点原子的教程,【正点原子】…

Springboot集成Netflix-ribbon、Enreka实现负载均衡-12

Netflix Ribbon简介 Netflix Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。 具体来说,Ribbon是一个客户端负载均衡器,可以在配置文件中列出所有的服务…

Golang | Leetcode Golang题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; func largestRectangleArea(heights []int) int {n : len(heights)left, right : make([]int, n), make([]int, n)for i : 0; i < n; i {right[i] n}mono_stack : []int{}for i : 0; i < n; i {for len(mono_stack) > 0 &&am…

PMOS和NMOS

一. MOS管简介 MOS管是场效应管的一种&#xff0c;主要有两种结构形式&#xff1a;N沟道和P沟道&#xff0c;又根据场效应原理的不同&#xff0c;分为耗尽型&#xff08;当栅压为零时有较大漏极电流&#xff09;和增强型&#xff08;当栅压为零&#xff0c;漏极电流也为零&…

通过物联网管理多台MQTT设备-基于米尔T527开发板

本篇测评由电子工程世界的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-LT527开发板的网关方案测试。 一、系统概述 基于米尔-全志 T527设计一个简易的物联网网关&#xff0c;该网关能够管理多台MQTT设备&#xff0c;通过MQTT协议对设备进行读写操作&#xff0c;…

CMakeLists.txt语法规则:改变行为的变量说明一

一. 简介 前面一篇文章学习了 CMakeLists.txt语法中的 部分常量变量&#xff0c;具体学习提供信息的变量&#xff0c;文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;提供信息的变量说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;提供信息的变量说明二-CSD…

【JavaEE网络】HTTPS详解:从对称与非对称加密到证书认证

目录 HTTPSHTTPS 是什么“加密” 是什么HTTTPS 的工作过程引入对称加密引入非对称加密引入证书完整流程总结 HTTPS HTTPS 是什么 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现…

大数据Scala教程从入门到精通第八篇:Scala在IDEA中编写Hello World

一&#xff1a;Scala在IDEA中编写Hello World object HelloWorld {def main(args: Array[String]): Unit {println("hello world")}}这个对象也单例的。 特殊的Java类库需要import

利用一下Chat-GPT写两段处理字符串的简单样例ABAP程序。这样可以大大提高工作效率。Chat-GPT的能力真是让人震撼。

我让Caht-GPT写两段ABAP 程序&#xff0c;第一段程序要求如下&#xff1a; 判读字符串里面是否含有特殊字符&#xff0c;这里说的特殊字符不包括键盘上能够输入的字符&#xff0c;如果有这样的特殊字符则输出来。 DATA: lv_string TYPE string VALUE 你的字符串,lv_result TYP…

08.2.grafana插件安装

grafana插件安装 官方网站下载地址(可自定义选择版本)&#xff1a; https://grafana.com/grafana/download/6.3.0?pgget&plcmtselfmanaged-box1-cta1 清华源下载grafana的rpm包 https://mirror.tuna.tsinghua.edu.cn/grafana/yum/el7/ 直接命令行安装,或者包下载下来本地…

docker runc升级1.1.12

上传runc-1.1.12制品至中控机 874e970eaa932a97de9888344ae08f24 runc.arm64 将所有节点的runc文件备份 所有节点(包括master+node) vim host [all] 10.1.0.183 ansible_password=Bigdata@Ksyun123 ansible_user=root ansible_port=22 10.1.0.249 ansible_password=Bigdata…