问题原因
该错误是由于在使用多分类问题的评估指标时,指定了average='binary'的参数,但是目标变量不是二元分类问题,因此会出现该错误。
解决方法
更改average参数
根据错误提示中的信息,我们可以更改average参数的值,改为'micro', 'macro', 'weighted'或者None等其他可用的参数值,具体的含义如下:
- micro:计算全局的指标
- macro:对每个类别独立计算指标并求平均
- weighted:对每个类别独立计算指标并按照它们的实例数量加权求平均
- None:返回每个类别的指标,不进行平均
假如我们使用的指标是精确度(precision),可以这样更改:
from sklearn.metrics import precision_score
# 原始代码
precision_score(y_true, y_pred, average='binary')
# 更改后的代码
precision_score(y_true, y_pred, average='micro') # 或者average='macro'、'weighted'、None
更改目标变量
另外,如果目标变量确实只有两个类别,可以将它们转换成0和1的二元分类问题。比如,可以使用LabelEncoder将多分类问题的目标类别转换成二元分类问题:
from sklearn import preprocessing
# 原始的目标变量y
y = ['class1', 'class2', 'class1', 'class3', 'class2', 'class1']
# 将多类别变量转换为二元分类变量
le = preprocessing.LabelEncoder()
y_binary = le.fit_transform(y)
# 二元分类问题
y_binary
array([0, 1, 0, 2, 1, 0])
将 y 变成二元问题后,再调用之前的分数计算函数并指定average='binary'即可消除该错误。
from sklearn.metrics import precision_score
# 原始代码
precision_score(y_true, y_pred, average='binary')
# 更改后的代码
y_binary = le.fit_transform(y_true) # 将多类别变量转换为二元分类变量
precision_score(y_binary, y_pred, average='binary') # average='binary'