[Python中常用的回归模型算法大全:从线性回归到XGBoost]

文章目录

    • 概要
    • 保序回归:理论与实践
    • 多项式回归:探索数据曲线关系
    • 多输出回归的示例

概要

在数据科学和机器学习领域,回归分析是一项关键任务,用于预测连续型变量的数值。除了传统的线性回归模型外,Python提供了丰富多样的回归模型算法,适用于各种复杂的数据关系。本文将深入探讨这些回归模型,并介绍一系列常用的非线性回归方法。我们将涵盖多种模型,包括保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归、人工神经网络、随机森林回归、多输出随机森林回归以及XGBoost回归。这些模型不仅包括了单一模型,还包括了一些集成学习器,可以有效地处理各种回归问题。通过学习和理解这些模型,我们可以更好地选择和应用适合特定数据集的回归算法,提高预测准确性,实现更精准的数据分析和预测。

保序回归:理论与实践

保序回归,又称为单调回归,是一种强大的数据建模技术,用于处理具有自然排序特性的数据。该技术的核心目标是在拟合的过程中保持预测函数的单调性,即在所有点上保持非递减(或非递减)性质,并且尽可能地靠近观测值。
理论背景

保序回归遵循以下规则:

如果预测输入与训练中的特征值完全匹配,则返回相应标签。
如果一个特征值对应多个预测标签值,返回其中一个,具体选择未指定。
如果预测输入高于或低于所有训练特征值,返回最高或最低特征值对应标签。
如果预测输入落入两个特征值之间,预测结果将是一个分段线性函数,由两个最近特征值的预测值计算得到。
import pandas as pd
import numpy as np
# 假设你的数据保存在一个CSV文件中,可以使用pandas读取数据
dataset = pd.read_csv('your_dataset.csv')
n = len(dataset['Adj Close'])
X = np.array(dataset['Open'].values)
y = dataset['Adj Close'].values
from sklearn.isotonic import IsotonicRegressionir = IsotonicRegression()
y_ir = ir.fit_transform(X, y)# 可视化
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()

在这里插入图片描述

在图中,红色散点代表原始数据点(X-y关系图),绿色线表示保序回归拟合后的数据点(X-y_ir关系图)。这种可视化方式生动展示了保序回归的理论规则。通过这个例子,我们可以更好地理解和应用保序回归,处理那些具有自然排序关系的数据集,提高预测的准确性和可解释性。

多项式回归:探索数据曲线关系

多项式回归是一种非线性回归方法,它允许我们通过引入预测变量的高阶项,更好地拟合曲线关系。与简单线性回归不同,多项式回归能够处理更为复杂的数据模式,因此在描述曲线关系时非常有用。
使用sklearn进行多项式拟合

在这个例子中,我们使用了sklearn库中的PolynomialFeatures进行数据的多项式转换,并使用LinearRegression进行拟合。
数据准备:我们从数据集中提取自变量(特征)X 和因变量(目标)Y。

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

多项式转换:使用PolynomialFeatures将数据转换为多项式形式,这里我们选择了3次多项式。

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3)
poly_x = poly.fit_transform(X)

拟合模型:使用LinearRegression拟合多项式转换后的数据。

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(poly_x, Y)

可视化结果:绘制原始数据的X-Y关系散点图,并在同一图中绘制多项式拟合后的曲线。

plt.scatter(X, Y, color='red')
plt.plot(X, regressor.predict(poly.fit_transform(X)), color='blue')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Polynomial Regression')
plt.show()

展示了两种不同类型的多项式回归方法。第一部分是使用numpy中的polyfit和poly1d进行一元自变量的三阶多项式拟合。第二部分则是使用sklearn中的PolynomialFeatures和Pipeline进行多元自变量的三阶多项式拟合。
一元自变量计算三阶多项式

from scipy import *
f = np.polyfit(X,Y,3)
p = np.poly1d(f)
print(p)

-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]])

这部分代码中,使用了Pipeline来实现多元自变量的三阶多项式拟合。首先,对特征进行标准化(StandardScaler),然后使用PolynomialFeatures将特征转换为三阶多项式特征,最后使用LinearRegression进行拟合。Pipeline的使用使得数据预处理和模型拟合过程更加清晰和简单。最终,yhat包含了对数据集进行拟合后的预测结果。

在NumPy中,多项式拟合提供了两个主要的方法:np.poly1d 和 np.polyfit。这些方法使得多项式操作更加方便和直观。

  1. np.poly1d:一维多项式类

