亚太杯赛题思路发布(中文版)

news2024/10/7 18:30:10

导读: 本文将继续修炼回归模型算法,并总结了一些常用的除线性回归模型之外的模型,其中包括一些单模型及集成学习器。

保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归、人工神经网络、随机森林回归、多输出随机森林回归、XGBoost回归。

需要面试或者需要总体了解/复习机器学习回归模型的小伙伴可以通读下本文,理论总结加代码实操,有助于理解模型。

本文所用数据说明:所有模型使用数据为股市数据,与线性回归模型中的数据一样,可以做参考,此处将不重复给出。

保序回归

保序回归或单调回归是一种将自由形式的直线拟合到一系列观测值上的技术,这样拟合的直线在所有地方都是非递减(或非递增)的,并且尽可能靠近观测值。

理论规则是

  • 如果预测输入与训练中的特征值完全匹配,则返回相应标签。如果一个特征值对应多个预测标签值,则返回其中一个,具体是哪一个未指定。
  • 如果预测输入比训练中的特征值都高(或者都低),则相应返回最高特征值或者最低特征值对应标签。如果一个特征值对应多个预测标签值,则相应返回最高值或者最低值。
  • 如果预测输入落入两个特征值之间,则预测将会是一个分段线性函数,其值由两个最近的特征值的预测值计算得到。如果一个特征值对应多个预测标签值,则使用上述两种情况中的处理方式解决。
n = len(dataset['Adj Close'])

X = np.array(dataset['Open'].values)

y = dataset['Adj Close'].values

from sklearn.isotonic import IsotonicRegression



ir=IsotonicRegression()

y_ir=ir.fit_transform(X,y)

将拟合过程可视化

红色散点图是原始数据X-y关系图,绿色线为保序回归拟合后的数据X-y_ir关系图。这里以可视化的形式表现了保序回归的理论规则。

lines=[[[i,y[i]],[i,y_ir[i]]] for i in range(n)]

lc=LineCollection(lines)

plt.figure(figsize=(15,6))

plt.plot(X,y,'r.',markersize=12)

plt.plot(X,y_ir,'g.-',markersize=12)

plt.gca().add_collection(lc)

plt.legend(('Data','Isotonic Fit','Linear Fit'))

plt.title("Isotonic Regression")

plt.show(

多项式回归

多项式回归(PolynomialFeatures)是一种用多项式函数作为自变量的非线性方程的回归方法。

将数据转换为多项式。多项式回归是一般线性回归模型的特殊情况。它对于描述曲线关系很有用。曲线关系可以通过平方或设置预测变量的高阶项来实现。

sklearn中的多项式拟合

X = dataset.iloc[ : , 0:4].values

Y = dataset.iloc[ : ,  4].values



from sklearn.preprocessing import PolynomialFeatures

from sklearn.linear_model import LinearRegression



poly=PolynomialFeatures(degree=3)

poly_x=poly.fit_transform(X)



regressor=LinearRegression()

regressor.fit(poly_x,Y)



plt.scatter(X,Y,color='red')

plt.plot(X,regressor.predict(poly.fit_transform(X)),color='blue')

plt.show()

以原始数据绘制X-Y红色散点图,并绘制蓝色的、经过多项式拟合后再进行线性回归模型拟合的直线图。

一元自变量计算三阶多项式
from scipy import *

f = np.polyfit(X,Y,3)

p = np.poly1d(f)

print(p)
            3            2

-6.228e-05x + 0.0023x + 0.9766x + 0.05357
多元自变量的多项式
from sklearn.preprocessing import PolynomialFeatures

from sklearn import linear_model

X = np.array(dataset[['Open''High''Low']].values)

Y = np.array(dataset['Adj Close'].values)



Y = Y.reshape(Y.shape[0], -1)

poly = PolynomialFeatures(degree=3)

X_ = poly.fit_transform(X)

predict_ = poly.fit_transform(Y)
Pipeline形式
from sklearn.pipeline import Pipeline

X = np.array(dataset['Open'].values)

Y = np.array(dataset['Adj Close'].values)

X = X.reshape(X.shape[0], -1)

Y = Y.reshape(Y.shape[0], -1)

Input=[('scale',StandardScaler()),('polynomial', PolynomialFeatures(include_bias=False)),('model',LinearRegression())]

pipe = Pipeline(Input)

pipe.fit(X,Y)

yhat = pipe.predict(X)

yhat[0:4]
array([[3.87445269],

       [3.95484371],

       [4.00508501],

       [4.13570206]])

numpy 中的多项式拟合

首先理解nump用于多项式拟合的两个主要方法。

np.poly1d
np.poly1d(c_or_r, 

          r=False, 

          variable=None)

一维多项式类,用于封装多项式上的"自然"操作,以便上述操作可以在代码中采用惯用形式。如何理解呢?看看下面几个例子。

  • c_or_r系数向量
import numpy as np

a=np.array([2,1,1])

f=np.poly1d(a)

print(f)
  2

2 x + 1 x + 1
  • r=False是否反推

表示把数组中的值作为根,然后反推多项式。

f=np.poly1d([2,3,5],r=True)

#(x - 2)*(x - 3)*(x - 5)  = x^3 - 10x^2 + 31x -30

print(f)
   3      2

1 x - 10 x + 31 x - 30
  • variable=None表示改变未知数的字母
f=np.poly1d([2,3,5],r=True,variable='z')

print(f)
   3      2

1 z - 10 z + 31 z - 30
np.polyfit
np.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)

