机器学习 | 使用Python开发多输出回归模型

多输出回归是监督机器学习的一种特殊形式,可以同时预测多个目标变量。虽然传统回归侧重于基于一组输入特征预测单个数值(目标变量),但多输出回归扩展了这一概念,可以同时预测多个数值,这在各种现实世界的应用中是一种有价值的技术,其中有多个因变量或复杂的关系要建模。在本文中,我们将实现Sklearn的多输出回归器,并将其性能与传统的基于树的模型和集成模型进行比较。

什么是多输出回归?

多输出回归或多目标回归处理需要预测多个连续目标变量的问题,这只是传统回归的扩展,我们专注于预测单目标。在多输出回归中,每个目标变量都被视为一个单独的回归问题,目标是创建一个模型,可以同时为所有目标变量生成准确的预测。下面列出了这个特殊回归任务的一些关键方面:

  • 多目标变量:在多输出回归中,我们使用特殊的数据集,其中有两个或多个目标变量我们想要预测。这些目标可以是相关的,也可以是独立的,它们可能代表我们试图解决的问题的不同方面或层面。
  • 评估指标:在多输出回归中,我们使用了回归任务常见的性能指标,如MSE,MAE,MAPE,R2-score等。请记住,多输出回归只是一个简单的回归任务,但同时预测多个数字。
  • 挑战:在这个回归任务中,我们需要处理目标变量的不同尺度和单位的数据集,这些数据集有时会变得复杂,因为我们需要处理目标变量之间的相关性。此外,这个任务很容易出现过拟合问题,因为我们需要处理多个目标,这意味着在预测多个目标时维数很高。

如何解决多输出回归

任何问题都有解决的办法。多输出回归有以下几种解决方案:

  1. 多输出回归器:它是SKlearn专门设计的模型,仅显式解决多输出回归任务。我们将在后面讨论它的关键特性和实现。
  2. 多输出线性回归:这扩展了简单线性回归来处理多个目标变量,这些目标变量被训练为将每个目标预测为输入特征的线性组合。但是这种模型无法捕捉复杂的上下文或特征之间的关系。
  3. 决策树和随机森林:基于树的模型可用于多输出回归,因为它们可以捕获特征和目标之间的非线性关系。我们将用多输出回归量来比较这两个变量。
  4. 神经网络:深度学习模型可以通过具有多个输出神经元来适应多输出回归,每个输出神经元对应一个目标变量,这是一项复杂、消耗内存且成本高昂的任务。

多输出回归的参数

传统机器学习模型的扩展,以适应多输出回归任务是scikit-learn中的MultiOutputRegressor包装器类。当你想同时预测几个连续的目标变量时,这非常方便。以下是MultiOutputRegressor类接受的参数:

  • estimator:要用作多输出回归基础的回归模型由此参数指定,该参数称为基本估计量。任何回归估计-线性回归,决策树,随机森林等-可以使用与scikit-learn兼容。
  • n_jobs(默认值=None):在模型拟合过程中使用的CPU内核数量由该参数控制。若要允许并行处理,请将其设置为大于1的整数。如果设置为-1,它将使用所有CPU内核。
  • verbose(默认值=0):它调节估计器的详细程度。在模型训练期间,较大的值会产生更详细的输出。
  • check_inverse(default=True):参数为布尔值。如果设置为True,则它确定估计器是否具有逆属性。它主要用于需要估计器的逆的情况,这与某些算法有关。
  • estimator_params(默认值=None):在此参数的帮助下,您可以提供应在启动时提供给estimator的额外参数。值是参数值,键是参数的名称。这是一个字典。

多输出回归模型

scikit-learn中的多输出回归器是一个包装器或元估计器,它允许我们扩展单输出回归模型来执行多输出回归。这是一种方便的方法来处理我们需要使用一个或多个基本回归模型同时预测多个目标变量的任务。它的一些主要特点讨论如下:

  1. 单输出模型的扩展:多输出回归器扩展了传统单输出回归模型的功能,以处理多输出回归任务,可以包装任何支持单输出回归的回归器。
  2. 并行预测:多输出回归器将每个目标变量视为独立的单输出回归问题,并为每个目标变量拟合一个基础回归器,从而允许并行预测。
  3. 一致性:它确保基本回归变量独立拟合,预测组合成多输出格式。
  4. 灵活性:我们可以使用广泛的基本回归模型作为内部回归,如线性回归,决策树,支持向量机和随机森林等。

