多输出回归是监督机器学习的一种特殊形式,可以同时预测多个目标变量。虽然传统回归侧重于基于一组输入特征预测单个数值(目标变量),但多输出回归扩展了这一概念,可以同时预测多个数值,这在各种现实世界的应用中是一种有价值的技术,其中有多个因变量或复杂的关系要建模。在本文中,我们将实现Sklearn的多输出回归器,并将其性能与传统的基于树的模型和集成模型进行比较。
多输出回归或多目标回归处理需要预测多个连续目标变量的问题,这只是传统回归的扩展,我们专注于预测单目标。在多输出回归中,每个目标变量都被视为一个单独的回归问题,目标是创建一个模型,可以同时为所有目标变量生成准确的预测。下面列出了这个特殊回归任务的一些关键方面:
任何问题都有解决的办法。多输出回归有以下几种解决方案:
传统机器学习模型的扩展,以适应多输出回归任务是scikit-learn中的MultiOutputRegressor包装器类。当你想同时预测几个连续的目标变量时,这非常方便。以下是MultiOutputRegressor类接受的参数:
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回归模型一起使用。让我们剖析一下各个部分:
需要同时预测多个连续变量的多输出回归问题可以通过使用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的多输出回归器甚至可以与基于树的模型相比表现良好。因此,该模型可以成为一个很好的武器,以一种简单的方式解决多输出回归任务的复杂性。然而,为了实现良好的模型性能,我们需要进一步的超参数调优或更深入的数据预处理。