Ошибка получения значения 'Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all () 'после подгонки данных поезда - PullRequest
2 голосов
/ 02 мая 2019

Я получаю ValueError: 'Значение истинности массива с более чем одним элементом неоднозначно.Используйте a.any () или a.all () ' при подборе моих данных, которые ранее были разбиты на наборы поездов и тестов.Как устранить эту ошибку?

Я уже проверил, правильно ли были разделены мои данные, используя свойство shape и напечатав заголовок каждого X, y train инаборы тестов.

data - это DataFrame, который состоит из одного 'text' столбца и шести столбцов меток.
features X - векторизованные тексты
метки y - метки
data [['text']] - это DataFrame векторов
data [['1',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ']] - Фрейм данных меток

Обновление
Проблема действительно былас моими исходными данными, поскольку некоторые из моих векторов имели действительно искаженную форму (например, (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 Ответ

2 голосов
/ 02 мая 2019

Это происходит из формата ваших данных.Похоже, ваш X_train имеет только два столбца: столбец идентификатора и столбец 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: Скорректированное решение для предоставленных данных.

...