1. 分类指标
二分类可以参考下图:
准确率 = 预测对的样本数 / 全部样本数 精确率 = 被预测出的正例样本数 / 预测为正例的样本数 召回率 = 预测且真的是正例的样本数 / 正例的样本数 二分类F1 = 2 * 精确率 * 召回率 /(精确率 + 召回率)
多分类中F1一般用Macro F1 或Micro F1 :
- Macro F1:将n分类的评价拆成n个二分类的评价,计算每个二分类任务的F1 score,这些计算出来的F1 score求平均即为Macro F1
- Micro F1:将n分类的评价拆成n个二分类的评价,将n个二分类评价的TP、FP、RN对应相加(看混淆矩阵),计算得出每组的准确率与召回率,最后按照二分类计算F1的方法,代入公式得出的F1值即为Micro F1
因为Macro F1计算时每个样本的F1权重相同,最后求平均会受样本数量少的类别影响大,在数据各类样本不均衡的情况下,采用Micro F1 较为合理,其他情况两者都行,都是F1越大越好
2. 整合工具函数
使用工具方法:
import matplotlib.pyplot as plt
def get_score(true_data, result_prediction, save_roc_path=None, model_name=None):
"""
分类问题的得分辅助函数
:param true_data: 真实值,是要预测的目标
:param result_prediction: 预测值,用模型预测出来的值
:param save_roc_path: 保存roc曲线的路径
:param model_name: 模型名
:return:
"""
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score, f1_score
from sklearn.metrics import roc_curve, auc
acc = accuracy_score(true_data, result_prediction)
prec = precision_score(true_data, result_prediction)
recall = recall_score(true_data, result_prediction)
f1 = f1_score(true_data, result_prediction)
fpr, tpr, thersholds = roc_curve(true_data, result_prediction)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, 'k--', label='ROC (area = {0:.2f})'.format(roc_auc), lw=2)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
if save_roc_path:
plt.savefig(save_roc_path)
plt.show()
score_list = [acc, prec, recall, f1, roc_auc]
print('模型{}:'.format(model_name), score_list)
return score_list
3. 使用示例
import matplotlib.pyplot as plt
import numpy as np
def get_score(true_data, result_prediction, save_roc_path=None, model_name=None):
"""
分类问题的得分辅助函数
:param true_data: 真实值,是要预测的目标
:param result_prediction: 预测值,用模型预测出来的值
:param save_roc_path: 保存roc曲线的路径
:param model_name: 模型名
:return:
"""
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score, f1_score
from sklearn.metrics import roc_curve, auc
acc = accuracy_score(true_data, result_prediction)
prec = precision_score(true_data, result_prediction)
recall = recall_score(true_data, result_prediction)
f1 = f1_score(true_data, result_prediction)
fpr, tpr, thersholds = roc_curve(true_data, result_prediction)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, 'k--', label='ROC (area = {0:.2f})'.format(roc_auc), lw=2)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
if save_roc_path:
plt.savefig(save_roc_path)
plt.show()
score_list = [acc, prec, recall, f1, roc_auc]
print('模型{}:'.format(model_name), score_list)
return score_list
if __name__ == '__main__':
my_score = get_score(
true_data=np.random.randint(0, 2, size=100),
result_prediction=np.random.randint(0, 2, size=100),
)
返回值为:
模型None: [0.53, 0.6136363636363636, 0.47368421052631576, 0.5346534653465346, 0.5391676866585067]
这里列表中的值依次为:[准确率,精确率,召回率,F1,roc-auc],并且得到ROC曲线:
|