获取值错误'具有多个元素的数组的真值不明确。拟合火车数据后使用a.any()或a.all()'

时间:2019-05-02 12:55:47

标签: python multilabel-classification

我不断得到 ValueError:'具有多个元素的数组的真值是不明确的。在拟合我以前划分为训练集和测试集的数据时,使用a.any()或a.all()'。如何解决此错误?

我已经通过使用 shape 属性并打印每个 X,y 训练和测试集的标题检查了数据是否正确分割。

数据-是一个DataFrame,由一个'text'列和六个标签列组成。
功能 X -矢量化文本
标签 y -标签
data [['text']] -是向量的DataFrame
数据[['1','2','3','4','5','6']] -标签的DataFrame

更新
问题确实出在我的原始数据上,因为我的某些矢量的形状确实失真(例如(19,1))。方法 flatten()似乎可以解决问题,因为它返回折叠成一维的数组副本。

这是我拆分数据的方式:

from sklearn.model_selection import train_test_split

X_test, X_train, y_test, y_train = train_test_split(data[['text']],data [ ['1'  ,'2' ,  '3' , '4' ,'5','6' ] ] , random_state=42, test_size=0.30, shuffle=True)

这是合适的部分:

my_classifier = LabelPowerset(classifier = RandomForestClassifier(n_estimators=100),require_dense = [False, True])
my_classifier.fit(X_train, y_train)
print(X_test.shape)
print(X_train.shape)
print(y_test.shape)
print(y_train.shape)

输出:

(111699, 1)
(47872, 1)
(111699, 6)
(47872, 6)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-94-a59b7690b804> in <module>()
----> 1 my_classifier.fit(X_train, y_train)

~\Anaconda3\lib\site-packages\skmultilearn\problem_transform\lp.py in fit(self, X, y)
    136         """
    137         X = self._ensure_input_format(
--> 138             X, sparse_format='csr', enforce_sparse=True)
    139 
    140         self.classifier.fit(self._ensure_input_format(X),

~\Anaconda3\lib\site-packages\skmultilearn\base\base.py in _ensure_input_format(self, X, sparse_format, enforce_sparse)
     95                 return X
     96             else:
---> 97                 return matrix_creation_function_for_format(sparse_format)(X)
     98 
     99     def _ensure_output_format(self, matrix, sparse_format='csr', enforce_sparse=False):

~\Anaconda3\lib\site-packages\scipy\sparse\compressed.py in __init__(self, arg1, shape, dtype, copy)
     77                         self.format)
     78             from .coo import coo_matrix
---> 79             self._set_self(self.__class__(coo_matrix(arg1, dtype=dtype)))
     80 
     81         # Read matrix dimensions given, if any

~\Anaconda3\lib\site-packages\scipy\sparse\coo.py in __init__(self, arg1, shape, dtype, copy)
    183                     self._shape = check_shape(M.shape)
    184 
--> 185                 self.row, self.col = M.nonzero()
    186                 self.data = M[self.row, self.col]
    187                 self.has_canonical_format = True

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
X_train.head(5)

输出:

                                                  text
119105  [0.070629984, 0.09145695, 0.026743168, -0.0247...
131631  [0.15062076, 0.1616201, -0.24214625, -0.079838...
125326  [0.29536337, 0.148198, 0.19248627, 0.21796156,...
111256  [0.16876991, 0.035899613, -0.06388393, -0.2339...
83590   [0.14012083, 0.08112805, -0.079143375, -0.0808...
y_train.head(5)

输出:

        1   2   3   4   5   6
2783    0   0   0   0   0   0
109183  0   0   0   0   0   0
96229   0   0   0   0   0   0
128796  1   0   1   0   1   0
103592  0   0   0   0   0   0

整个矢量在每行X_train中的样子:

[ 4.0938530e-02  2.0466107e-01  2.3541172e-01 -2.2121635e-01
 -1.6204901e-01 -2.3460600e-01  9.9785912e-01 -2.0803943e-01
 -9.1773011e-02  7.8154532e-03 -4.5910537e-02  1.6967587e-01
 -4.1978297e+00 -2.0136276e-01  1.3398567e-03  6.2967308e-02
  2.1797931e-01 -3.2942373e-01 -1.3567382e-01 -3.2139298e-01
 -1.1644501e-01  3.7298296e-02 -3.3780817e-02 -1.4053656e-01
 -2.2851831e-01]
y_train.all()

输出:

1     False
2     False
3     False
4     False
5     False
6     False
dtype: bool
y_train.any()

输出:

1     True
2     True
3     True
4     True
5     True
6     True
dtype: bool

1 个答案:

答案 0 :(得分:2)

这源自您的数据格式。看来您的X_train只有两列:ID列和text列,它们是一个数组。您将希望将文本列拆分为类似于y_train的格式。

要了解错误消息,请考虑以下问题:

bool(5)
# True
bool(0)
# False

现在,如果您尝试将数组(您的数据)转换为bool,它将如何求值?

>>> a = np.array([3, 12, 5, 0, 2, 0])
>>> a.any()
True
>>> a.all()
False
>>> bool(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

错误告诉您,它是模棱两可的。使用a.any()检查是否有任何元素是True,并使用a.all()检查所有元素是否为真。

现在回到原始问题:在预构建sklearn函数中发生错误,这提示您放入其中的数据格式错误(与某些先决条件不匹配)功能)。 sklearn的模块端错误应该很少。

编辑:我实际上很确定数据格式是问题所在。如果遵循堆栈跟踪,则在检查非零值_ensure_input_format()时,会在self.row, self.col = M.nonzero()中发生错误。

编辑2:调整了提供数据的解决方案。