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_scoreprint(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 snsfile_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)

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

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

相关文章

大数据比赛-环境搭建(二)

一、ubuntu安装google 1、下载google的Linux安装版 链接:https://pan.baidu.com/s/1w4Hsa1wbJDfC95fX2vU_1A 提取码:xms6 或者:Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) …

AI办公自动化:用kimi批量把word转换成txt文本

在Kimichat中输入提示词: 你是一个Python编程专家,要完成一个Python脚本编写的任务,具体步骤如下: 打开文件夹:F:\aword 读取里面docx格式的word文档, 提取word文档中的第一行文字作为txt文本文档的标题…

【Python】使用requests采集数据存入mysql或文件

一、什么是requests requests包是一个使用Python编写的HTTP请求库,使得发送HTTP请求和处理HTTP响应变得更加简单。以下是对requests包的详细介绍: 用途: requests包主要用于与HTTP交互,能够发送HTTP请求和处理HTTP响应。它支持处…

软考--试题六--抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory) 意图 提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类 结构 适用性 1、一个系统要独立于它的产品的创建、组合和表示时 2、一个系统要由多个产品系统中的一个来配置时 3、当要强调一系列相关的产品对象的设…

【Linux系统编程】第十九弹---进程状态(下)

​​​​​​​ ✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、僵尸进程 2、孤儿进程 3、运行状态 4、阻塞状态 5、挂起状态 6、进程切换 总结 1、僵尸进程 上一弹…

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代,创业似乎成为了越来越多人的梦想。然而,传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程,让许多普通人望而却步。然而,现在有一种轻资产短视频带货项目正在悄然兴起,它以其低…

apifox接口调试工具的使用,代替postman

官网链接:Apifox (代替postman工具) 下载apifox工具 使用步骤 安装本地下载的apifox.exx 登录apifox 接口调用

从“制造”到“智造”:“灯塔”经验助力中国制造业转型升级-转载

作者:Karel Eloot,侯文皓,Francisco Betti,Enno de Boer和Yves Giraud 作为中国实体经济的主体,制造业是推动中国经济发展乃至全球制造业持续增长的重要引擎。站在历史与未来交汇的新起点上,中国制造业将背…

2024.05.14 Diffusion 代码学习笔记

配环境 我个人用的是Geowizard的环境:https://github.com/fuxiao0719/GeoWizard。 出于方便考虑,用的pytorch官方的docker容器,因此python版本(3.10)和原作者(3.9)不同,其余都是一…

【极简】docker常用操作

镜像images是静态的 容器container是动态的,是基于镜像的,类似于一个进程。 查看docker images: docker images 或者docker image ls 查看docker container情况:docker ps -a,-a意思是--all 运行一个container: doc…

DCMM(数据管理能力成熟度模型)对企业的价值

随着大数据时代的来临,数据已成为企业发展的重要驱动力。为了有效地管理和利用数据,企业需要建立一套完善的数据管理体系,而DCMM(数据管理能力成熟度模型)正是这样一个帮助企业构建和优化数据管理能力的框架。 DCMM结构…

LeetCode 235. 二叉搜索树的最近公共祖先

LeetCode 235. 二叉搜索树的最近公共祖先 1、题目 题目链接:235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表…

表的创建与操作表

1. 创建表 创建表有两种方式 : 一种是白手起家自己添,一种是富二代直接继承. 2. 创建方式1 (1). 必须具备条件 CREATE TABLE权限存储空间 (2). 语法格式 CREATE TABLE IF NOT EXISTS 表名(字段1, 数据类型 [约束条件] [默认值],字段2, 数据类型 [约束条件] [默…

C++ 结构体内存对齐

定义了两个结构体 typedef struct Cmd {uint8_t ua;uint8_t ub;uint8_t uc;uint32_t ue; } Cmd_t;typedef struct Cmd_tag {uint8_t value;uint8_t data[1]; // 将 data 定义为指向 Cmd_t 结构体的指针 } tag_t;在实际使用中,看见前人的代码是,new 一块内…

ArcGIS arcpy代码工具——关于标识码的那些事(查找最大标识码、唯一性检查、重排序、空值赋值)

系列文章目录 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…

C 深入指针(4)

目录 一、字符指针变量 1 初始化 2 与字符串数组的区别 二、数组指针变量 1 初始化 2 二维数组传参本质 三、函数指针变量 1 初始化 2 用法 四、typedef关键字 五、函数指针数组 一、字符指针变量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年4月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

利用远程控制软件FinalShell远程连接虚拟机上的Linux系统(Windows)

一. VMware Workstation 安装CentOS Linux操作系统 传送门&#xff1a;VMware Workstation 安装CentOS Linux操作系统 1.右键打开终端 2.输入ifconfig 找到ens33对应 inet的id&#xff0c;这个就是虚拟机的ip地址图中所示为&#xff1a;192.168.5.128 3.打开finalshell 如…

YOLOv5改进 | Neck | 添加双向特征金字塔BiFPN【小白轻松上手 | 论文必备】

&#x1f680;&#x1f680;&#x1f680;本专栏所有的改进均可成功执行&#x1f680;&#x1f680;&#x1f680; 尽管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作为一个anchor base的目标检测的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。但是针对不同的数据…

抖店商品详情API接口(产品参数|详情图)

抖店商品详情API接口(产品参数|详情图) 参数仅供参考&#xff1a; {"code": 0,"msg": "调用成功","time": "1715763239","data": {"properties": [{"format": [{"message": [{&q…