概述
模型评估定义
模型评估(model assessment)是指对于一种具体方法输出的最终模型,使用一些指标和方法来评价它的泛化能力。这一步骤通常在模型训练和模型选择之后,正式部署模型之前。通俗地说就是对训练好的模型进行评估。评判模型将来的工作性能如何,选择出表达数据的最佳模型。分为分类模型评估和回归模型评估两类。
流程
一方面我们在假设空间上训练得到的模型可能不止一个,需要从中进行选择;另一方面对于一个具体问题,我们可能希望尝试不同方法,于是就有了不同的模型,在这些模型训练结束后,我们需要决定使用哪一个,但这种模型选择往往需要结合模型评估方法,因为对于某种归纳偏好,不同方法下的不同模型的实现各不相同,只能根据在测试集上的最终表现效果来选择,这就是我们要进行模型选择和评估的原因。
-
数据准备
分割数据集: 将数据分为训练集、验证集和测试集。训练集用于模型学习,验证集用于调整模型参数,**测试集用于最终评估**。 确保数据代表性: 确保所有数据子集都能代表整个数据的分布,以避免评估偏差。
-
选择评估指标
准确性指标: 如准确率、召回率、精确率、F1分数等,这些指标用于衡量**分类模型**的性能。 误差指标: 如均方误差(MSE)、平均绝对误差(MAE)等,用于**回归模型**。 其他指标: 如AUC-ROC曲线、混淆矩阵等,根据具体应用选择适合的评估指标。
-
进行基线测试
建立基线模型: 在更复杂的模型训练之前,先用一个简单的模型(如线性模型)建立性能基线。 比较性能: 将后续模型的性能与基线模型进行比较,以评估改进的程度。
-
训练模型与交叉验证
交叉验证: 使用交叉验证方法(如k折交叉验证)来评估模型在不同数据子集上的稳定性和泛化能力。 记录性能: 在每次验证过程中记录模型的性能指标。
-
调整模型参数
参数调优: 根据验证集上的表现调整模型参数,如学习率、正则化系数等。 使用网格搜索或随机搜索: 自动化参数选择过程以找到最佳参数组合。
-
最终评估
使用测试集: 在最终的测试集上评估模型性能,以得到模型在未见数据上的表现。 避免数据泄露: 确保在此过程中不会用到任何训练或验证数据。
-
误差分析
分析错误: 检查模型在哪些类型的数据上出错,以及错误的可能原因。 调整模型或数据: 根据误差分析结果进行模型调整或数据预处理的改进。
-
模型迭代
持续改进: 根据评估结果持续优化模型。
模型选择的两大方法
1.正则化
它与结构风险最小化等价,用于规避模型过拟合的问题,在模型选择中,正则化方法也同样被用来对模型复杂度进行惩罚,避免模型由于过度追求训练集上的效果而过度偏向复杂模型,导致过拟合,降低泛化能力下图说明了模型复杂度和泛化能力:
2.交叉验证
交叉验证在样本量足够大的理想情况下,应当把数据集分割为三部分:训练集(training set)、验证集(validation set)和测试集(testing set),分别用于模型训练、模型选择和模型评估,用于评估模型泛化能力的测试集只出现在最后的模型评估环节。但很多时候数据不够充足,这种时候可以取消验证集,采用交叉验证方法,通过反复划分训练集和测试集来避免用同一批数据训练和评估一个模型,相当于将验证集和测试集合二为一了,下面具体进行介绍:
交叉验证(cross validation)指的是对有限的数据集进行随机划分,利用分割后的部分组成训练集和测试集,进而重复进行模型的训练、选择和评估。常用的交叉验证法有三种:
简单交叉验证/留出法(hold-out):将数据集按一定比例随机分为两部分:训练集和测试集,分别在其上训练和测试所有备选模型,选出测试结果最好的,这相当于用模型评估代替了模型选择,直接砍掉验证集来增加其余两个集合的样本量,简单粗暴;
K折交叉验证(k-fold cross validation):将数据集随机划分为 K个大小相同或基本相同的子集,分别把每一个子集作为测试集,其余 (K−1) 个子集作为训练集,就得到了 K组不同的训练、测试集,在这 K组训练、测试集上训练并测试每一种模型,选择平均测试误差最小的模型;有时为了避免单次随机划分的特殊性,还会进行多次随机划分,将多个交叉验证的结果再进行一次平均;
留一交叉验证(leave-one-out cross validation):K折交叉验证的特例,将K取为样本量N,也即把每个样本单独作为测试集,其余样本作为训练集。这种方法的计算量较大,一般仅用于数据稀少的情况。当样本量实在过小时,可以考虑采用有放回抽样,抽取次数和原数据集样本量相等,形成一个新的样本作为训练集,而将未被抽到过的样本全体作为测试集,这种在样本量较小的情况下构造样本的想法来源于统计学中的自助法(bootstrapping)。
正常机器学习流程中,我们会把原始数据划分为训练集和测试集,测试集作为最后对模型检验的标准。可见测试集就和高考一样,非常重要,只有一次,在此之前,机器学习模型只能在训练集中进行训练和学习但是机器也需要考试来检验他们自己的学习情况呀,但他们又只有训练集可以利用,怎么办呢?
交叉验证就可以解决机器学习模型需要”考试“的问题。即将训练集中的一部分数据作为验证集对机器学习进行验证,起到考试的作用。
# 分类问题中的评估指标
1. 准确率
-
描述:所有分类正确样本占总样本数的比例
-
公式:
2.精确率 -
精确度:正确预测为正的样本数与所有预测为正的样本数的比例
-
公式:
3.召回率 -
召回率:正确预测为正的样本数(TP)与所有实际为正的样本数(TP+FN)的比例
-
公式:
4.混淆矩阵(二分类度量指标) -
混淆矩阵:一个表格显示模型对每个类别的预测数量和实际数量。
-
表格:
5.F1-Score
- 描述:精确率和召回率的调和平均值,F1的大小反映了模型的稳定性,数值越大说明越稳定。
- 公式:
6.PR曲线
- 描述:PR曲线的横坐标是精确率P,纵坐标是召回率R。评价标准先看平滑不平滑(蓝线明显好些)。一般来说,在同一测试集,上面的比下面的好(绿线比红线好)。当P和R的值接近时,F1值最大,此时画连接(0,0)和(1,1)的线,线和PRC重合的地方的F1是这条线最大的F1(光滑的情况下),此时的F1对于PRC就好像AUC对于ROC一样。一个数字比一条线更方便调型。
- 图形:
7.ROC和AUC曲线
类似于P-R曲线根据学习器预测结果对样例排序,并逐个作为正例进行预测,以“假正例率”(FPR)为横轴,“真正例率”(TPR)为纵轴可得到ROC曲线,全称“受试者工作特征”(Receiver Operating Characteristic)曲线。相比于PR曲线,ROC曲线对样本类别的比例不敏感,更能反映模型预测性能
若某个学习器的ROC曲线被另一个学习器的曲线“包住”,则后者性能优于前者;否者如果曲线交叉,可以根据ROC曲线下面积大小进行比较,也即AUC值。AUC 衡量了样本预测的排序质量,
回归问题中的评估指标
-
均方根误差(Root Mean Squared Frror RMSE)
描述:衡量回归模型的误差率,仅能比较误差是相同单位的模型
-
相对平方误差(Relative Squared Error RSE)
描述:不同于RMSE,可以比较误差是不同单位的模型
-
平均绝对误差(Mean Absolute Error MAE)
描述:与原始数据单位相同,仅能比较误差是相同单位的模型。量级近似RMSE,但误差值更相对小一点。
-
相对绝对误差(Relative Absolute Error RAE)
描述:不同于MAE,可以比较误差是不同单位的模型。
5决定系数(Coefficient of Determination)
决定系数(R²)回归模型汇总了回归模型的解释度, 由平方和术语计算而得。
R²描述了回归模型所解释的因变量方差在总方差中的比例。R²很大, 即自变量和因变量之间存在线性关系, 如果回归模型是“完美的”, SSE为零, 则R²为1。R²小, 则自变量和因变量之间存在线性关系的证据不令人信服。如果回归模型完全失败, SSE等于SST, 没有方差可被回归解释, 则R²为零。
代码实现
下面展示部分案例。
# ####分类模型评估指标########################################################
from sklearn.metrics import precision_score,recall_score
# 准确率print("precision_score:",precision_score(y_train_5,y_train_pred))
# 召回率print("recall_score:",recall_score(y_train_5,y_train_pred))
# F1分数print("f1_score:",f1_score(y_train_5,y_train_pred))
# ####ROC曲线#################################################################
from sklearn.metrics import roc_curve
y_scores = sgd_clf.decision_function(X_train)
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)
def plot_roc_curve(fpr, tpr, label=None):
plt.plot(fpr, tpr, linewidth=2, label=label)
plt.plot([0, 1], [0, 1], 'k--')
plt.axis([0, 1, 0, 1])
plt.xlabel('False Positive Rate', fontsize=16)
plt.ylabel('True Positive Rate', fontsize=16)
plt.figure(figsize=(8, 6))
plot_roc_curve(fpr, tpr)
plt.show()
# ####混淆矩阵#############################################################
from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(sgd_clf,X_train,y_train_5,cv = 3)
print(y_train_pred.shape)
print(X_train.shape)
from sklearn.metrics import confusion_matrixconfusion_matrix(y_train_5,y_train_pred)
# ####自己实现交叉验证#####################################################
from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone
# K折抽取数据的对象
skflods = StratifiedKFold(n_splits=3, random_state=520 , shuffle= True)
for train_index, test_index in skflods.split(X_train, y_train_5):
# 将模型克隆一份
clone_clf = clone(sgd_clf)
# 将训练集划分为更小的训练集和验证集
X_train_folds = X_train.iloc[train_index]
y_train_folds = y_train_5.iloc[train_index]
X_test_folds = X_train.iloc[test_index]
y_test_folds = y_train_5.iloc[test_index]
# 训练克隆的模型 clone_clf.fit(X_train_folds, y_train_folds)
# 进行预测
y_pred = clone_clf.predict(X_test_folds)
# 计算当前交叉验证的预测正确的样本数
n_correct = sum(y_pred==y_test_folds)
# 输出当前交叉验证的准确率
print(n_correct / len(y_pred))
总结
模型评估是构建机器学习模型过程中至关重要的一环,它可以帮助我们评估模型的性能、改进模型并优化预测能力。
通过本文的深入探讨,读者可以更好地理解模型评估的意义和方法, 并将其应用到实际的数据科学项目中,为模型的建立和优化提供有效指导。
愿每位数据科学家都能在模型评估中找到更好的方向,让数据发挥出更大的价值。