机器学习性能评估 - TreetoForest/LearningNotes GitHub Wiki

最全的性能评估绘图代码和案例位置在机器学习绘图

机器学习模型的性能评估指标可以根据不同的任务和模型类型而异。以下是一些常用的模型性能评估指标:

  1. 回归任务:
  • 均方误差(MSE)
  • 均方根误差(RMSE)
  • 平均绝对误差(MAE)
  • 决定系数(R²)
  1. 分类任务:
  • 准确率(Accuracy)
  • 精确率(Precision)
  • 召回率(Recall)
  • F1值(F1-Score)
  • AUC-ROC曲线下面积(AUC-ROC)
  1. 聚类任务:
  • 轮廓系数(Silhouette Coefficient)
  • Calinski-Harabasz指数
  • Davies-Bouldin指数

4.推荐系统:

  • 均方根误差(RMSE)
  • 平均绝对误差(MAE)
  • 准确率(Precision)
  • 召回率(Recall)
  • F1值(F1-Score)

二、分类任务评价代码

参考资料:https://github.com/canerky96/NER-by-using-tweets/blob/a5306a6b91fe6c10decd9d3983dec8d678f4c923/classfiers/knn_classfier.py

1.分类评价代码

chatGPT代码

单分类标签代码

常规输出

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

#y_true是真实标签,y_pred是预测标签 
#average='weighted'是使用加权平均值来计算精确率、召回率和F1值;使用宏平均值或微平均值,请将average参数分别设置为'macro'或'micro'。
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred, average='weighted') 
recall = recall_score(y_true, y_pred, average='weighted')
f1 = f1_score(y_true, y_pred, average='weighted')

print("Accuracy: {:.2f}%".format(accuracy*100))
print("Precision: {:.2f}%".format(precision*100))
print("Recall: {:.2f}%".format(recall*100))
print("F1 Score: {:.2f}%".format(f1*100))

以表格形式输出

import pandas as pd
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

#y_true是真实标签,y_pred是预测标签
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred, average='weighted')
recall = recall_score(y_true, y_pred, average='weighted')
f1 = f1_score(y_true, y_pred, average='weighted')

#将四个指标的结果存储在一个数据帧中
df = pd.DataFrame({
    'Accuracy': [accuracy],
    'Precision': [precision],
    'Recall': [recall],
    'F1 Score': [f1]
})

#将数据帧输出为表格形式
print(df.to_string(index=False))

多分类标签代码

import pandas as pd
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# y_true是真实标签,y_pred是预测标签
labels = [0, 1, 2]  # 多个分类标签
accuracy_list, precision_list, recall_list, f1_list = [], [], [], []

# 计算每个标签的指标
for label in labels:
    y_true_label = [1 if x == label else 0 for x in y_true]
    y_pred_label = [1 if x == label else 0 for x in y_pred]

    accuracy = accuracy_score(y_true_label, y_pred_label)
    precision = precision_score(y_true_label, y_pred_label)
    recall = recall_score(y_true_label, y_pred_label)
    f1 = f1_score(y_true_label, y_pred_label)

    accuracy_list.append(accuracy)
    precision_list.append(precision)
    recall_list.append(recall)
    f1_list.append(f1)

# 将指标的结果存储在一个数据帧中
df = pd.DataFrame({
    'Label': labels,
    'Accuracy': accuracy_list,
    'Precision': precision_list,
    'Recall': recall_list,
    'F1 Score': f1_list
})

# 将数据帧输出为表格形式
print(df.to_string(index=False))

我们首先定义了多个分类标签,并使用for循环计算每个标签的准确率、精确率、召回率和F1值。在每次循环中,我们将y_true和y_pred中与当前标签相等的样本的标签值设置为1,其他样本的标签值设置为0,然后计算四个指标的值。

2.图片可视化代码

ROC曲线下面积

单个曲线的ROC曲线

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# y_true是真实标签,y_score是模型得分
fpr, tpr, thresholds = roc_curve(y_true, y_score)
roc_auc = auc(fpr, tpr)

# 绘制ROC曲线
plt.figure(figsize=(8, 6), dpi=600)
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
plt.savefig('roc_curve.jpg', dpi=600, bbox_inches='tight')
plt.show()

多曲线的ROC曲线

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# y_true是真实标签,y_scores是模型得分列表 !!! 需要先生成以一个y_scores列表
colors = ['darkorange', 'cornflowerblue', 'purple']  # 不同标签使用不同颜色
plt.figure(figsize=(8, 6), dpi=600)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')

# 绘制每个标签的ROC曲线
for i, y_score in enumerate(y_scores):
    fpr, tpr, thresholds = roc_curve(y_true[:, i], y_score)
    roc_auc = auc(fpr, tpr)
    plt.plot(fpr, tpr, color=colors[i], lw=2, label='ROC curve of label %d (area = %0.2f)' % (i, roc_auc))

# 设置图形属性
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")

# 保存图像并显示
plt.savefig('roc_curve.jpg', dpi=600, bbox_inches='tight')
plt.show()

PR曲线 precision-recall curves **

单标签分类PR曲线

import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score

# y_true是真实标签,y_score是模型得分
precision, recall, _ = precision_recall_curve(y_true, y_score)
ap = average_precision_score(y_true, y_score)

# 绘制PR曲线
plt.figure(figsize=(8, 6), dpi=600)
plt.plot(recall, precision, color='darkorange', lw=2, label='PR curve (AP = %0.2f)' % ap)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('Precision-Recall Curve')
plt.legend(loc="lower left")

# 保存图像并显示
plt.savefig('pr_curve.jpg', dpi=600, bbox_inches='tight')
plt.show()

多标签分类PR曲线

import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score

# y_true是真实标签,y_scores是模型得分列表
colors = ['darkorange', 'cornflowerblue', 'purple']  # 不同标签使用不同颜色
plt.figure(figsize=(8, 6), dpi=600)

# 绘制每个标签的PR曲线 #y_scores和enumerate函数都需要查一下并进行定义
for i, y_score in enumerate(y_scores):
    precision, recall, _ = precision_recall_curve(y_true[:, i], y_score)
    ap = average_precision_score(y_true[:, i], y_score)
    plt.plot(recall, precision, color=colors[i], lw=2, label='PR curve of label %d (AP = %0.2f)' % (i, ap))

# 设置图形属性
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc="lower left")

# 保存图像并显示
plt.savefig('pr_curve.jpg', dpi=600, bbox_inches='tight')
plt.show()