1.为什么要进行模型评估
在机器学习中,得出模型是我们的目的。但是我们需要分析我们得到的这个模型,在上面情况下表现效果好,什么情况下效果差。以便于我们去优化算法,调整网络结构,或者说是对数据集进行进一步的处理。
2.模型一般会出现什么问题?
机器学习之欠拟合、过拟合详解(附实例和对应解决办法)_过拟合 demo-CSDN博客
上面是原图链接
欠拟合:在训练数据上表现不佳,不能很好地拟合训练数据中的模式和趋势,同时也不能很好地泛化到新的测试数据上。
过拟合:在模型训练的时候 ,将样本的噪声是为特征点,导致遇到正确的模型也无法正确分辨
3.评估指标
对于模型的评估不是用好或者坏来评判的,需要用一些比较专业的属性来判断
以下介绍几种比较常见的评估指标:
-
准确率(Accuracy):准确率是最常见的评估指标之一,表示模型正确预测的样本占总样本数量的比例。对于二分类问题,准确率可以简单地计算为正确预测的正样本和负样本之和除以总样本数。然而,当数据集存在类别不平衡问题时,准确率可能并不是一个准确的评估指标。
-
精确率(Precision)和召回率(Recall):精确率和召回率主要用于处理二分类问题中的不平衡数据集。精确率表示预测为正类别的样本中,真正为正类别的样本的比例,计算公式为真正为正类别的样本数除以所有被预测为正类别的样本数。召回率表示真正为正类别的样本中,被正确预测为正类别的样本的比例,计算公式为真正为正类别的样本数除以所有实际为正类别的样本数。这两个指标通常是相互竞争的,需要根据具体问题的需求进行权衡。
-
F1值(F1-Score):F1值是精确率和召回率的调和平均数,用于综合考虑模型的预测准确性和召回能力。F1值的计算公式为2 * (精确率 * 召回率) / (精确率 + 召回率)。F1值越高,表示模型在准确率和召回率之间取得了更好的平衡。
-
均方误差(Mean Squared Error,MSE):均方误差用于回归问题中,表示模型预测值与真实值之间的差异程度。计算公式为所有样本的预测误差的平方和除以样本数量。对于均方误差,数值越小表示模型预测的越准确。
-
对数损失(Log Loss):对数损失也常用于二分类和多分类问题中,特别适用于概率预测问题。对数损失衡量模型预测的置信度与实际标签之间的差异。对数损失越小,表示模型的预测越准确。
除了上述指标,还可以根据实际需求计算其他指标,如召回率等。
4.代码实现
我们一般会用python 的 matlib的库去做数据的可视化,并且通过上述的指标弄出一系列的关系图,方便我们更加直观的去观察我们的模型
ROC曲线(受试者工作特征曲线)是一种用于评估二分类模型性能的工具,它显示出模型在不同阈值下真正例率(True Positive Rate)和假正例率(False Positive Rate)之间的关系。ROC曲线通常被用来帮助选择最佳的分类器模型,并且可以通过计算曲线下方的面积(AUC)来量化模型性能。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.metrics import roc_auc_score, roc_curve
# 构造样本标签和预测概率(以二分类问题为例)
y_true = np.array([0, 0, 1, 1, 0, 1])
y_scores = np.array([0.1, 0.3, 0.45, 0.55, 0.6, 0.8])
# 计算真阳性率和假阳性率
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
# 计算 AUC(曲线下面积)
auc = roc_auc_score(y_true, y_scores)
# 绘制 ROC 曲线
plt.figure()
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % auc)
plt.plot([0, 1], [0, 1], 'k--') # 绘制对角线
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc="lower right")
plt.show()
True Positive Rate 召回率
False Positive Rate 假阳性率
PR曲线是以召回率为横坐标,精确率为纵坐标画出的曲线,每个点对应着分类器在不同阈值下的精确率和召回率。
与ROC曲线不同,PR曲线更加关注正类样本,适用于数据集不平衡或关注查准率的问题。PR曲线通常呈现为一个递增的曲线,它的起点是(0,1),表示没有预测为正类的样本,所有的样本都是正确预测为负类。终点是(1,1),表示所有的样本都被正确预测为正类。
通过观察PR曲线的形状和曲线下方的面积(Average Precision),可以评估模型的性能。通常,PR曲线下方的面积越大,模型的性能越好。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.metrics import roc_auc_score, roc_curve
# 构造样本标签和预测概率(以二分类问题为例)
y_true = np.array([0, 0, 1, 1, 0, 1])
y_scores = np.array([0.1, 0.3, 0.45, 0.55, 0.6, 0.8])
# 计算精度和召回率
precision, recall, thresholds = metrics.precision_recall_curve(y_true, y_scores)
# 计算平均精度(Average Precision,AP)
ap = metrics.average_precision_score(y_true, y_scores)
# 绘制 PR 曲线
plt.plot(recall, precision, label='PR curve (AP = {:.2f})'.format(ap))
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc='lower left')
plt.show()
5.总结
对于不同的模型,评估办法也不是确定的,在实际运用的过程中,我们需要多方借鉴,不断的修改网络结构,参数等一系列来优化我们的模型。