web-dev-qa-db-ja.com

sklearn DeprecationWarning真理値の配列

Docsから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

以下は、一時的に警告を黙らせるためにnot workを持っています:

  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

15
rojobuffalo

この警告は、 空の配列の真の値のチェック を廃止した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

解決

Scikit-learnライブラリの issue 10449 に従って、これはライブラリのmasterブランチで修正されました。しかし、それは2018年8月頃に利用可能になるので、可能な代替案の1つは、この問題のないnumpyライブラリのより低いバージョン、つまり1.13.3を使用することです。これは、デフォルトでscikit-libraryがnumpyの最新バージョンを参照するためです(これは1.14.2ですこの回答を書いた時間)

Sudo pip install numpy==1.13.3

または次のようにpip3で

Sudo pip3 install numpy==1.13.3

警告を無視する

非推奨の警告を出しているライブラリの最新バージョン(この場合はnumpy)を使用し、非推奨の警告を黙らせたい場合、 filterwarnings pythonのメソッドを使用して- 警告 モジュール

以下の例に従うと、上記の質問で言及された非推奨の警告が生成されます。

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])

警告を与えるモジュールが複数あり、警告を選択的にサイレントにしたい場合は、module属性を使用します。例えばscikit学習モジュールからの非推奨のサイレント警告へ

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