多输出回归的实现

在这个实现中,我们将探索使用scikit-learn进行多输出回归。它可以应用于各种现实世界的任务,包括多标签分类,多目标回归等。当每个数据点都有许多相关的目标值时,它特别有用。

1.导入依赖库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.multioutput import MultiOutputRegressor
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error

这段代码导入了NumPy、Matplotlib、Pandas、Seaborn、scikit-learn和其他数据分析和机器学习所需的库。数据集被加载并分为训练集和测试集(最有可能通过scikit-learn的datasets模块)。此外,ElasticNet、DecisionTreeRegressor和RandomForestRegressor等模型被导入,用于预测多个目标变量,并使用均方误差和平均绝对误差等指标进行评估。

2.数据集加载和拆分

# Load the Linnerud dataset
linnerud = datasets.load_linnerud()
X, y = linnerud.data, linnerud.target# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

这段代码将输入数据(X)和目标变量(y)分开,并使用scikit-learn datasets模块加载Linnerud数据集。接下来,使用随机状态42,它将数据集以80-20的比例划分为训练集和测试集,以确保可重复性。这使得训练和评估机器学习模型成为可能。

探索性数据分析

数据分析的一个重要阶段是探索性数据分析(EDA),它提供了对数据集属性的全面把握。它需要突出关键特征,发现模式和发现趋势。EDA辅助数据分布分析、缺失值检测和离群值检测。通过使用散点图和直方图等图表,EDA提供了特征选择指导和对数据中关系模式的深入了解。考虑到所有因素,EDA通过提供对数据准备和模型构建后期阶段的见解来改进数据驱动决策的过程。

3.相关矩阵

可视化相关矩阵将帮助我们理解数据集中不同特征之间的关系。

# Create a DataFrame for the Linnerud dataset
df = pd.DataFrame(data=X, columns=linnerud.feature_names)
# Calculate the correlation matrix
correlation_matrix = df.corr()# Plot a heatmap of the correlation matrix
plt.figure(figsize=(4, 3))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('Correlation Matrix')
plt.show()

在这里插入图片描述
这些代码行计算Linnerud数据集中特征的相关矩阵,并从这些特征生成DataFrame。相关矩阵可以使用sns.heatmap函数绘制为热图。热图直观地显示了几个特征之间的关系,每个单元格中都标记了值,颜色表示相关性的强度和方向。这有助于确定数据集变量之间的联系。

4.目标变量的分布

此数据集的目标变量有三种类型。将其可视化将有助于我们理解其行为。

df = pd.DataFrame(data=X, columns=linnerud.target_names)
# Plot the distribution of the target variables
plt.figure(figsize=(10, 4))
plt.subplot(1, 3, 1)
sns.histplot(df['Weight'], kde=True, color='green')
plt.title('Distribution of Weight')plt.subplot(1, 3, 2)
sns.histplot(df['Waist'], kde=True, color='green')
plt.title('Distribution of Waist')plt.subplot(1, 3, 3)
sns.histplot(df['Pulse'], kde=True, color='green')
plt.title('Distribution of Pulse')plt.tight_layout()
plt.show()

在这里插入图片描述
Linnerud数据集中的目标变量“Weight”、“Waist”和“Pulse”用于在此代码中创建名为df的DataFrame。之后,制作一个有三个子图的图,以显示这些目标变量如何分布。通过添加“kde=True”选项来添加核密度估计值以改善可视化效果,每个子图都显示其中一个变量的直方图。所有子图的颜色都设置为绿色。标题为“体重分布”、“腰围分布”和“脉搏分布”的子图根据观察到的变量命名。在plt.tight_layout()方法的帮助下,绘制子图变得更容易。使用plt.show()显示了完整的图,这也让我们进一步了解了目标变量的分布。

5.模型训练

现在我们将训练SKlearn的多输出回归模型。正如前面所讨论的,我们还将在本文后面使用基于树的传统机器学习模型决策树和Encoder模型随机森林来展示性能比较。

# Create and train the multioutput regression model (ElasticNet)
multioutput_model = MultiOutputRegressor(ElasticNet(alpha=0.5, l1_ratio=0.5), n_jobs=5)
multioutput_model.fit(X_train, y_train)# Create and train the decision tree regressor model
tree_model = DecisionTreeRegressor(random_state=42)
tree_model.fit(X_train, y_train)# Create and train the random forest regressor model
forest_model = RandomForestRegressor(n_estimators=100, random_state=42)
forest_model.fit(X_train, y_train)

