多输出回归是监督机器学习的一种特殊形式,可以同时预测多个目标变量。虽然传统回归侧重于基于一组输入特征预测单个数值(目标变量),但多输出回归扩展了这一概念,可以同时预测多个数值,这在各种现实世界的应用中是一种有价值的技术,其中有多个因变量或复杂的关系要建模。在本文中,我们将实现Sklearn的多输出回归器,并将其性能与传统的基于树的模型和集成模型进行比较。
什么是多输出回归?
多输出回归或多目标回归处理需要预测多个连续目标变量的问题,这只是传统回归的扩展,我们专注于预测单目标。在多输出回归中,每个目标变量都被视为一个单独的回归问题,目标是创建一个模型,可以同时为所有目标变量生成准确的预测。下面列出了这个特殊回归任务的一些关键方面:
- 多目标变量:在多输出回归中,我们使用特殊的数据集,其中有两个或多个目标变量我们想要预测。这些目标可以是相关的,也可以是独立的,它们可能代表我们试图解决的问题的不同方面或层面。
- 评估指标:在多输出回归中,我们使用了回归任务常见的性能指标,如MSE,MAE,MAPE,R2-score等。请记住,多输出回归只是一个简单的回归任务,但同时预测多个数字。
- 挑战:在这个回归任务中,我们需要处理目标变量的不同尺度和单位的数据集,这些数据集有时会变得复杂,因为我们需要处理目标变量之间的相关性。此外,这个任务很容易出现过拟合问题,因为我们需要处理多个目标,这意味着在预测多个目标时维数很高。
如何解决多输出回归
任何问题都有解决的办法。多输出回归有以下几种解决方案:
- 多输出回归器:它是SKlearn专门设计的模型,仅显式解决多输出回归任务。我们将在后面讨论它的关键特性和实现。
- 多输出线性回归:这扩展了简单线性回归来处理多个目标变量,这些目标变量被训练为将每个目标预测为输入特征的线性组合。但是这种模型无法捕捉复杂的上下文或特征之间的关系。
- 决策树和随机森林:基于树的模型可用于多输出回归,因为它们可以捕获特征和目标之间的非线性关系。我们将用多输出回归量来比较这两个变量。
- 神经网络:深度学习模型可以通过具有多个输出神经元来适应多输出回归,每个输出神经元对应一个目标变量,这是一项复杂、消耗内存且成本高昂的任务。
多输出回归的参数
传统机器学习模型的扩展,以适应多输出回归任务是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中的多输出回归器是一个包装器或元估计器,它允许我们扩展单输出回归模型来执行多输出回归。这是一种方便的方法来处理我们需要使用一个或多个基本回归模型同时预测多个目标变量的任务。它的一些主要特点讨论如下:
- 单输出模型的扩展:多输出回归器扩展了传统单输出回归模型的功能,以处理多输出回归任务,可以包装任何支持单输出回归的回归器。
- 并行预测:多输出回归器将每个目标变量视为独立的单输出回归问题,并为每个目标变量拟合一个基础回归器,从而允许并行预测。
- 一致性:它确保基本回归变量独立拟合,预测组合成多输出格式。
- 灵活性:我们可以使用广泛的基本回归模型作为内部回归,如线性回归,决策树,支持向量机和随机森林等。
多输出回归的实现
在这个实现中,我们将探索使用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的多输出回归器甚至可以与基于树的模型相比表现良好。因此,该模型可以成为一个很好的武器,以一种简单的方式解决多输出回归任务的复杂性。然而,为了实现良好的模型性能,我们需要进一步的超参数调优或更深入的数据预处理。