最小二乘多项式拟合。

拟合多项式。返回一个系数'p'的向量,以最小化平方误差的顺序'deg','deg-1',…"0"

推荐使用 <numpy.polynomial.polynomial.Polynomial.fit> 类方法,因为它在数值上更稳定。

下图是以原始数据绘制的蓝色X-Y散点图,以及红色的X分布图。

X = dataset['Open'].values

y = dataset['Adj Close'].values

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

plt.figure(figsize=(10,6))

plt.plot(X_train, y_train, 'bo')

plt.plot(X_test, np.zeros_like(X_test), 'r+')

plt.show()
numpy与sklearn中的多项式回归对比
# numpy

model_one = np.poly1d(np.polyfit(X_train, y_train,1))

preds_one = model_one(X_test)

print(preds_one[:3])

>>> [11.59609048 10.16018804 25.23716889]

# sklearn

from sklearn.linear_model import LinearRegression

model = LinearRegression()

model.fit(X_train.reshape(-11), y_train)

preds = model.predict(X_test.reshape(-11))

preds[:3]

>>> array([11.5960904810.1601880425.23716889])

预测结果是一样的

print("all close?", np.allclose(preds, preds_one))

>>> 'all close? True

结果表明两者相比预测结果时一致的。

多阶多项式效果对比

比较一阶、二阶及三阶多项式拟合,多线性回归模型的效果影响。由图可看出,三条线基本重合,且RMSE相差不大。

model_one = np.poly1d(np.polyfit(X_train, y_train,1))

model_two = np.poly1d(np.polyfit(X_train, y_train, 2))

model_three = np.poly1d(np.polyfit(X_train, y_train, 3))



fig, axes = plt.subplots(12, figsize=(145),sharey=True)

labels = ['line''parabola''nonic']

models = [model_one, model_two, model_three]

train = (X_train, y_train)

test = (X_test, y_test)

for ax, (ftr, tgt) in zip(axes, [train, test]):

    ax.plot(ftr, tgt, 'k+')

    num = 0

    for m, lbl in zip(models, labels):

        ftr = sorted(ftr)

        ax.plot(ftr, m(ftr), '-', label=lbl)

        if ax == axes[1]:

            ax.text(2,55-num, f"{lbl}_RMSE: {round(np.sqrt(mse(tgt, m(tgt))),3)}")

            num += 5

axes[1].set_ylim(-1060)

axes[0].set_title("Train")

axes[1].set_title("Test");

axes[0].legend(loc='best');
绘制类似学习曲线

因低阶多项式效果相差并不明显,因此增大多项式阶数,并以残差平方和为y轴,看模型拟合效果,由图可以看出,随着多项式阶数越来越高,模型出现严重的过拟合(训练集残差平方和降低,而测试集却在上涨)。

results = []

for complexity in [123456,7,89]:

    model = np.poly1d(np.polyfit(X_train, y_train, complexity))

    train_error = np.sqrt(mse(y_train, model(X_train)))

    test_error = np.sqrt(mse(y_test,model(X_test)))

    results.append((complexity, train_error, test_error))

columns = ["Complexity""Train Error""Test Error"]