np.poly1d 类用于封装多项式上的自然操作,使得多项式可以像常规数学表达式一样使用。它的使用方法如下:

import numpy as np
a = np.array([2, 1, 1])
f = np.poly1d(a)
print(f)
# 输出:2x^2 + 1x + 1

在这个例子中,我们定义了多项式的系数向量 [2, 1, 1],然后使用 np.poly1d 将其转换为多项式。我们可以像普通函数一样使用这个多项式。

另外,np.poly1d 还允许我们反推多项式,将根转换为多项式:

f = np.poly1d([2, 3, 5], r=True)
print(f)
# 输出:x^3 - 10x^2 + 31x - 30
  1. np.polyfit:最小二乘多项式拟合

np.polyfit 函数用于进行最小二乘多项式拟合,返回拟合多项式的系数。它的使用方法如下:

import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt# 准备数据
X = dataset['Open'].values
y = dataset['Adj Close'].values# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)# 进行多项式拟合
degree = 3  # 指定多项式的次数
coefficients = np.polyfit(X_train, y_train, degree)# 创建拟合多项式函数
fitted_polynomial = np.poly1d(coefficients)# 绘制拟合曲线和数据散点图
plt.figure(figsize=(10, 6))
plt.plot(X_train, y_train, 'bo', label='Training Data')
plt.plot(X_test, y_test, 'r+', label='Testing Data')
plt.plot(X_test, fitted_polynomial(X_test), 'g-', label='Fitted Polynomial')
plt.legend()
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Polynomial Fit using np.polyfit')
plt.show()

在这个例子中,我们使用 np.polyfit 对训练数据进行三阶多项式拟合。然后,我们使用 np.poly1d 创建了拟合多项式函数,最后绘制了拟合曲线(绿色)和训练集(蓝色)以及测试集(红色)的散点图。这样,我们可以直观地看到拟合效果。

NumPy和Scikit-Learn中的多项式回归对比

在机器学习中,多项式回归是一种常用的非线性回归方法。在NumPy和Scikit-Learn中,我们可以使用不同的工具来实现多项式回归。下面我们将比较NumPy和Scikit-Learn中的多项式回归,并通过图形和指标展示它们的效果。

  1. 使用NumPy进行多项式回归
import numpy as np
from sklearn.metrics import mean_squared_error as mse
import matplotlib.pyplot as plt# 一阶多项式拟合
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(1, 2, figsize=(14, 5), sharey=True)
labels = ['线性', '二次', '三次']
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 = 0for 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 += 5axes[1].set_ylim(-10, 60)
axes[0].set_title("训练集")
axes[1].set_title("测试集")
axes[0].legend(loc='best')plt.show()

在这段代码中,我们使用NumPy的np.polyfit和np.poly1d进行一阶、二阶和三阶多项式拟合。然后,我们绘制了拟合曲线和训练/测试数据的散点图,并计算了每个模型的均方根误差(RMSE)。

通过比较不同阶数的多项式拟合,我们可以看到三条曲线基本重合,且RMSE相差不大。这说明在这个特定数据集上,不同阶数的多项式回归模型效果相近。
2. 使用Scikit-Learn进行多项式回归

在Scikit-Learn中,可以使用PolynomialFeatures和LinearRegression组合来进行多项式回归:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline# 定义Pipeline
degree = 3
pipeline = Pipeline([('poly_features', PolynomialFeatures(degree=degree)),('lin_reg', LinearRegression())
])# 拟合模型
pipeline.fit(X_train.reshape(-1, 1), y_train)# 预测
y_pred = pipeline.predict(X_test.reshape(-1, 1))# 计算RMSE
rmse = np.sqrt(mse(y_test, y_pred))
print(f"三阶多项式回归的RMSE: {rmse}")

在这段代码中,我们使用了Scikit-Learn的Pipeline,将PolynomialFeatures和LinearRegression组合起来,实现了三阶多项式回归。通过计算RMSE,我们可以得到该模型在测试集上的性能。

总的来说,无论使用NumPy还是Scikit-Learn,多项式回归都是一种强大的工具,可以用来建模非线性关系。选择适当的阶数非常重要,它直接影响了模型的复杂度和泛化性能。在实际应用中,可以通过交叉验证等方法来选择最优的多项式阶数。\

在多项式回归中,多项式的阶数(复杂度)对模型的性能有着重要影响。通过绘制学习曲线,我们可以直观地看出不同阶数多项式模型在训练集和测试集上的表现,从而选择合适的复杂度。

