sklearn: 分类器用于在 MaskedArray 上进行预测

4

我正在尝试解决如何处理分类器对于numpy掩码数组的预测(而不是常规的numpy数组)。以下是我的代码:

# My masked array on which to perform the prediction
>>> type(patch)
    numpy.ma.core.MaskedArray
>>> patch.shape
    (3,3,14)
# This is how it looks like the first layer in the 3rd dimension. 
>>> patch[:,:,0]
    masked_array(
  data=[[90, 28, 16],
        [79, 32, --],
        [41, --, --]],
  mask=[[False, False, False],
    [False, False,  True],
    [False,  True,  True]],
 fill_value=999999,
 dtype=uint16)

在上面的代码中,您可以看到第三维度中的第一层。正如您可以从patch.shape看到的那样,有14个这样的层。它们中的每一个都有位置:(1,2),(2,1)和(2,2)被掩盖!
现在,我使用预先训练好的随机森林分类器cl来分类id为1、4、6的块的值。我希望分类器在分类过程中忽略掩盖的值,但是经过以下操作后:
>>> class_pred = cl.predict(patch.reshape(-1, patch.shape[2]))
>>> class_pred = class_pred.reshape(patch[:,:,0].shape)

我理解为:

>>> class_pred 
    array([[4, 4, 4],
           [4, 4, 1],
           [4, 1, 1]])

所以 (1,2)、(2,1) 和 (2,2) 位置不再被屏蔽,但它们也被分类了。

是否有办法在分类过程中强制分类器忽略掉被屏蔽的值?以便获得类似下面这样的结果:

masked_array(
  data=[[4, 4, 4],
        [4, 4, --],
        [4, --, --]],
  mask=[[False, False, False],
    [False, False,  True],
    [False,  True,  True]],
 fill_value=999999,
 dtype=uint16)
1个回答

1
现在的答案是:我认为Scikit Learn忽略了传递数据中的掩码。无论掩码数据中的基础值是什么,分类器都会用它来进行拟合和预测,因此您会得到一个类值。
对于您的特定情况:输入是否具有矩阵结构很重要?如果这些输入始终被掩盖(例如因为它们是三角形数组),则可能需要将它们展开成向量。即使对于像图像这样的完整方形矩阵,人们也这样做(例如考虑ConvNet)。
从更广泛的意义上讲,如果您所做的是表示缺失值,则必须说,这种ML仍处于萌芽阶段(但正在以极快的速度发展)。我可以向您推荐书籍“带有缺失数据的统计分析”,其中包含相当多的算法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接