多标签分类是指每个样本可以被分配到多个类别中,即:可以拥有多个标签。比如:某条新闻既可以是军事类新闻、也可以是政治类新闻。
在评估多标签分类模型时,我们使用的是样本平均精确率、样本平均召回率和样本平均 F1 分数。
y_true = [['好评', '中评'], ['好评', '中评', '差评'], ['好评', '差评'], ['中评', '差评'], ['中评', '好评']] y_pred = [['中评', ], ['好评', '差评'], ['中评', ], ['好评', '差评'], ['中评', '好评']]
- \(N\) 表示样本数量
- \(Y_{i}\) 表示第 i 个样本真实标签集合
- \(f(x_{i})\) 表示第 i 个样本预测的标签集合
- \(Precision_{i}\) 表示第 i 个样本的精确度
- \(Recall_{i}\) 表示第 i 个样本的召回率
接下来,计算每个样本的精确度、召回率、f1-score 值如下:
样本1: 精确度:1.0 召回率:0.5 F1-score:0.6666666666666666 样本2: 精确度:1.0 召回率:0.6666666666666666 F1-score:0.8 样本3: 精确度:0.0 召回率:0.0 F1-score:0.0 样本4: 精确度:0.5 召回率:0.5 F1-score:0.5 样本5: 精确度:1.0 召回率:1.0 F1-score:1.0
计算每个指标的样本平均值:
精确度:0.7 召回率:0.5333333333333333 F1-score:0.5933333333333334
使用示例:
from sklearn.metrics import precision_score from sklearn.metrics import recall_score from sklearn.metrics import f1_score from sklearn.preprocessing import MultiLabelBinarizer import pandas as pd if __name__ == '__main__': # 真实和预测标签 y_true = [['好评', '中评'], ['好评', '中评', '差评'], ['好评', '差评'], ['中评', '差评'], ['中评', '好评']] y_pred = [['中评', ], ['好评', '差评'], ['中评', ], ['好评', '差评'], ['中评', '好评']] # 注意:必须对标签进行重新编码 mlb = MultiLabelBinarizer() y_true = mlb.fit_transform(y_true) y_pred = mlb.transform(y_pred) print(mlb.classes_) print(y_true) print(y_pred) result = precision_score(y_true, y_pred, average='samples') print('精确率:\t\t', result) result = recall_score(y_true, y_pred, average='samples') print('召回率:\t\t', result) result = f1_score(y_true, y_pred, average='samples') print('f1-score:\t', result)
['中评' '好评' '差评'] [[1 1 0] [1 1 1] [0 1 1] [1 0 1] [1 1 0]] [[1 0 0] [0 1 1] [1 0 0] [0 1 1] [1 1 0]] 精确率: 0.7 召回率: 0.5333333333333333 f1-score: 0.5933333333333334