在这段代码中,我们为Linnerud数据集创建并训练了三个不同的多输出回归模型。首先,multioutput_model采用ElasticNet回归,配置了特定的alpha和L1比值,旨在同时处理多个目标变量。它与五个工作并行,以提高效率。其次,tree_model是一个DecisionTreeRegressor,一个基于决策树的回归模型,它学习输入特征和目标变量之间的关系。最后,forest_model是一个由100棵决策树组成的RandomForestRegressor,提供了一种集成的回归方法。这些模型在训练数据上进行训练,并准备在测试数据集上进行预测,从而能够比较它们在预测目标变量方面的性能。我们使用ElasticNet线性模型作为多输出回归模型的基本估计。将n_jobs参数设置为5意味着总共将发生五次并行计算。

使用scikit-learn提供的包装器类,MultiOutputRegressor扩展了标准机器学习模型,以解决多输出问题。它与提供的代码中的ElasticNet回归模型一起使用。让我们剖析一下各个部分:

  • L1(Lasso)和L2(Ridge)正则化组件在ElasticNet线性回归模型中组合。当有几个相关的特征时,它是有帮助的,有助于避免过拟合。
  • 正则化的程度由alpha参数管理。较弱的正则化由较小的值指示。
  • L1和L2正则化由l1_ratio参数平衡。当“l1_ratio”为1时,它表示Lasso(L1正则化),当它为零时,它表示Ridge(L2正则化)。
  • 在模型拟合过程中要使用的CPU内核数量由n_jobs选项指定。如果你有一个多核CPU,使用“n_jobs=5”来表示在模型训练期间将使用五个CPU核心进行并行处理,可以大大加快训练过程。

需要同时预测多个连续变量的多输出回归问题可以通过使用MultiOutputRegressor来解决,它扩展了ElasticNet模型以处理多个目标变量。

6.模型评估

现在,我们将根据MSE和MAE来评估所有回归模型,这是两个常用的回归模型性能指标。

# Make predictions
multioutput_pred = multioutput_model.predict(X_test)
tree_pred = tree_model.predict(X_test)
forest_pred = forest_model.predict(X_test)# Calculate performance metrics for multioutput model
multioutput_mse = mean_squared_error(y_test, multioutput_pred)
multioutput_mae = mean_absolute_error(y_test, multioutput_pred)# Calculate performance metrics for decision tree model
tree_mse = mean_squared_error(y_test, tree_pred)
tree_mae = mean_absolute_error(y_test, tree_pred)# Calculate performance metrics for random forest model
forest_mse = mean_squared_error(y_test, forest_pred)
forest_mae = mean_absolute_error(y_test, forest_pred)# Print the performance metrics
print("Multioutput Model - Mean Squared Error:", multioutput_mse)
print("Multioutput Model - Mean Absolute Error:", multioutput_mae)
print("Decision Tree Model - Mean Squared Error:", tree_mse)
print("Decision Tree Model - Mean Absolute Error:", tree_mae)
print("Random Forest Model - Mean Squared Error:", forest_mse)
print("Random Forest Model - Mean Absolute Error:", forest_mae)

输出

Multioutput Model - Mean Squared Error: 236.22543973611653
Multioutput Model - Mean Absolute Error: 10.015359327324276
Decision Tree Model - Mean Squared Error: 371.9166666666667
Decision Tree Model - Mean Absolute Error: 12.083333333333334
Random Forest Model - Mean Squared Error: 242.75831666666667
Random Forest Model - Mean Absolute Error: 10.656666666666666

此代码使用测试数据来评估三个回归模型的性能。这些模型包括随机森林、决策树和多输出弹性网络模型。每个模型生成预测,均方误差(MSE)和平均绝对误差(MAE),两个流行的回归指标,用于评估每个模型的性能。较低的MSE和MAE值显示了更好的模型拟合和预测精度。这些指标可以在解决多输出回归问题的三个模型之间进行比较,因为代码为每个模型计算并输出它们。根据评估的预测准确性,可以选择最佳模型。

7.性能比较可视化

现在,我们将可视化模型的表现以及哪个模型优于其他模型。

