【问题标题】:Reshape 3D numpy array of images to 2D numpy array for XGBoost DMatrix input将图像的 3D numpy 数组重塑为 XGBoost DMatrix 输入的 2D numpy 数组
【发布时间】:2020-08-17 18:13:54
【问题描述】:

我有一组 3D 数组中的图像(尺寸索引 * 高度 * 宽度)。

x_train, x_test, y_train, y_test = train_test_split(X, yy, test_size=0.2, random_state=42, stratify=y)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)

dtrain = xgb.DMatrix(data=x_train, label=y_train)
dtest = xgb.DMatrix(data=x_test)

我从 XGBoost DMatrix 输入中得到一个错误:

ValueError: ('Expecting 2 dimensional numpy.ndarray, got: ', (2164, 120, 431))

上面打印的数组的形状:

(2164, 120, 431) (542, 120, 431) (2164, 3) (542, 3)

我对如何重塑数据感到困惑。需要2164行*1列吗?

【问题讨论】:

  • 您可能想查看其他类型的图像数据模型。不仅 XGBoost 的输入不能是 3D 的,而且它也不适合图像数据(简单的重塑可能也不会将您带到任何地方)。你可能想看看CNNs
  • 感谢您的建议。我首先用 Keras 尝试了 CNN,但是我有一个小的不平衡数据集,所以结果不是很好。约 70% 的准确度。有人建议 XGBoost 使用这种类型的数据集可能会产生更好的结果。所以我试试看。像下面的用户 A Kareem 建议的那样,图像的扁平化是问题吗?
  • 这真的不是正确的工具。如果使用 CNN 没有产生好的结果,你可能想看看为什么会这样,而不是尝试经典的 ML 分类器。基于树的算法无法从图像数据中学到很多东西。您需要学习结构和有意义的 2D 特征的模型。 CNN 通过对图像应用过滤器来做到这一点。当涉及到图像数据时,它们是常用的方法
  • 感谢您的建议,非常感谢。我再看看 CNN。

标签: python numpy xgboost numpy-ndarray


【解决方案1】:

阅读documentation 似乎X 需要是二维的,Y 需要是一维的。因此 X 需要具有形状 (index_of_sample, features),因此宽度和高度需要展平为单个向量(这对图像来说不是一个好主意,因为您会失去结构价值,但由于模型是 xgb,这又必须发生)

因此,您需要将 X 重塑为

x_train = x_train.reshape(x_train.shape[0], -1)
x_test = x_test.reshape(x_test.shape[0], -1)

此外,文档指出 Y 必须是一维的。因此,您需要以某种方式将 Y 更改为分类值,而不是当前(我假设)单热编码。

【讨论】:

    【解决方案2】:

    只需重塑您的 x numpy 数组即可。

    x_train = x_train.reshape(x_train.shape[0], -1)

    x_test = x_test.reshape(x_test.shape[0], -1)

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 2016-05-22
      • 2021-10-28
      • 2015-10-19
      • 2019-09-12
      • 1970-01-01
      • 2017-04-27
      • 2019-07-10
      • 2016-06-01
      相关资源
      最近更新 更多