机器学习——模型评估
文章目录
一.什么是模型评估
模型评估是指对训练的机器学习模型进行性能评估和验证的过程。模型评估旨在确定模型的泛化能力,即模型在未见过的数据上的表现。
1.1关于模型评估的一些相关概念
训练集、验证集和测试集:在模型训练过程中,通常将数据集划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于调整模型的超参数和评估模型的性能,而测试集则用于最终评估模型的泛化能力。
性能指标:模型评估的主要目标是使用适当的性能指标来衡量模型的表现。常见的性能指标包括准确率、精确率、召回率、F1分数、ROC曲线下面积(AUC-ROC)等。
交叉验证:交叉验证是一种常用的模型评估方法,它将数据集分成K个子集,每次使用其中一个子集作为验证集,其余子集作为训练集。通过多次交叉验证求取模型的平均性能,以减少评估结果的偶然性。
过拟合和欠拟合:模型评估也可以帮助识别模型的过拟合和欠拟合问题。过拟合指模型在训练集上表现良好但在测试集上表现较差,而欠拟合则指模型无法捕捉数据中的模式,导致在训练集和测试集上都表现不佳。
超参数调优:在模型评估过程中,通常需要调整模型的超参数以优化模型性能。超参数包括学习率、正则化参数、树的深度等,它们直接影响模型的复杂度和泛化能力。
1.2模型评估的类型
机器学习的任务有回归,分类和聚类,针对不同的任务有不同的评价指标。按照数据集的目标值不同,可以把模型评估分为分类模型评估和回归模型评估。
1.3常见的分类模型评估
1.混淆矩阵
混淆矩阵(Confusion Matrix)是在分类问题中用来评估模型性能的一种表格。它是一个二维矩阵,用于展示模型预测结果与实际标签之间的关系。混淆矩阵通常用于二分类问题,但也可以扩展到多分类问题。
混淆矩阵的构成如下:
真正例(True Positive, TP):模型将正类样本正确地预测为正类。
假正例(False Positive, FP):模型将负类样本错误地预测为正类。
真负例(True Negative, TN):模型将负类样本正确地预测为负类。
假负例(False Negative, FN):模型将正类样本错误地预测为负类。
混淆矩阵的结构:
其中想得到的结果就是对角线的值。
混淆矩阵的用途包括:
1.评估模型性能:混淆矩阵提供了对模型分类性能的全面评估,可以清楚地了解模型在不同类别上的预测准确性和错误率。
2.计算准确率、精确率、召回率和F1分数:基于混淆矩阵可以计算各种分类指标,如准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1分数(F1 Score),这些指标能够更全面地评价模型性能。
准确率:
准确率是最常用的分类性能指标。
Accuracy = (TP+TN)/(TP+FN+FP+TN)
预测正确的数占样本总数的比例,即正确预测的正反例数 /总数。
精确率:
精确率容易和准确率被混为一谈。
其实,精确率只是针对预测正确的正样本而不是所有预测正确的样本。
表现为预测出是正的里面有多少真正是正的。可理解为查准率。
Precision = TP/(TP+FP)
即正确预测的正例数 /预测正例总数
召回率:
召回率表现出在实际正样本中,分类器能预测出多少。
与真正率相等,可理解为查全率。正确预测为正占全部正校本的比例
Recall = TP/(TP+FN),即正确预测的正例数 /实际正例总数
F1-score(评估模型稳健性):
F值是精确率和召回率的调和值,更接近于两个数较小的那个,所以精确率和召回率接近时,F值最大。很多推荐系统的评测指标就是用F值的。
2/F1 = 1/Precision + 1/Recall
3.调整模型阈值:通过调整模型的分类阈值,可以改变混淆矩阵中的真正例和假正例的数量,从而优化模型的性能,达到更好的平衡。
4.诊断模型问题:混淆矩阵可以帮助识别模型的问题,比如过拟合或欠拟合,以及模型对不同类别的预测偏差。
二.模型评估的一些指标曲线
1.AUC曲线
AUC曲线是ROC(Receiver Operating Characteristic,受试者工作特征)曲线下的面积,ROC曲线是以假正例率(False Positive Rate, FPR)为横轴,真正例率(True Positive Rate, TPR)为纵轴绘制的曲线。
在AUC曲线中,横轴代表假正例率,即模型错误地将负类样本预测为正类的比率,通常计算公式为:
FPR= FP/(TN+FP)
纵轴代表真正例率,即模型正确地将正类样本预测为正类的比率,计算公式为:TPR= TP/(FN+TP)
在ROC曲线中,随着分类阈值的变化,真正例率和假正例率会相应地变化。ROC曲线越接近左上角,表示模型的性能越好。当ROC曲线接近斜率为1的对角线时,说明模型的性能与随机猜测无异;而ROC曲线越向左下角偏移,表示模型性能越差。
AUC曲线的面积(AUC)代表了ROC曲线下的面积,通常取值范围为0到1。AUC越接近1,表示模型的性能越好;AUC等于0.5时,表示模型性能与随机猜测相当;AUC小于0.5时,表示模型性能较差,甚至可能是完全相反的。
2.PR曲线
PR(Precision-Recall)曲线是用于评估二分类模型性能的另一种常见方法,与AUC曲线相比,PR曲线更适用于不平衡类别分布的情况。PR曲线以精确率(Precision)为纵轴,召回率(Recall)为横轴绘制。
精确率和召回率的计算方法如下:
精确率(Precision):精确率是指在模型预测为正类的样本中,实际为正类的比例。计算公式为:
召回率(Recall):召回率是指在所有真正的正类样本中,被模型正确预测为正类的比例。计算公式为:
PR曲线展示了在不同阈值下的精确率和召回率之间的关系。通常情况下,随着分类阈值的增加,精确率会增加而召回率会减少,反之亦然。PR曲线越接近右上角,表示模型的性能越好。
与AUC曲线不同,PR曲线下的面积(AUC-PR)通常用来评估模型性能。AUC-PR的取值范围在0到1之间,与AUC不同,AUC-PR的值越接近1,表示模型的性能越好。
PR曲线的主要优点在于它对不平衡数据集更为敏感,更能够反映出模型在少数类别上的性能。因此,当数据集中的正类别样本数量较少时,使用PR曲线进行性能评估更为合适。
三.具体实现
1.PR曲线绘制
from sklearn.metrics import precision_recall_curve
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
# 生成数据集
X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.1, 0.9], random_state=1)
# 训练模型
model = LogisticRegression()
model.fit(X, y)
# 预测概率
yhat = model.predict_proba(X)
probs = yhat[:, 1] # 提取模型预测每个样本属于正类的概率
# 计算精确率和召回率
precision, recall, _ = precision_recall_curve(y, probs)
# 绘制 PR 曲线
plt.plot(recall, precision, marker='.')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.show()
结果:
2.ROC曲线绘制
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
def plot(tpr,fpr):#画出函数图像
fig = plt.figure()
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
plt.xlabel('假正例率(FPR)',fontproperties=font)
plt.ylabel('真正例率(TPR)',fontproperties=font)
x = np.arange(0,1.1,0.2)
y = np.arange(0,1.1,0.2)
plt.xticks(x)
plt.yticks(y)
plt.plot(fpr,tpr)
x1 = np.arange(0, 1.0, 0.1)
plt.plot(x1, x1, color='blue', linewidth=2, linestyle='--')
plt.show()
def caculate():
tp = 0
#初始化样本标签,假设1为正例,0为负例
trainlabel = np.random.randint(0,2,size=100)
#产生100个概率值(置信度),即单个样本值为正例的概率
traindata = np.random.rand(100)
#将样本数据为正例概率从大到小排序返回索引值
sortedTraindata = traindata.argsort()[::-1]
k = []
v = []
#统计样本中实际正例的数量
num = np.sum(trainlabel==1)
num1 = 100 - num
for i in range(100):
num_guess = i+1#假设为真的数量
for j in range(0,i+1):
a = sortedTraindata[j]
if trainlabel[a] == 1:
tp += 1#假设为真中实际也为真的数量
fp = num_guess - tp
fpr = float(fp/(num1))
tpr = float(tp/(num))
v.append(fpr)
k.append(tpr)
tp = 0
plot(k,v)
if __name__=='__main__':
caculate()
结果:
四.PR曲线和ROC曲线差异
目标不同:
PR曲线关注的是精确度(Precision)和召回率(Recall),这对于不平衡数据集是非常重要的,特别是当负例数量远远超过正例数量时。
ROC曲线关注的是真正例率(True Positive Rate,也称为召回率)和假正例率(False Positive Rate),它对于各种类别的数据集都是有效的。
评价角度不同:
PR曲线主要评估的是在预测为正例的样本中,有多少是真正例,以及模型能够发现多少正例。
ROC曲线主要评估的是模型在负例中误判为正例的比例和模型在正例中的发现率。
应用场景不同:
当正例的重要性比较高时,或者数据集不平衡时,PR曲线更适合用来评估模型性能。
当类别平衡或者假正例的代价不高时,ROC曲线通常更合适。
解读方式不同:
PR曲线的理想情况是向右上角移动,即Precision和Recall同时增加。
ROC曲线的理想情况是向左上角移动,即True Positive Rate增加,而False Positive Rate减少。
总的来说,PR曲线和ROC曲线提供了对分类器性能的不同视角,选择哪种曲线取决于具体的应用场景和数据特点。