IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 多元输出回归模型 -> 正文阅读

[数据结构与算法]多元输出回归模型

多元输出回归模型

定义

多元输出回归是指在给出输入示例的情况下涉及预测两个或多个目标变量的回归问题。

回归是指涉及预测数值的预测建模问题。

例如,预测大小,重量,数量,销售数量和点击次数是回归问题。通常,在给定输入变量的情况下预测单个数值。

一些回归问题需要预测两个或多个数值。例如,预测x和y坐标。

示例

示例1:在给定输入的情况下预测坐标,例如预测x值和y值。

示例2:多步时间序列预测,其中涉及预测给定变量的多个未来时间序列。

说明

许多机器学习算法都是为预测单个数值而设计的,简称为回归。一些算法确实支持内在的多输出回归,例如线性回归和决策树。还有一些特殊的解决方法,可用于包装和使用那些本来不支持预测多个输出的算法

本文目标与结构

了解以下内容:

  • 机器学习中的多输出回归问题
  • 如何开发本质上支持多输出回归的机器学习模型
  • 如何开发包装器模型,以允许固有的不支持多输出的算法适用于多输出回归问题
1.多输出回归问题

(1)检查 Scikit-learn 版本

(2)多输出回归测试问题

2.固有的多输出回归算法

(1)用于多输出回归的线性回归

(2)多输出回归的k最近邻

(3)多输出回归的随机森林

(4)使用交叉验证评估多输出回归

3.包装器多输出回归算法

(1)每个输出的单独模型(MultiOutputRegressor)

(2)每个输出的链接模型(RegressorChain)

有多种处理多输出回归的策略,本文将探讨其中的一些策略。

1.检查 Scikit-learn 版本

首先,确认已安装了 scikit-learn 库。

本文中探索的某些模型需要该库的较新版本。

# 检查sklearn版本
import sklearn
print(sklearn.__version__)
0.23.2

2.多输出回归测试问题

定义一个测试问题,以用来演示不同的建模策略。

使用make_regression()函数为多输出回归创建测试数据集。

将生成具有10个输入特征的1,000个示例,其中五个将是冗余的,另外五个将提供有效信息,此外包含两个目标变量。

  • 问题输入:10个数值型特征。
  • 问题输出:2个数值型特征。
# sklearn.datasets中的多输出回归测试问题
from sklearn.datasets import make_regression
# 创建数据集
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2,random_state=1)
# 查看数据shape
print(X.shape, y.shape)
(1000, 10) (1000, 2)

3.固有的多输出回归算法

一些回归机器学习算法直接支持多个输出。

这包括在scikit-learn库中实现的大多数流行的机器学习算法,例如:

  • 线性回归
  • K邻近回归
  • 决策树回归
  • 随机森林回归
1.用于多输出回归的线性回归
# 代码
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression

# 创建数据集
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)

# 定义模型
model = LinearRegression()
# 训练模型
model.fit(X, y)
# 使用模型进行预测
data_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]
yhat = model.predict(data_in)

# 预测结果的汇总
print(yhat)
[[-93.147146    23.26985013]]
2.用于多输出回归的K近邻算法
# K近邻算法可以用于分类,回归。其中,用于回归的时候,采用均值法,用于分类的时候,一般采用投票法;
from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor

# 创建数据集
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)

# 定义模型
model = KNeighborsRegressor()
# 训练模型
model.fit(X, y)

# 使用模型进行预测
data_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]
yhat = model.predict(data_in)

# 预测结果的汇总
print(yhat)
[[-109.74862659    0.38754079]]
3.用于多输出回归的随机森林回归
# 代码示例
from sklearn.datasets import make_regression
from sklearn.ensemble import RandomForestRegressor

# 创建数据
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)

# 定义模型
model = RandomForestRegressor()
# 训练模型
model.fit(X, y)

# 使用模型进行预测
data_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]
yhat = model.predict(data_in)

