一、模型评估
1.什么事模型评估
模型评估指的是对机器学习模型在给定数据集上的性能进行评估和分析的过程。
2 .为什么要做模型评估:
机器学习的目的是使学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力。不同的学习方法会训练出不同的模型,不同的模型可能会对未知数据作出不同的预测,然而我们手上并没有“未知”的数据。所以,如何评价模型好坏,是整个学习的重要一步。
3.模型评估常见步骤
数据集划分:将数据集划分为训练集和测试集,训练集用于模型的训练和参数调优,测试集用于评估模型的性能。
模型训练:使用训练集对模型进行训练,学习数据的模式和特征。
模型评估:使用测试集对模型进行评估,得出模型在未知数据上的表现。评估指标可以包括准确率、精确率、召回率、F1值、ROC曲线、PR曲线等。
参数调优:根据评估结果对模型进行调优,例如调整超参数、特征选择等,以提升模型性能。
模型选择:在多个模型中选择最优的模型,通常会比较不同模型在同一数据集上的性能表现。
二、分类模型评估指标、
常见的分类模型评估指标包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1值和AUC值。这些指标可以通过混淆矩阵中的真阳性、假阳性、真阴性和假阴性计算得出。
1.准确率:是指模型预测为正类的样本中有多少是真正的正类,可以用来衡量模型的预测准确性。
其中,TP是真阳性(模型将正类预测为正类),TN是真阴性(模型将负类预测为负类),FP是假阳性(模型将负类预测为正类),FN是假阴性(模型将正类预测为负类)。
2.精确率:是指模型预测为正类的样本中有多少是真正的正类,可以用来衡量模型的预测准确性。
3.召回率:是指真正的正类有多少被模型预测为正类,也叫做敏感度或查全率
4.F1值:是精确率和召回率的调和平均值,综合考虑了模型的准确性和查全率,适用于不平衡数据集。
5.ROC曲线:是Receiver Operating Characteristic Curve的缩写,展示了模型在不同阈值下的召回率和假阳性率之间的关系。AUC值是ROC曲线下面积,用于评估模型在不同阈值下的性能。AUC值越接近1,表明模型性能越好;AUC值越接近0.5,表示模型性能越差,整体随机预测。
6.PR曲线:是Precision-Recall Curve的缩写,展示了模型在不同阈值下的精确率和召回率之间的关系。ROC曲线适用于类别平衡的数据集,而PR曲线适用于类别不平衡的数据集。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import precision_recall_curve, roc_curve, auc
# 生成一个随机数据集
X, y = make_classification(n_samples=1000, n_features=2, n_classes=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
# 将数据集分割成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 拟合KNN分类器
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 预测测试集的概率
y_prob = knn.predict_proba(X_test)[:, 1]
# 计算精确度-召回率曲线
precision, recall, thresholds = precision_recall_curve(y_test, y_prob)
# 计算精确度-召回率曲线下面积
pr_auc = auc(recall, precision)
# 绘制精确度-召回率曲线
plt.figure()
plt.plot(recall, precision, label='Precision-Recall curve (AUC = %0.2f)' % pr_auc)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc="lower right")
plt.show()
# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
# 计算ROC曲线下面积
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, label='ROC curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], '--', color='gray', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.show()