如何消除scikit-learn中的UndefinedMetricWarning警告?
如何消除scikit-learn中的UndefinedMetricWarning警告?
嘿,我太懂你这种被重复警告烦到的感觉了——用GridSearchCV调参时一直弹出这个关于Precision的UndefinedMetricWarning,试了好几种全局忽略警告的方法都不管用,确实闹心。
先给你理清楚,你之前试的那些全局忽略警告的方法没生效,大概率是因为这个警告是scikit-learn在内部计算评分的上下文里触发的,全局设置可能没覆盖到它的执行环境;而且硬压警告其实不如从根源解决问题,毕竟警告本身已经给了咱们解决方案:
方法一:从根源解决(推荐)
警告里明确提示了“Use zero_division parameter to control this behavior”,咱们不用绕远路,直接在评分逻辑里指定这个参数就行:
你之前用的scoring='precision'是简写形式,咱们可以换成用make_scorer创建的自定义评分器,显式设置zero_division:
from sklearn.metrics import make_scorer, precision_score from sklearn.model_selection import GridSearchCV # 创建带zero_division参数的精准度评分器 precision_scorer = make_scorer(precision_score, zero_division=1) # 这里可设0、1或warn,设1/0就不会触发警告 # 把这个自定义评分器传给GridSearchCV GridSearchCV(model, params, cv=10, scoring=precision_scorer, verbose=1, n_jobs=20, refit=True)
这样设置后,scikit-learn就知道遇到“没有预测样本”的情况该怎么处理Precision值,自然就不会再弹出警告了,这才是最规范的处理方式。
方法二:定向忽略该特定警告
如果你暂时不想修改评分逻辑,就想单纯关掉这个警告,那别用全局忽略,而是精准定向到这个警告类,这样不会影响其他有用的警告提示:
import warnings from sklearn.exceptions import UndefinedMetricWarning # 只忽略UndefinedMetricWarning这一种警告 warnings.filterwarnings("ignore", category=UndefinedMetricWarning) # 再运行你的GridSearchCV代码 GridSearchCV(model, params, cv=10, scoring='precision', verbose=1, n_jobs=20, refit=True)
之前的全局忽略没生效,可能是因为多进程(n_jobs=20)场景下,全局设置没传递到子进程,而这种定向忽略的方式在多进程环境下会更可靠。
备注:内容来源于stack exchange,提问作者SkyWalker
相关产品推荐
相关产品推荐