# Create a comparative visualization
plt.figure(figsize=(10, 4))
models = ['Multioutput', 'Decision Tree', 'Random Forest']
mse_scores = [multioutput_mse, tree_mse, forest_mse]
mae_scores = [multioutput_mae, tree_mae, forest_mae]# Plot Mean Squared Error (MSE)
plt.subplot(1, 2, 1)
plt.bar(models, mse_scores, color=['blue', 'green', 'purple'])
plt.xlabel('Models')
plt.ylabel('Mean Squared Error (MSE)')
plt.title('Comparative MSE Scores')# Plot R-squared Score (R2)
plt.subplot(1, 2, 2)
plt.bar(models, mae_scores, color=['blue', 'green', 'purple'])
plt.xlabel('Models')
plt.ylabel('Mean Absolute Error(MAE)')
plt.title('Comparative MAE Scores')plt.tight_layout()
plt.show()

在这里插入图片描述
使用三种回归模型–多输出、决策树和随机森林–该代码生成一个比较可视化,以评估它们各自的性能。并排生成两个条形图。每个模型的均方误差(MSE)得分显示在左侧图表中,而平均绝对误差(MAE)值显示在右侧图表中。在x轴上,模型被标记,不同颜色的条表示相关的MSE和MAE分数。由于较低的MSE和MAE值表示更高的性能,这种表示方法可以直接比较模型的预测精度。

总结

我们可以得出结论,解决多输出回归任务是一个计算成本高的任务,但同时它是非常重要的现实世界的问题解决。SKlearn的多输出回归器甚至可以与基于树的模型相比表现良好。因此,该模型可以成为一个很好的武器,以一种简单的方式解决多输出回归任务的复杂性。然而,为了实现良好的模型性能,我们需要进一步的超参数调优或更深入的数据预处理。

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

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

相关文章

【产研测类】线上问题处理机制

1 概述 本规范致力于优化运营与产研团队在线问题管理的效率与效果,全面覆盖生产问题的识别、处理机制、分类分级、责任归属和明确奖惩机制。同时,侧重资源重点解决主流程关联的核心模块生产问题。如此,确保各个环节责任到人,内…

单细胞分析|整合 scRNA-seq 和 scATAC-seq 数据

引言 单细胞转录组学极大地提升了对细胞状态进行分类的能力,但要深入理解生物学现象,不能仅仅停留在对细胞群的简单列举上。随着新方法的不断涌现,用于测量细胞的不同状态,一个关键的挑战是如何将这些数据集整合起来,以…

Spring三级缓存源码解析

Spring三级缓存 前置知识三级缓存定义SpringBean生命周期 Bean的初始化getSingleton 分析加入一级缓存 CreateBean过程(A)A填充属性BB填充属性A,执行getSingleton(A)B完成初始化 前置知识 三级缓存定义 public class DefaultSingletonBeanRegistry ext…

云打印为什么这么便宜?

随着云打印的火热发展,越来越多的用户开始选择云打印服务了。我们在之前的内容里也介绍过,现在的易绘创云打印服务A4低至5分钱/页。那么云打印为什么这么便宜呢?今天小易就带大家来了解一下。 云打印为什么这么便宜? 相信很多用户…

Element-plus DatePicker 日期选择器【正则校验时间范围】

效果图&#xff1a; 利用element-plus中的form表单验证完成效果。 <el-form-item label"检查计划截止日期&#xff1a;" prop"deadline"><el-date-pickerv-model"form.deadline"value-format"YYYY-MM-DD"style"width: …

NAT的知识点和实现

1.NAT的作用&#xff1a; &#xff08;1&#xff09;、把内网私网IP转换公网IP&#xff1b; &#xff08;2&#xff09;、隐藏内网&#xff0c;起到保护内网作用&#xff1b; &#xff08;3&#xff09;、适当的缓解的IPv4地址空间枯竭&#xff1b; &#xff08;4&#xff…

【数据分析面试】28.查找职工信息 (SQL文字处理/通配符查找)

题目 现在公司里有职工信息表Worker, HR需要你提供不同的职工信息&#xff0c;包括&#xff1a; 从 Worker 表中获取 “FIRST_NAME” 并以大写形式显示。从 Worker 表中获取 DEPARTMENT 的唯一值。查找 Worker 表中 FIRST_NAME 的前三个字符。查找 Worker 表中名为 ‘Amitabh…

