我尝试使用Sci-Kit Learn软件包中的TfidifVectorizer和CountVectorizer,但是在导入它们时:
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
我收到以下警告消息:
/anaconda3/lib/python3.7/site-packages/sklearn/feature_extraction/text.py:17:DeprecationWarning:不建议使用“集合”而不是“ collections.abc”中的ABC或从其中导入ABC 3.8它将停止工作 从集合导入Mapping,defaultdict
此后,即使消息只是警告,我的代码也停止运行,表明出现了错误(即使未报告任何错误)。我想这就是我要提出警告的真正原因,因为这是我必须做的所有事情。 这是SKLearn的错误吗?自从python 3.7更新以来,开发人员在后面吗?任何有关我是否应该报告此问题或如何使用anaconda还原为python 3.6的建议都将不胜感激。谢谢!
答案 0 :(得分:1)
此弃用警告引起问题的可能性很小。默认情况下,所有警告仅打印一条消息,然后继续。警告可以视为异常,但是您会看到一个堆栈跟踪而不是警告文本。弃用警告是针对开发人员的,旨在告知开发人员他们的库将在将来的python版本中中断。它们并不适合最终用户,因为代码仍然可以正常工作。例如,根据警告,from collections import Mapping, defaultdict
仍适用于您的python版本(3.7),但不适用于python 3.8。
因此,此警告不太可能成为问题的根源。您看到它的原因是sklearn更改了默认警告过滤器,以便用户可以看到sklearn发出的弃用警告。 除非将警告设置为错误,否则警告不会更改执行流程。 要验证警告不是问题,您可以尝试在此工具中运行程序。这很hacky,但是需要停止sklearn覆盖默认的警告过滤器。通过使用警告过滤器的值,您应该能够看到不赞成使用警告不是问题的根源。
import warnings
from warnings import (
filterwarnings as original_filterwarnings,
simplefilter as original_simplefilter
)
def ignore_filterwarnings(*args, **kwargs):
pass
def ignore_simplefilter(*args, **kwargs):
pass
warnings.filterwarnings = ignore_filterwarnings
warnings.simplefilter = ignore_simplefilter
# no imports of sklearn should occur before the previous two lines (otherwise sklearn
# will get to use the original functions).
with warnings.catch_warnings():
original_simplefilter("ignore") # or "error" to see the difference
from my_main_module import main
main()