# 预测结果的汇总
print(yhat)
[[-69.6710193   23.45282395]]
4.通过交叉验证对多输出回归进行评估
# 使用交叉验证,对多输出回归进行评估
# 使用10折交叉验证,且重复三次
# 使用MAE作为模型的评估指标

from numpy import absolute
from numpy import mean
from numpy import std
from sklearn.datasets import make_regression
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold

# 创建数据集
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)

# 定义模型
model = DecisionTreeRegressor()

# 模型评估
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)

n_scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1, error_score='raise')

# 结果汇总,结果在两个输出变量之间报告错误,而不是分别为每个输出变量进行单独的错误评分
n_scores = absolute(n_scores)

print("result:%.3f (%.3f)" %(mean(n_scores), std(n_scores)))
result:52.166 (3.180)

4.包装器多输出回归算法

有些回归算法并不直接支持多输出回归,例如SVM。

SVM算法在用于回归的时候,被称为支持向量回归或者SVR。该算法不支持回归问题的多个输出,且会引起错误。

# 使用SVR进行多输出回归
from sklearn.datasets import make_regression
from sklearn.svm import LinearSVR

# 创建数据集
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)

# 定义模型
model = LinearSVR()
# 训练模型
# model.fit(X, y)

"""
ValueError: y should be a 1d array, got an array of shape (1000, 2) instead.
"""
'\nValueError: y should be a 1d array, got an array of shape (1000, 2) instead.\n'

为了实现SVR算法用于多输出回归,可以采用如下两种方法

  • 为每个输出创建一个单独的模型;

  • 或者创建一个线性模型序列,其中每个模型的输出取决于先前模型的输出;

1.为每个输出创建单独的模型

这种方法假设:每个输出之间都是相互独立的,但这种假设有时候并不成立。但是这种方法对一系列的问题确实比较有效,其由‘MultiOutputRegressor’类

提供支持,并将一个回归模型作为参数传入。它将为问题中的每个输出创建模型的实例。

# 代码示例
from sklearn.datasets import make_regression
from sklearn.multioutput import MultiOutputRegressor
from sklearn.svm import LinearSVR

# 创建数据集
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)

# 定义模型
model = LinearSVR()

# 将创建的模型对象作为参数传入
wrapper = MultiOutputRegressor(model)

# 训练模型
wrapper.fit(X, y)

# 使用包装器模型进行预测
data_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]

yhat = wrapper.predict(data_in)

# 预测结果汇总展示, 基于MultiOutputRegressor分别为每个输出训练了单独的模型
print(yhat)
[[-93.147146    23.26985013]]
2.为每个输出创建链式模型chained Models

将单输出回归模型用于多输出回归的另一种方法是创建线性模型序列

第一个模型使用输入并预测得到一个输出;

第二个模型使用输入和第一个模型的输出进行预测;

第三个模型使用输入和前两个模型的输出进行预测;

以此类推;

上述方法可以通过使用sklearn中的RegreessorChain类实现;

上述模型的顺序可以通过‘order’参数进行指定,或者直接基于数据集中输出变量的默认顺序。

例如:order= [0, 1],就表明首先预测编号为0th的输出,然后是1th的输出,相对于order=[1, 0]就反过来了,首先预测最后一个输出变量,然后是第一个。

# 代码示例,使用默认的输出顺序。基于multioutput regression 训练SVR

from sklearn.datasets import make_regression
from sklearn.multioutput import RegressorChain
from sklearn.svm import LinearSVR

# 创建数据集
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)

# 定义模型
model  = LinearSVR()

wrapper = RegressorChain(model)

# 训练模型
wrapper.fit(X, y)
# 使用模型进行预测
data_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]
yhat = wrapper.predict(data_in)

# 预测结果汇总输出
print(yhat)
[[-93.147146    23.26968109]]

参考资料链接

代码整理----肖垚----2021年7月。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:44:57  更:2021-07-24 11:45:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:47:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码