值传递和地址传递

文章目录 目录值传递地址传递 目录 值传递 package com.zhang.parameter; //值传递 public class MethodDemo1 {public static void main(String[] args) {int a 10;System.out.println(a);System.out.println("~~~~~~~~~~~~~~~");change(a);//无论你传入的是什么 …

备战Java面试

一&#xff0e;JAVA基础 1.八个基本数据类型&#xff0c;长&#xff0c;占几个字节&#xff0c;取值范围是多少。 基本类型&#xff1a; Byte 一般的数据 1个字节 取值范围 -128—127 short 极大的数据 2个字节 取值范围 -2的15次方到2的15次方减一 int 4个字节…

JS绘制电流闪烁流动效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>电流闪动动效</title><style>.sd1 {dis…

618买什么最划算?618买什么东西便宜?必备数码好物清单分享

​只不&#xff0c;马上又到了618购物节咯&#xff0c;数码产品的优惠力度尤为显著&#xff0c;是购买数码产品的绝佳时机。接下来&#xff0c;我将为大家分享几款性价比超高的数码产品&#xff0c;相信总有一款能吸引你的目光。 一、南卡OE MIX开放式蓝牙耳机 在618购物狂欢节…

linux中git的使用

为什么要有git git相当于一个仓库可以让我们更好的去管理我们的代码&#xff0c;实现版本的控制&#xff0c;上传到云端仓库。有了git,就可以实现多人同时开发一个项目&#xff08;每个负责一部分代码&#xff0c;最后都上传到同一个仓库&#xff09;。 git github/gitee 的区…

【Linux】LInux下的进程状态

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

APP UI自动化测试,思路全总结在这里了

首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还是需要花时间去掌握的&#xff0c;毕竟谁也不会跟钱过不去。 接下来&#xff0c…

新书速览|数字身份认证技术与实践

本书不仅仅讲述标准解决方案以及相关理论&#xff0c;更重要的是以丰富的案例&#xff0c;讲透如何将这些理论应用到具体实际场景。 本书内容 《数字身份认证技术与实践》内容涵盖身份认证的基础理论&#xff0c;包括身份认证与授权的区别、常见的认证方式以及关键技术和协议&…

代码随想录算法训练营33期 第五十天 | 188.买卖股票的最佳时机IV

dp[i][0] 不操作&#xff1b;d[i][1]第一次开始持有股票 //dp[i]当前天i的价值情况&#xff0c;dp[i][0]表示不操作的最大价值&#xff0c;dp[i][1]在当前天第一次持有的最大价值&#xff0c;dp[i][2]在当前天第一次卖出的最大价值, dp[i][3]在当前天第二次持有的最大价值&am…

苍穹外卖学习笔记(8.用户端历史订单模块,商家端订单管理模块)

目录 一、商家端订单管理模块1、查看历史订单2、查询订单详情3、取消订单4、再来一单5、代码开发6、测试 二、用户端历史订单模块1、订单搜索2、各个状态的订单数量统计3、查询订单详情4、接单5、拒单6、取消订单7、派送订单8、完成订单9、代码开发10、测试 三、校验收货地址是…

matlab学习005-利用matlab设计滤波器

目录 一&#xff0c;含有多个频率成分的三角信号 1&#xff0c;以采样频率fs20KHz对信号采样&#xff0c; 画出信号的波形&#xff1b; 1&#xff09;前期基础 2&#xff09;波形图 3&#xff09;代码 2&#xff0c;选取合适的采样点数&#xff0c;利用DFT分析信号的…

Python静态资源库之webassets使用详解

概要 Python webassets库是一个用于管理静态资源的工具,如CSS、JavaScript等,帮助开发者更有效地管理和优化网站的静态文件。本文将介绍如何安装和使用Python webassets库,以及它的特性、基本功能、高级功能、实际应用场景和总结部分。 安装 首先,需要安装Python webasse…

Mysql索引详解(索引分类)

文章目录 概述索引对查询速度的影响索引的优缺点索引类型一级索引和二级索引的区别MySQL 回表联合索引&#xff08;最左前缀原则主键索引和唯一索引的区别BTree索引和Hash索引的区别 覆盖索引索引下推加索引能够提升查询效率原因MySQL 索引结构采用 B树原因索引失效的场景MySQL…