机器学习性能评估 - TreetoForest/LearningNotes GitHub Wiki
最全的性能评估绘图代码和案例位置在机器学习绘图
机器学习模型的性能评估指标可以根据不同的任务和模型类型而异。以下是一些常用的模型性能评估指标:
- 回归任务:
- 均方误差(MSE)
- 均方根误差(RMSE)
- 平均绝对误差(MAE)
- 决定系数(R²)
- 分类任务:
- 准确率(Accuracy)
- 精确率(Precision)
- 召回率(Recall)
- F1值(F1-Score)
- AUC-ROC曲线下面积(AUC-ROC)
- 聚类任务:
- 轮廓系数(Silhouette Coefficient)
- Calinski-Harabasz指数
- Davies-Bouldin指数
4.推荐系统:
- 均方根误差(RMSE)
- 平均绝对误差(MAE)
- 准确率(Precision)
- 召回率(Recall)
- F1值(F1-Score)
二、分类任务评价代码
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()