我不断得到 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
答案 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:调整了提供数据的解决方案。