ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素

Posted

技术标签:

【中文标题】ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素【英文标题】:ValueError: setting an array element with a sequence in scikit-learn (sklearn) using GaussianNB 【发布时间】:2019-01-01 19:58:31 【问题描述】:

我正在尝试制作一个 sklearn 图像分类器,但我无法将数据放入分类器中。

x_train = np.array(im_matrix)
y_train = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
clf = GaussianNB()
clf.fit(x_train, y_train)

clf.fit(x_train, y_train) 我收到以下错误:

ValueError: 使用序列设置数组元素。

im_matrix 是一个包含图像矩阵的数组:

for file in files:
        path = os.path.join(root, file)
        im_matrix.append(mpimg.imread(path))

x_train 的形状是 (10, 1) y_train 的形状是 (10,)

我猜问题在于 x_train 的形状很奇怪:

array([array([[[227, 255, 233],
        [227, 255, 233],
        [227, 255, 233],
        ...,
        [175, 140, 160],
        [175, 140, 160],
        [175, 140, 160]],

       [[227, 255, 233],
        [227, 255, 233],
        [227, 255, 233],
        ...,
        [174, 139, 159],
        [174, 139, 159],
        [174, 139, 159]],

       [[227, 255, 233],
        [227, 255, 233],
        [227, 255, 233],
        ...,
        [173, 138, 158],
        [173, 138, 158],
        [173, 138, 158]],

       ...,

       [[199, 222, 253],
        [121, 142, 169],
        [ 13,  34,  55],
        ...,
        [ 31,  40,  49],
        [ 31,  40,  49],
        [ 32,  41,  50]],

       [[187, 206, 246],
        [ 80,  98, 134],
        [  0,  13,  41],
        ...,
        [ 36,  44,  63],
        [ 35,  43,  62],
        [ 35,  43,  62]],

       [[187, 206, 246],
        [ 80,  98, 134],
        [  0,  13,  41],
        ...,
        [ 36,  44,  63],
        [ 35,  43,  62],
        [ 35,  43,  62]]], dtype=uint8),

这已经在这里问了好几次了,但我找不到解决办法。任何帮助将不胜感激

【问题讨论】:

您有一组 3-d 图像(RGB 颜色)。所以你的数据目前是 4-d。这不适用于 scikit。所有 scikit 估计器仅适用于二维数据。所以需要将图像数据reshape为单个向量,然后追加到im_matrix 【参考方案1】:

大多数(如果不是全部)scikit-learn 函数期望作为输入 X2D array 形状为 (n_samples, n_features)

查看文档:http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB.fit

根据 X, y 拟合高斯朴素贝叶斯

参数:X:类数组,形状(n_samples,n_features)

训练向量,其中 n_samples 是样本数, n_features 是特征的数量。

要解决您的问题,请使用图像的矢量表示,然后将每个矢量作为一行放入您的 x_train 矩阵中。

最后,用这个X来拟合GaussianNB


如何对图像进行矢量化?

使用这样的东西:

import numpy as np
from PIL import Image

img = Image.open('orig.png').convert('RGBA')
arr = np.array(img)


# make a 1-dimensional view of arr
flat_arr = arr.ravel()

【讨论】:

矢量化似乎有效,并且我尝试使用 np.vstack 将每个元素添加为一行,但每行的长度似乎彼此不同,因此 vstack 给出了错误。会不会是图片大小不同的原因? 是的。同样,scikit-learn 需要具有相同数量特征的样本(在您的情况下为图像)(例如,每个矢量化图像的元素数量相同)。你有不同尺寸/类型的图片吗? 我明白了,那就是问题所在。非常感谢您的帮助

以上是关于ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素的主要内容,如果未能解决你的问题,请参考以下文章

来自 .csv 的 Sklearn 朴素贝叶斯 GaussianNB

sklearn(错误的输入形状)ValueError

Python ValueError:无法将字符串转换为浮点数:

用于多类分类的 sklearn 指标

尝试对数据执行 GaussianNB 时得到 TypeError - python 初学者

sklearn GaussianNB(高斯朴素贝叶斯)模型使用RandomSearchCV获取最优参数及可视化