import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error as mse
import matplotlib.pyplot as plt# 初始化结果列表
results = []# 尝试不同的多项式阶数
for complexity in [1, 2, 3, 4, 5, 6, 7, 8, 9]:# 使用多项式拟合训练集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))# 将结果转换为DataFrame
columns = ["复杂度", "训练误差", "测试误差"]
results_df = pd.DataFrame.from_records(results, columns=columns, index="复杂度")# 绘制学习曲线
results_df.plot(figsize=(10, 6))
plt.xlabel("多项式阶数")
plt.ylabel("均方根误差")
plt.title("多项式回归模型复杂度分析")
plt.show()在这段代码中,我们尝试了多项式的阶数从1到9。对于每个阶数,我们计算了训练集和测试集的均方根误差,并将结果绘制成学习曲线。通过观察学习曲线,我们可以看到随着多项式阶数的增加,训练误差逐渐降低,但测试误差却开始上升。这表明随着模型复杂度增加,模型在训练集上过度拟合,而在测试集上的泛化性能下降。

多输出回归的示例

多输出回归是一种预测每个样本多个目标值的机器学习任务。在这个任务中,我们希望模型能够为每个样本预测多个属性或目标。例如,对于一个特定地点的天气预测,我们可能需要预测风的方向和大小等多个属性。

在Scikit-Learn中,可以使用MultiOutputRegressor来处理多输出回归任务。这个方法可以将任何回归器包装成多输出回归器。在下面的示例中,我们使用LinearSVR回归器,并将其包装成MultiOutputRegressor:

from sklearn.multioutput import MultiOutputRegressor
from sklearn.svm import LinearSVR# 准备输入特征和多个目标值
X = dataset.drop(['Adj Close', 'Open'], axis=1)
Y = dataset[['Adj Close', 'Open']]# 创建LinearSVR回归器
model = LinearSVR()# 将LinearSVR包装成MultiOutputRegressor
wrapper = MultiOutputRegressor(model)# 训练多输出回归模型
wrapper.fit(X, Y)# 准备新的输入数据
data_in = [[23.98, 22.91, 7.00, 7.00, 1.62, 1.62, 4.27, 4.25]]# 预测多个目标值
yhat = wrapper.predict(data_in)# 打印预测结果
print(yhat[0])
# 输出: [16.72625136 16.72625136]# 计算模型的得分(可以根据具体任务选择合适的评估指标)
score = wrapper.score(X, Y)
print("模型得分:", score)

在这个示例中,我们使用MultiOutputRegressor将LinearSVR包装成多输出回归器,并使用给定的输入数据进行预测。然后,我们计算了模型的得分,得分越高代表模型在训练数据上的拟合程度越好。需要注意的是,选择合适的回归器和评估指标对于多输出回归任务非常重要,具体选择应根据任务的特性和数据的分布情况进行。

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

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

相关文章

一文带你GO语言入门

什么是go语言? Go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言的主要特点包括:- 简洁和简单 - 语法简单明快,易于学习和使用 特点 高效 编译速度快,执行效率高 并发支持 原生支持并发,利用goroutine实现高效的并发…

小程序canvas层级过高真机遮挡组件的解决办法

文章目录 问题发现真机调试问题分析问题解决改造代码效果展示 问题发现 在小程序开发中需要上传图片进行裁剪&#xff0c;在实际真机调试中发现canvas层遮挡住了生成图片的按钮。 问题代码 <import src"../we-cropper/we-cropper.wxml"></import> <…

面试总结分享:25道数据库测试题

1&#xff09;什么是数据库测试&#xff1f; 数据库测试也称为后端测试。数据库测试分为四个不同的类别。数据完整性测试 数据有效性测试 数据库相关的性能 测试功能&#xff0c;程序和触发器 2&#xff09;在数据库测试中&#xff0c;我们需要正常检查什么&#xff1f; 通常&a…

VBA技术资料MF71:查找所有空格并替换为固定字符

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

Typora +Picgo 搭建个人笔记

文章目录 Typora Picgo 搭建个人笔记一、Picgo Github 搭建图床1.基础设置2. 将配置导出&#xff0c;方便下次使用 二、Typora&#xff1a;设置 &#xff1a;1. 基本设置2. 导出自动提交3. 备份图片 Typora Picgo 搭建个人笔记 typora 下载地址&#xff1a; https://zahui.fan…

论文浅尝 | 深度神经网络的模型压缩

