【问题标题】:ValueError: setting an array element with a sequence with Decision Tree where all the rows have equal elements?ValueError:使用决策树的序列设置数组元素,其中所有行都具有相同的元素?
【发布时间】:2016-09-29 14:42:52
【问题描述】:

我正在尝试将决策树拟合到特征和标签矩阵。这是我的代码:

print FEATURES_DATA[0]
print ""
print TARGET[0]
print ""
print np.unique(list(map(len, FEATURES_DATA[0])))

给出以下输出:

[ array([[3, 3, 3, ..., 7, 7, 7],
       [3, 3, 3, ..., 7, 7, 7],
       [3, 3, 3, ..., 7, 7, 7],
       ..., 
       [2, 2, 2, ..., 6, 6, 6],
       [2, 2, 2, ..., 6, 6, 6],
       [2, 2, 2, ..., 6, 6, 6]], dtype=uint8)]

[ array([[31],
       [31],
       [31],
       ..., 
       [22],
       [22],
       [22]], dtype=uint8)]

[463511]

矩阵实际上包含 463511 个样本。

之后,我运行以下代码块:

from sklearn.tree import DecisionTreeClassifier
for i in xrange(5):
    Xtrain=FEATURES_DATA[i]
    Ytrain=TARGET[i]
    clf=DecisionTreeClassifier()
    clf.fit(Xtrain,Ytrain)

这给了我以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-3d8b2a7a3e5f> in <module>()
      4     Ytrain=TARGET[i]
      5     clf=DecisionTreeClassifier()
----> 6     clf.fit(Xtrain,Ytrain)

C:\Users\singhg2\AppData\Local\Enthought\Canopy\User\lib\site-packages\sklearn\tree\tree.pyc in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    152         random_state = check_random_state(self.random_state)
    153         if check_input:
--> 154             X = check_array(X, dtype=DTYPE, accept_sparse="csc")
    155             if issparse(X):
    156                 X.sort_indices()

C:\Users\singhg2\AppData\Local\Enthought\Canopy\User\lib\site-packages\sklearn\utils\validation.pyc 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.

我在 SO 上搜索了其他帖子,发现大多数答案是矩阵不完全是数字,或者数组在样本之间的长度不同。但是,这不是我的问题吗?

有什么帮助吗?

【问题讨论】:

    标签: numpy matrix machine-learning scikit-learn decision-tree


    【解决方案1】:

    如果print FEATURES_DATA[0] 实际打印

    [ array([[3, 3, 3, ..., 7, 7, 7],
           [3, 3, 3, ..., 7, 7, 7],
           [3, 3, 3, ..., 7, 7, 7],
           ..., 
           [2, 2, 2, ..., 6, 6, 6],
           [2, 2, 2, ..., 6, 6, 6],
           [2, 2, 2, ..., 6, 6, 6]], dtype=uint8)]
    

    那么问题是 FEATURES_DATA[0] 是一个 python 列表,里面有一个 numpy 数组。 (从[]可以理解)

    您可以选择列表的第一个(也是唯一一个)元素来修复它

    from sklearn.tree import DecisionTreeClassifier
    for i in xrange(5):
        Xtrain=FEATURES_DATA[i][0]
        Ytrain=TARGET[i][0]
        clf=DecisionTreeClassifier()
        clf.fit(Xtrain,Ytrain)
    

    【讨论】:

    • 这确实解决了问题。但是如何增加训练集的大小呢?例如这条线上的东西:Xtrain=Xtrain.append(FEATURES_DATA[i][0])
    • 如果您只是想将 Xtrain 的大小翻倍,并用重复项填充它,您可以这样做 Xtrain = numpy.concatenate((Xtrain,Xtrain))
    • 不要将大小加倍,而是希望 Xtrain 能够随着每次迭代而增长。因此,对于第一次迭代,它应该是 FEATURES_DATA[i][0],但对于第二次迭代,它应该是 FEATURES_DATA[i][0] 和 FEATURES_DATA[i][1] 连接的。我尝试了连接,它给了我一个错误“只有长度为 1 的数组可以转换为 Python 标量”
    • 根据您的打印输出,FEATURES_DATA[0][1] 不存在,应该引发异常。你能提供FEATURES_DATA的形状吗?试试print np.asarray(FEATURES_DATA).shape
    • 我得到以下输出:(6L, 1L)
    猜你喜欢
    • 2018-06-26
    • 2017-10-20
    • 2023-03-16
    • 2018-04-25
    • 2020-08-21
    • 2019-05-02
    • 2013-03-12
    • 2011-06-08
    相关资源
    最近更新 更多