scikit-learn报”ValueError: For a multioutput estimator, y must be a 2D array, but got y.shape = {y_shape}. “的原因以及解决办法

  • Post category:Python

首先,scikit-learn中的机器学习模型可以分为单输出模型和多输出模型。单输出模型指的是模型只能预测一个目标变量,而多输出模型可以同时预测多个目标变量。

当我们使用多输出模型时,由于模型需要同时预测多个目标变量,因此我们在训练模型时所需要传入的标签数据 y 应该是一个二维数组,其中第一维表示样本数,第二维表示目标变量数。如果 y 不是二维数组,就会出现 “ValueError: For a multioutput estimator, y must be a 2D array” 的错误。

例如,在使用决策树模型训练时,可以通过下面的代码指定目标变量 y 为一个二维数组,其中包含两个目标变量:

from sklearn.tree import DecisionTreeRegressor
import numpy as np

# 构造训练数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([[0.5, 1.5], [1.5, 2.5], [2.5, 3.5], [3.5, 4.5], [4.5, 5.5]])

# 训练决策树模型
dt = DecisionTreeRegressor()
dt.fit(X, y)

如果我们将 y 定义为一维数组,就会出现上述的错误。

我们可以通过 np.reshape 方法将一维数组 y 转换为二维数组,代码如下:

y = np.array([0.5, 1.5, 2.5, 3.5, 4.5])
y = np.reshape(y, (y.shape[0], 1))

或者在定义 y 时直接将其定义为二维数组,例如:

y = np.array([[0.5], [1.5], [2.5], [3.5], [4.5]])

这样做就可以解决 “ValueError: For a multioutput estimator, y must be a 2D array” 的错误。