笔记整理&#xff1a;闵德海&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/abs/1412.6550 动机 提高神经网络的深度通常可以提高网络性能&#xff0c;但它也使基于梯度的训练更加困难&#xff0c;因为更深的网络往往更加强的非线…

新业务场景如何个性化配置验证码?

验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身份核验的功能&#xff0c;在保障账户安全方…

DH48WK 温控器参数设置

北京东昊力伟科技有限责任公司 温控仪、温度控制器 产品特点&#xff1a; 可外接温度传感器Pt100、Cu50、K、E、J、N、T、R、S、B兼容输入&#xff1b;PID控制输出、位式控制输出、继电器报警输出&#xff1b;控温能满足设定温度值的0.2℃&#xff1b;既可用于加热控制、也可…

Sectigo OV通配符1590元

通配符SSL证书是一种特殊的SSL证书&#xff0c;它能够为多个域名提供加密保护&#xff0c;这种证书可以用于保护一个主域名及其所有子域名&#xff0c;适合子域名比较多的个人或者企事业单位使用。通配符SSL证书既节省了管理证书的时间&#xff0c;又减少了购买SSL证书的成本&a…

STM32驱动GY-39监测环境温度,湿度,大气压强,光强度

目录 模块简介模块测试接线代码测试现象 总结 模块简介 GY-39 是一款低成本&#xff0c;气压&#xff0c;温湿度&#xff0c;光强度传感器模块。工作电压 3-5v&#xff0c;功耗小&#xff0c;安装方便。 其工作原理是&#xff0c;MCU 收集各种传感器数据&#xff0c;统一处理&…

Ant Eclipse插件使用

Eclipse默认带了ant插件 编辑build.xml文件给出提示 编辑的时候&#xff0c;会给出提示&#xff0c;方便编辑&#xff1a; 将鼠标放在属性上方&#xff0c;会将属性的值显示出来&#xff1a; 在Eclipse中运行ant 运行默认的target build.xml文件的内容如下&#xff0c;…

【计算机网络】网络原理

目录 1.网络的发展 2.协议 3.OSI七层网络模型 4.TCP/IP五层网络模型及作用 5.经典面试题 6.封装和分用 发送方(封装) 接收方(分用) 1.网络的发展 路由器&#xff1a;路由指的是最佳路径的选择。一般家用的是5个网口&#xff0c;1个WAN口4个LAN口(口&#xff1a;端口)。可…

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…

七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

一&#xff1a;排序的概念及引入 1.1 排序的概念 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在…

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

![请 https://cloud.tencent.com/act/cps/redirect?redirect2446&cps_key2e531299bf7e92946df4c3162a81b552&fromconsole

详解cv2.addWeighted函数【使用 OpenCV 添加(混合)两个图像-Python版本】

文章目录 简介函数原型代码示例参考资料 简介 有的时候我们需要将两张图片在alpha通道进行混合&#xff0c;比如深度学习数据集增强方式MixUp。OpenCV的addWeighted提供了相关操作&#xff0c;此篇博客将详细介绍这个函数&#xff0c;并给出代码示例。&#x1f680;&#x1f6…

数据结构--B树

目录 回顾二叉查找树 如何保证查找效率 B树的定义 提炼 B树的插入和删除 概括B树的插入方法如下 B树的删除 导致删除时&#xff0c;结点不满足关键字的个数范围时&#xff08;需要借&#xff09; 如果兄弟不够借&#xff0c;需要合体 回顾B树的删除 B树 B树的查找 …

Windows服务器安装php+mysql环境的经验分享

php mysql环境 下载IIS Php Mysql环境集成包,集成包下载地址: 1、Windows Server 2008 一键安装Web环境包 x64 适用64位操作系统服务器:下载地址:链接: https://pan.baidu.com/s/1MMOOLGll4D7Eb5tBrdTQZw 提取码: btnx 2、Windows Server 2008 一键安装Web环境包 32 适…

Halcon中涉及的数字图像十大理论知识

1.图像处理知识 2.图像的灰度变换 3.图像增强 4.图像的几何变换 5.图像分割 6.图像的频域 7.图像的形态学 8.图像的复原 9.运动图像 10.图像配准

【二层环路】交换机二次原路排查思路

以太网交换网络中为了提高网络可靠性&#xff0c;通常会采用冗余设备和冗余链路&#xff0c;然而现网中由于组网调整、配置修改、升级割接等原因&#xff0c;经常会造成数据或协议报文环形转发&#xff0c;不可避免的形成环路。如图1所示&#xff0c;三台设备两两相连就会形成环…