sklearn DeprecationWarning значение истины массива

Запуск примера rasa_core из документов с

› python3 -m rasa_core.run -d models/dialogue -u models/nlu/default/current

и получить эту ошибку после каждого сообщения в диалоговом окне:

.../sklearn/...: DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use 'array.size > 0' to check that an array is not empty.

Это проблема с numpy, которая была исправлена, но не опубликована в последней версии: https://github.com/scikit-learn/scikit-learn/issues/10449

Следующее не помогло временно отключить предупреждение:

  1. Добавление -W ignore

python3 -W ignore -m rasa_core.run -d models/dialogue -u models/nlu/default/current

  1. warnings.simplefilter

python3

>>> warnings.simplefilter('ignore', DeprecationWarning)
>>> exit()

python3 -m rasa_core.run -d models/dialogue -u models/nlu/default/current

Ответы

Ответ 1

Это предупреждение вызвано numpy, которое не одобряло проверку значения истины в пустом массиве

Обоснованием для этого изменения является

Невозможно воспользоваться тем фактом, что пустые массивы False, потому что массив может быть False по другим причинам.

Проверьте следующий пример:

>>> import numpy as np
>>> bool(np.array([]))
False
>>> # but this is not a good way to test for emptiness, because...
>>> bool(np.array([0]))
False

Решение

Согласно выпуску 10449 на scikit-learn library, это было исправлено в основной ветке библиотеки. Однако это будет доступно примерно в августе 2018 года, поэтому одним из возможных альтернатив является использование меньшей версии библиотеки numpy, которая не имеет этой проблемы, т.е. 1.13.3, поскольку библиотека scikit по умолчанию будет ссылаться на последнюю версию numpy (которая равна 1.14.2 на время написания ответа)

sudo pip install numpy==1.13.3

или с pip3 следующим образом

sudo pip3 install numpy==1.13.3

Игнорирование предупреждения (ов)

Если мы хотим использовать последнюю версию библиотеки (в этом случае - numpy), которая дает предупреждение об устаревании и просто хочет отключить предупреждение об устаревании, тогда мы можем добиться этого, используя метод filterwarnings модуля python Warnings

В следующем примере ниже будет приведено предупреждение об утомлении, упомянутое выше:

from sklearn import preprocessing

if __name__ == '__main__':
    le = preprocessing.LabelEncoder()
    le.fit([1, 2, 2, 6])
    le.transform([1, 1, 2, 6])
    le.inverse_transform([0, 0, 1, 2])

производит

/usr/local/lib/python2.7/dist-packages/sklearn/preprocessing/label.py:151: DeprecationWarning: значение истины для пустого массива неоднозначно. Возврат False, но в будущем это приведет к ошибке. Используйте array.size > 0 чтобы проверить, что массив не пуст.

И чтобы позаботиться об этом, добавьте фильтрацию для DeprecationWarning

from sklearn import preprocessing
import warnings

if __name__ == '__main__':
    warnings.filterwarnings(action='ignore', category=DeprecationWarning)
    le = preprocessing.LabelEncoder()
    le.fit([1, 2, 2, 6])
    le.transform([1, 1, 2, 6])
    le.inverse_transform([0, 0, 1, 2])

Если есть несколько модулей, которые дают предупреждение, и мы хотим выборочно молчать, тогда используйте атрибут модуля. например, к молчаливому предупреждению об увольнении из модуля обучения scikit

warnings.filterwarnings(module='sklearn*', action='ignore', category=DeprecationWarning)