16

从文档中运行 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

4

2 回答 2

34

此警告是由 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 月左右可用,因此一种可能的替代方法是使用没有此问题的 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),它给出了弃用警告并且只想使弃用警告静音,那么我们可以通过使用python警告模块的filterwarnings方法来实现它

以下示例将产生上述问题中提到的弃用警告:

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)
于 2018-04-05T08:53:03.927 回答
0

我也有同样的问题。以下解决方案对我有用。转到警告中提到的路径文件和行号,如果您使用 anaconda,请转到 Anaconda\envs\py2\Lib\site-packages\sklearn\preprocessing\label.py 行号:151。

更改以下代码

if diff:
    raise ValueError("y contains new labels: %s" % str(diff))

到以下

if diff.size>0:
    raise ValueError("y contains new labels: %s" % str(diff))
于 2020-10-03T08:41:08.447 回答