results_df = pd.DataFrame.from_records(results, 

              columns=columns,

              index="Complexity")

results_df

results_df.plot(figsize=(10,6))

多输出回归

多输出回归为每个样本分配一组目标值。这可以认为是预测每一个样本的多个属性,比如说一个具体地点的风的方向和大小。

多输出回归支持 MultiOutputRegressor 可以被添加到任何回归器中。这个策略包括对每个目标拟合一个回归器。因为每一个目标可以被一个回归器精确地表示,通过检查对应的回归器,可以获取关于目标的信息。因为 MultiOutputRegressor 对于每一个目标可以训练出一个回归器,所以它无法利用目标之间的相关度信息。

支持多类-多输出分类的分类器:

sklearn.tree.DecisionTreeClassifier 

sklearn.tree.ExtraTreeClassifier  

sklearn.ensemble.ExtraTreesClassifier  

sklearn.neighbors.KNeighborsClassifier

sklearn.neighbors.RadiusNeighborsClassifier

sklearn.ensemble.RandomForestClassifier
X = dataset.drop(['Adj Close''Open'], axis=1)

Y = dataset[['Adj Close''Open']]



from sklearn.multioutput import MultiOutputRegressor

from sklearn.svm import LinearSVR



model = LinearSVR()

wrapper = MultiOutputRegressor(model)

wrapper.fit(X, Y)



data_in = [[23.9822.917.007.00, 

            1.621.624.274.25]]

yhat = wrapper.predict(data_in)

print(yhat[0])

>>> [16.72625136 16.72625136]

wrapper.score(X, Y)

多输出K近邻回归

多输出K近邻回归可以不使用MultiOutputRegressor作为外包装器,直接使用KNeighborsRegressor便可以实现多输出回归。

X = dataset.drop(['Adj Close''Open'], axis=1)

Y = dataset[['Adj Close''Open']]

from sklearn.neighbors import KNeighborsRegressor

model = KNeighborsRegressor()

model.fit(X, Y)

data_in = [[23.9822.917.007.00, 

            1.621.624.274.25]]

yhat = model.predict(data_in)

print(yhat[0])

>>> [2.34400001 2.352     ]

model.score(X, Y)

>>> 0.7053689393640217

决策树回归

决策树是一种树状结构,她的每一个叶子结点对应着一个分类,非叶子结点对应着在某个属性上的划分,根据样本在该属性上的不同取值降气划分成若干个子集。

基本原理

数模型通过递归切割的方法来寻找最佳分类标准,进而最终形成规则。CATA树,对回归树用平方误差最小化准则,进行特征选择,生成二叉树。

CATA回归树的生成

在训练数据集所在的空间中,递归地将每个空间区域划分为两个子区域,并决定每个子区域上的输出值,生产二叉树。

选择最优切分变量  和最优切分点  ,求解

遍历  ,对固定的切分变量  扫描切分点  ,使得上式达到最小值的对  ,不断循环直至满足条件停止。

X = dataset.drop(['Adj Close''Close'], axis=1)  

