【问题标题】:sklearn SVM fit() "ValueError: setting an array element with a sequence"sklearn SVM fit() "ValueError: setting an array element with a sequence"
【发布时间】:2016-07-07 01:01:55
【问题描述】:

我正在使用 sklearn 在我自己的一组图像上应用 svm。图像被放入数据框中。 我向 fit 函数传递了一个具有 2D 列表的 numpy 数组,这些 2D 列表表示图像,我传递给函数的第二个输入是目标列表(目标是数字)。 我总是收到此错误“ValueError:设置带有序列的数组元素”。

trainingImages = images.ix[images.partID <=9]
trainingTargets = images.clustNo.ix[images.partID<=9]
trainingImages.reset_index(inplace=True,drop=True)
trainingTargets.reset_index(inplace=True,drop=True)

classifier = svm.SVC(gamma=0.001)
classifier.fit(trainingImages.image.values,trainingTargets.values.tolist())

错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-43-5336fbeca868> in <module>()
      8 classifier = svm.SVC(gamma=0.001)
      9 
---> 10 classifier.fit(trainingImages.image.values,trainingTargets.values.tolist())
     11 
     12 #classifier.fit(t, list(range(0,2899)))

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/sklearn/svm/base.py in fit(self, X, y, sample_weight)
    148         self._sparse = sparse and not callable(self.kernel)
    149 
--> 150         X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C')
    151         y = self._validate_targets(y)
    152 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    371                                       force_all_finite)
    372     else:
--> 373         array = np.array(array, dtype=dtype, order=order, copy=copy)
    374 
    375         if ensure_2d:

ValueError: setting an array element with a sequence.

【问题讨论】:

  • trainingImages.image.values的形状是什么?传递给fit 函数的 X 值应该是形状 (n_samples, n_features)。如果你有 (n_samples, width, height),试试X.reshape(-1, width*height)

标签: python numpy multidimensional-array svm sklearn-pandas


【解决方案1】:

我遇到了同样的错误,这是两种可能性之一:

1- 数据和标签长度不同。

2-对于特定的特征向量,元素个数不 相等。

【讨论】:

    【解决方案2】:

    这可能是因为“trainingImages.image.values”在它的所有数组中没有相同数量的元素。在 stackoverflow 中查看类似的问题:

    ValueError: setting an array element with a sequence. while using SVM in scikit-learn

    【讨论】:

    • 感谢您的回复。我确保它的所有元素都具有相同的大小,但我仍然遇到相同的错误。
    • 您能否发布一份 trainingImages.image.values 和 trainingTargets.values.tolist() 的打印件? (以及形状)
    【解决方案3】:

    如果您确定尺寸正确,下面的代码/工作流程可能会有所帮助

    import skimage.io as skio
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn import svm
    from sklearn.metrics import accuracy_score
    from sklearn.metrics import precision_score
    %matplotlib inline
    
    # Load the data
    trainingImages = skio.imread_collection('train/images/*.jpg',conserve_memory=True)
    
    # cast to numpy arrays
    trainingImages = np.asarray(trainingImages)
    
    # reshape img array to vector
    def reshape_image(img):
        return np.reshape(img,len(img)*len(img[0]))
    
    img_reshape = np.zeros((len(trainingImages),len(trainingImages[0])*len(trainingImages[0][0])))
    
    for i in range(0,len(trainingImages)):
        img_reshape[i] = reshape_image(trainingImages[i])
    
    # SVM
    clf = svm.SVC(gamma=0.01,C=10,kernel='poly')
    clf.fit(img_reshape,trainingTargets.values.tolist())
    

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2021-03-17
      • 2018-11-24
      • 2011-04-19
      • 2014-05-25
      • 1970-01-01
      • 2021-09-06
      • 2018-04-29
      • 1970-01-01
      相关资源
      最近更新 更多