有网友指出,如果你正在使用或可能使用从 1.3.0 开始的任何 1.3.x 系列
Scikit-Learn 版本,代码中有包含对 classification_report()
、 f1_score()
或 fbeta_score()
的任何调用并且包含参数 zero_division=1.0
或 zero_division=np.nan
,那么得到的结果极大概率是错误的,如
>>> sklearn.__version__
'1.3.2'
>>> sklearn.metrics.f1_score(y_true=[0, 0, 1, 2, 3], y_pred=[0, 1, 0, 2, 3], zero_division=1.0, average="macro")
0.875 # Wrong
在上周最新发布的1.4.0
中,该bug已经被修复,同样的测试用例
>>> sklearn.__version__
'1.4.0'
>>> sklearn.metrics.f1_score(y_true=[0, 0, 1, 2, 3], y_pred=[0, 1, 0, 2, 3], zero_division=1.0, average="macro")
0.625 # Correct
除1.3.x系列外,低版本没有这个问题,如我电脑上为1.2.2
>>> from sklearn import metrics
>>>
>>> metrics.f1_score(y_true=[0, 0, 1, 2, 3], y_pred=[0, 1, 0, 2, 3], zero_division=1.0, average="macro")
0.625
1.3.0发布于2023年6月30号,直至2024年1月19号才正式推出修复版本,也就是说这半年期间如果你使用了这个api,大概率得到了错误的F1-Score,然后还作为实验数据填到了论文中(然后还发表了)
>>> sklearn.metrics.f1_score([0, 1], [1, 0], average='macro', zero_division=np.nan)
nan # should be 0.0
>>> sklearn.metrics.f1_score([0, 1, 2], [1, 0, 2], average='macro', zero_division=np.nan)
1.0 # should be ~0.67
虽然F1-Score的实现并不难,但部分人还是会依赖于这种可信度肥肠高的第三方库,使用简单。在网上搜索如何实现F1-Score,大部分答案都与sklearn
相关,当询问ChatGPT时,得到的答案也是这样
愣着干嘛,赶紧检查自己的版本与代码是否中招。。。
https://connorboyle.io/2023/12/17/sklearn-f1-bug.html