y = dataset['Adj Close'划分训练集和测试集略 

模型实例化

from sklearn.tree import DecisionTreeRegressor  

regressor = DecisionTreeRegressor()  

训练模型

regressor.fit(X_train, y_train)

回归预测

y_pred = regressor.predict(X_test)

df = pd.DataFrame({'Actual':y_test, 'Predicted':y_pred})  

print(df.head(2))
            Actual  Predicted

Date                         

2017-08-09   12.83      12.63

2017-11-14   11.12      11.20

模型评价

from sklearn import metrics 

平均绝对误差

print(metrics.mean_absolute_error(

    y_test, y_pred))  

均方差

print(metrics.mean_squared_error(

    y_test, y_pred))

均方根误差

print(np.sqrt(

    metrics.mean_squared_error(

      y_test, y_pred)))
0.0924680893617

0.0226966010212

0.1506539114039

交叉验证

from sklearn.model_selection import cross_val_score

dt_fit = regressor.fit(X_train, y_train)

dt_scores = cross_val_score(

    dt_fit, X_train, y_train, cv = 5)



print("Mean cross validation score: {}".format(np.mean(dt_scores)))

print("Score without cv: {}".format(dt_fit.score(X_train, y_train)))
Mean cross validation score: 0.99824909037

Score without cv: 1.0

R2

from sklearn.metrics import r2_score



print('r2 score:', r2_score(y_test, dt_fit.predict(X_test)))

print('Accuracy Score:', dt_fit.score(X_test, y_test))
r2 score: 0.9989593390532074

Accuracy Score: 0.9989593390532074

aa4e9d52239f4bf9b3401d87c2955efe.jpg

亚太杯赛题思路发布(中文版)icon-default.png?t=N7T8https://mbd.pub/o/bread/ZpeZm5dp

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

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

相关文章

3d模型里地毯的材质怎么赋予?---模大狮模型网

在进行3D建模时&#xff0c;赋予地毯逼真的材质是营造现实感和增强场景氛围的重要步骤。模大狮将介绍在常见的3D建模软件中&#xff0c;如何有效地为地毯赋予各种材质&#xff0c;以及一些实用的技巧和注意事项。 一、选择合适的地毯材质 在3D建模中&#xff0c;地毯的材质选择…

【ai】tx2 nx: trition client安装nvidia-pyindex 一直失败

系统版本的pip和python虚拟环境的pipyolov4-triton-tensorrt的master分支 官方client jetson:pip3 install --user nvidia-pyindex 不成功啊 这个是让nvidia-pyindex 拉取nvidia@tx2-nx:~$ pip3 install --user nvidia-pyindex Collecting nvidia-pyindexDownloading https://…

center()方法——字符串居中填充

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 字符串对象的center()方法用于将字符串填充至指定长度&#xff0c;并将原字符串居中输出。center()方法的语法格式如下&#xff1a; str.…

用Python将PowerPoint演示文稿转换到图片和SVG

PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具&#xff0c;被广泛应用于教育、商务汇报及个人项目展示等领域。然而&#xff0c;面对不同的分享场景与接收者需求&#xff0c;有时需要我们将PPT内容以图片形式保存与传播。这样能够避免软件兼容性的限制&#x…

使用Colly库进行高效的网络爬虫开发

引言 随着互联网技术的飞速发展&#xff0c;网络数据已成为信息获取的重要来源。网络爬虫作为自动获取网页内容的工具&#xff0c;在数据分析、市场研究、信息聚合等领域发挥着重要作用。本文将介绍如何使用Go语言中的Colly库来开发高效的网络爬虫。 什么是Colly库&#xff1…

笔记本电脑为什么可以链接热点,却无法连接WiFi

① 在开始菜单的搜索栏中&#xff0c;输入 cmd 。 ② 右击上方该程序&#xff0c;选择 以管理员身份运行 ③ 输入&#xff1a;nestsh winsock reset ④ 敲击回车&#xff0c;显示如下页面 ⑤ 再输入 ipconfig/flushdns 回车 ⑥ 然后重启电脑&#xff0c;OVER&#xff01;

MySQL高级-SQL优化- count 优化 - 尽量使用count(*)

文章目录 1、count 优化2、count的几种用法3、count(*)4、count(id)5、count(profession)6、count(null)7、 count(1) 1、count 优化 MyISAM引擎把一个表的总行数存在了磁盘上&#xff0c;因此执行count&#xff08;*&#xff09;的时候会直接返回这个数&#xff0c;效率很高&a…

【python】socket通信代码解析

目录 一、socket通信原理 1.1 服务器端 1.2 客户端 二、socket通信主要应用场景 2.1 简单的服务器和客户端通信 2.2 并发服务器 2.3 UDP通信 2.4 文件传输 2.5 HTTP服务器 2.6 邮件发送与接收 2.7 FTP客户端 2.8 P2P文件共享 2.9 网络游戏 三、python中Socket编…

信息学奥赛初赛天天练-38-CSP-J2021阅读程序-约数个数、约数和、埃氏筛法、欧拉筛法筛素数应用

PDF文档公众号回复关键字:20240628 2021 CSP-J 阅读程序3 1阅读程序(判断题1.5分 选择题3分 共计40分 ) 01 #include<stdio.h> 02 using namespace std; 03 04 #define n 100000 05 #define N n1 06 07 int m; 08 int a[N],b[N],c[N],d[N]; 09 int f[N],g[N]; 10 11 …

Linux操作系统学习:day07

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0742、使用 grep 搜索文件内容43、使用 locate 搜索文件44、 vim 的安装和介绍vim的模式 45、命令模式下光标的移动1、保存退出2、代…

昇思MindSpore学习总结四——数据变换Transforms

1、数据变换 数据变换&#xff0c;字面意思&#xff0c;就是将我们在实际项目中获取的数据进行相应的操作&#xff0c;方便后期处理。数据变换的方法很多&#xff0c;例如归一化、标准化等。 为什么要进行数据变换&#xff1f;&#xff08;1&#xff09;我们采集到的数据&#…

Linux——echo命令,管道符,vi/vim 文本编辑器

1.echo 命令 作用 向终端设备上输出字符串或变量的存储数据 格式 echo " 字符串 " echo $ 变 量名 [rootserver ~] # echo $SHELL # 输出变量的值必须加 $ /bin/bash [rootserver ~] # str1" 我爱中国 " # 自定义变量 echo 重定向输出到文件 ec…

简单的本地局域网的前后端接口联调

由于项目被赶进度了&#xff0c;急于前后端联调接口&#xff0c;但是我又没钱买服务器&#xff08;主要我也不会部署&#xff09;&#xff0c;所以我这里就紧急找一个后端的大神朋友请教了一下&#xff1a;苏泽SuZe-CSDN博客 提示&#xff1a;这里不讲后端怎么写接口、前端怎么…

SBTI(科学碳目标)认证是什么?

SBTI认证&#xff0c;全称为“科学基础目标设置倡议”&#xff08;Science-Based Targets initiative&#xff09;认证&#xff0c;是一种广泛认可的企业可持续发展标准。以下是关于SBTI认证的详细解释&#xff1a; 一、认证目标 SBTI认证旨在推动企业采取可持续的经营实践&a…

云原生之使用Docker部署RabbitMQ消息中间件

云原生之使用Docker部署RabbitMQ消息中间件 一、RabbitMQ介绍1.1 RabbitMQ简介1.2 RabbitMQ特点1.3 RabbitMQ使用场景 二、检查Docker环境2.1 检查Docker版本2.2 检查操作系统版本2.3 检查Docker状态 三、下载RabbitMQ镜像四、部署RabbitMQ服务4.1创建挂载目录4.2 运行RabbitMQ…

利用代理IP实现高效大数据抓取的策略与技巧

在当今信息爆炸的时代&#xff0c;数据对于各行各业都至关重要。而数据的获取往往需要通过网络爬取。然而随着网络安全意识的提高和反爬虫机制的加强&#xff0c;传统的数据爬取方式可能会受到限制。在这种情况下&#xff0c;代理IP技术的应用就显得尤为重要。本文将探讨代理IP…

S32K3 --- Wdg(内狗) Mcal配置

前言 看门狗的作用是用来检测程序是否跑飞,进入死循环。我们需要不停地喂狗,来确保程序是正常运行的,一旦停止喂狗,意味着程序跑飞,超时后就会reset复位程序。 一、Wdg 1.1 WdgGeneral Wdg Disable Allowed : 启用此参数后,允许在运行的时候禁用看门狗 Wdg Enable User…

服务器日志事件ID4107:从自动更新 cab 中提取第三方的根目录列表失败,错误为: 已处理证书链,但是在不受信任提供程序信任的根证书中终止。

在查看Windows系统日志时&#xff0c;你是否有遇到过事件ID4107错误&#xff0c;来源CAPI2&#xff0c;详细信息在 http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab 从自动更新 cab 中提取第三方的根目录列表失败&#xff0c;…

使用自定义的shiro密码匹配器CredentialsMatcher完成密码验证

今天突然想研究一下shiro怎么匹配用户的密码。 我们使用shiro的API登录时&#xff0c;会先创建一个令牌对象&#xff0c;而经常用的令牌对象是UsernamePasswordToken&#xff0c;把用户输入的用户名和密码作为参数构建一个UsernamePasswordToken&#xff0c;然后通过Subject.l…

爆款短视频素材库有哪些?分享几个容易火的视频素材网站

当今自媒体时代&#xff0c;每位内容创作者都渴望制作出下一个爆款短视频。你是否在寻找那些能让你的视频迅速蹭热度的顶级素材库&#xff1f;本文将为你介绍几个视频素材库&#xff0c;它们或许能成为你成功的秘密武器。首先要提的&#xff0c;自然是著名的国内素材库——蛙学…