目录

一、评估指标及其局限性

1. 准确率

2. 精准率和召回率

3. 平方根误差

二、ROC曲线与AUC

1. ROC计算

2. AUC计算

3. AUC实现

三、模型评估方法

1. Holdout检验

2. 交叉检验

3.  自助法

四、过拟合与欠拟合

1. 过拟合、欠拟合现象

2. 如何解决

五、超参数调优

1. 网格搜索

2. 随机搜索

3. 贝叶斯优化算法


一、评估指标及其局限性

1. 准确率

准确率是分类问题中最简单也是最直观的评价指标, 但存在明显的缺陷。 比如, 当负样本占99%时, 分类器把所有样本都预测为负样本也可以获得99%的准确率。 所以, 当不同类别的样本比例非常不均衡时, 占比大的类别往往成为影响准确率的最主要因素。为了解决这个问题, 可以使用更为有效的平均准确率(每个类别下的样本准确率的算术平均) 作为模型评估的指标

2. 精准率和召回率

P-R曲线的横轴是召回率, 纵轴是精确率。 对于一个排序模型来说, 其P-R曲线上的一个点代表着, 在某一阈值下, 模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本, 此时返回结果对应的召回率和精确率。即当阈值提高时,判定为正样本的标准更加严格,Precision值计算更加严格,分类器需要分类器需要尽量在“更有把握”时才把样本预测为正样本,FP减少,Precision值提高, 但此时往往会因为过于保守而漏掉很多“没有把握”的正样本, 导致Recall值降低

为更全面的评估模型,引入F1-SCORE,是精准率和召回率的调和平均值

3. 平方根误差

RMSE经常被用来衡量回归模型的好坏.一般情况下, RMSE能够很好地反映回归模型预测值与真实值的偏离程度。 但在实际问题中, 如果存在个别偏离程度非常大的离群点(Outlier) 时, 即使离群点数量非常少, 也会让RMSE指标变得很差。

针对这个问题, 有什么解决方案呢? 可以从三个角度来思考。 第一, 如果我们认定这些离群点是“噪声点”的话, 就需要在数据预处理的阶段把这些噪声点过滤掉。 第二, 如果不认为这些离群点是“噪声点”的话, 就需要进一步提高模型的预测能力, 将离群点产生的机制建模进去(这是一个宏大的话题, 这里就不展开讨论了) 。 第三, 可以找一个更合适的指标来评估该模型。 关于评估指标, 其实是存在比RMSE的鲁棒性更好的指标, 比如平均绝对百分比误差(Mean AbsolutePercent Error, MAPE) :

相比RMSE, MAPE相当于把每个点的误差进行了归一化, 降低了个别离群点带来的绝对误差的影响

二、ROC曲线与AUC

1. ROC计算

ROC曲线横坐标为假阳性率/假正率(False Positive Rate, FPR),预测为正但实际为负的样本占所有负例样本的比例;

纵坐标为真阳性率/ 真正率(True Positive Rate, TPR),即召回率,预测为正且实际为正的样本占所有正例样本的比例。

事实上, ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的,在二值分类问题中, 模型的输出一般都是预测样本为正例的概率。 假设测试集中有20个样本,样本按照预测概率从高到低排序。 在输出最终的正例、 负例之前, 我们需要指定一个阈值, 预测概率大于该阈值的样本会被判为正例, 小于该阈值的样本则会被判为负例。 上面所说的“截断点”指的就是区分正负预测结果的阈值

通过动态地调整截断点, 从最高的得分开始(实际上是从正无穷开始, 对应着ROC曲线的零点) , 逐渐调整到最低得分, 每一个截断点都会对应一个FPR和TPR, 在ROC图上绘制出每个截断点对应的位置, 再连接所有点就得到最终的ROC曲线。

样本输出概率
样本序号 真实标签 模型输出概率 样本序号 真实标签 模型输出概率
1 p 0.9 11 p 0.4
2 p 0.8 12 n 0.39
3 n 0.7 13 p 0.38
4 p 0.6 14 n 0.37
5 p 0.55 15 n 0.36
6 p 0.54 16 n 0.35
7 n 0.53 17 p 0.34
8 n 0.52 18 n 0.33
9 p 0.51 19 p 0.30

10

n 0.505 20 n 0.1

如图所示,ROC曲线的绘制实际上是 遍历每个样本的 模型输出概率作为阈值(截断点),求该点对应的FPR,TPR

如 遍历到样本5,此时截断点(阈值)为0.55,即求0.55的横坐标与纵坐标。真实类别正样本数量为10,负为10

(1)当 阈值为0.55时,大于0.55的点被判定为正样本,否则被判断为负样本,则样本1-5 为 正,6-20为负

(2)此时  ,TP为1,2,4,5, ,FP为3

2. AUC计算

AUC指的是ROC曲线下的面积大小, 该值能够量化地反映基于ROC曲线衡量出的模型性能。 计算AUC值只需要就可以了。由于ROC曲线一般都处于y=x这条直线的上方(如果不是的话, 只要把模型预测的概率反转成1-p就可以得到一个更好的分类器) , 所以AUC的取值一般在0.5~1之间。 AUC越大, 说明分类器越可能把真正的正样本排在前面, 分类性能越好。

AUC的计算主要以下几种方法:

(1)计算ROC曲线下的面积,即沿着ROC横轴做积分。这是比较直接的一种方法,可以近似计算ROC曲线一个个小梯形的面积。几乎不会用这种方法
(2)从AUC统计意义去计算。在有M个正样本,N个负样本的数据集里。一共有M*N对样本(一对样本即,一个正样本与一个负样本)。统计这M*N对样本里,正样本的预测概率大于负样本的预测概率的个数。 公式如下:

具体的做法如下:

  1. 首先对prob score从大到小排序,然后令最大prob score对应的sample 的rank为n,第二大score对应sample的rank为n-1,以此类推。
  2. 然后把所有的正类样本的rank相加,再减去M-1种两个正样本组合的情况。得到的就是所有的样本中有多少对正类样本的score大于负类样本的score。最后再除以M×N。公式如下:

3. AUC实现

def calAUC(labels,prob):f = list(zip(prob,labels))  # [(0.9, 1), (0.7, 0), (0.6, 1), (0.55, 1), (0.52, 0), (0.4, 1), (0.38, 0), (0.35, 0), (0.31, 1), (0.1, 0)]rank = [values2 for values1,values2 in sorted(f,key=lambda x:x[0])]   # 按概率值从低到高 排列 样本真实值# rank  [0, 1, 0, 0, 1, 0, 1, 1, 0, 1]rankList = [i+1 for i in range(len(rank)) if rank[i]==1]   # 正样本位置#ranklist   [2, 5, 7, 8, 10] # 统计 正样本 负样本个数posNum = sum(labels) # 正 为1negNum = len(preds) - posNum  # 负 为总样本个数-正个数auc = (sum(rankList)- (posNum*(posNum+1))/2)/(posNum*negNum) # 按照公式return auclabels = [1,0,1,1,0,1,0,0,1,0]
preds = [0.90,0.70,0.60,0.55,0.52,0.40,0.38,0.35,0.31,0.10]
auc = calAUC(labels,preds)
print("%.2f" % auc)

三、模型评估方法

1. Holdout检验

Holdout 检验是最简单也是最直接的验证方法, 它将原始的样本集合随机划分成训练集和验证集两部分。 比方说, 对于一个点击率预测模型, 我们把样本按照70%~30% 的比例分成两部分, 70% 的样本用于模型训练; 30% 的样本用于模型
验证, 包括绘制ROC曲线、 计算精确率和召回率等指标来评估模型性能。Holdout 检验的缺点很明显, 即在验证集上计算出来的最后评估指标与原始分组有很大关系。 为了消除随机性, 研究者们引入了“交叉检验”的思想。

2. 交叉检验

(1)k-fold交叉验证

  1. 首先将全部样本划分成k个大小相等的样本子集;
  2. 依次遍历这k个子集, 每次把当前子集作为验证集, 其余所有子集作为训练集, 进行模型的训练和评估;
  3. 最后把k次评估指标的平均值作为最终的评估指标。

(2)留一验证: 每次留下1个样本作为验证集, 其余所有样本作为测试集。 样本总数为n, 依次对n个样本进行遍历, 进行n次验证, 再将评估指标求平均值得到最终的评估指标。 在样本总数较多的情况下, 留一验证法的时间开销极大。 事实上,
留一验证是留p验证的特例。 留p验证是每次留下p个样本作为验证集, 而从n个元素中选择p个元素有 种可能, 因此它的时间开销更是远远高于留一验证, 故而很少在实际工程中被应用。

3.  自助法

不管是Holdout检验还是交叉检验, 都是基于划分训练集和测试集的方法进行模型评估的。 然而, 当样本规模比较小时, 将样本集进行划分会让训练集进一步减小, 这可能会影响模型训练效果。 有没有能维持训练集样本规模的验证方法呢? 自助法可以比较好地解决这个问题。自助法是基于自助采样法的检验方法。 对于总数为n的样本集合, 进行n次有放回的随机抽样, 得到大小为n的训练集。 n次采样过程中, 有的样本会被重复采样, 有的样本没有被抽出过, 将这些没有被抽出的样本作为验证集, 进行模型验证, 这就是自助法的验证过程。

在自助法的采样过程中, 对n个样本进行n次自助抽样, 当n趋于无穷大时,最终有多少数据从未被选择过?

四、过拟合与欠拟合

1. 过拟合、欠拟合现象

过拟合是指模型对于训练数据拟合呈过当的情况, 反映到评估指标上, 就是模型在训练集上的表现很好, 但在测试集和新数据上的表现较差。过拟合由于训练数据包含抽样误差,训练时将误差也考虑在内,对抽样误差进行了很好地拟合。 欠拟合指的是模型在训练和预测时表现都不好的情况。

2. 如何解决

降低“过拟合”风险的方法

(1) 获得更多的训练数据。 更多的样本能够让模型学习到更多更有效的特征, 减小噪声的影响。 可以通过一定的规则来扩充训练数据。
(2) 降低模型复杂度。 在数据较少时, 模型过于复杂是产生过拟合的主要因素, 适当降低模型复杂度可以避免模型拟合过多的采样噪声。 
(3) 正则化方法。 给模型的参数加上一定的正则约束, 比如将权值的大小加入到损失函数中。 以L2正则化为例:
                                                                                   
这样, 在优化原来的目标函数C0的同时, 也能避免权值过大带来的过拟合风险。
(4) 集成学习方法。 集成学习是把多个模型集成在一起, 来降低单一模型的过拟合风险, 如Bagging方法。

(5)Early Stopping。在迭代时进行迭代次数截断,即在模型队训练数据及迭代收敛之前停止迭代来防止过拟合。在训练过程中,记录目前最好的 validation accuracy,若连续k个epoch都没打到最佳accuracy,则可认为accuracy不再提高,此时可停止迭代。

(6)dropout。神经网络常用方法,训练时每次随机以一定概率丢弃隐藏层节点,使得每次结果独立,具体见神经网络

降低“欠拟合”风险的方法

(1) 添加新特征。 当特征不足或者现有特征与样本标签的相关性不强时, 模型容易出现欠拟合。 通过挖掘“上下文特征”“ID类特征”“组合特征”等新的特征, 往往能够取得更好的效果。 在深度学习潮流中, 有很多模型可以帮助完成特征工程, 如因子分解机、 梯度提升决策树、 Deep-crossing等都可以成为丰富特征的方法。
(2) 增加模型复杂度。 简单模型的学习能力较差, 通过增加模型的复杂度可以使模型拥有更强的拟合能力。 例如, 在线性模型中添加高次项, 在神经网络模型中增加网络层数或神经元个数等。
(3) 减小正则化系数。 正则化是用来防止过拟合的, 但当模型出现欠拟合现象时, 则需要有针对性地减小正则化系数。

五、超参数调优

超参数有哪些调优方法

超参数搜索算法一般包括要素: 一是目标函数, 即算法需要最大化/最小化的目标; 二是搜索范围, 一般通过上限和下限来确定; 三是算法的其他参数, 如搜索步长。

1. 网格搜索

网格搜索可能是最简单、 应用最广泛的超参数搜索算法, 通过查找搜索范围内的所有的点来确定最优值。 如果采用较大的搜索范围以及较小的步长, 网格搜索有很大概率找到全局最优值。 然而, 这种搜索方案十分消耗计算资源和时间, 特别是需要调优的超参数比较多的时候。 因此, 在实际应用中, 网格搜索法一般会先使用较广的搜索范围和较大的步长, 来寻找全局最优值可能的位置; 然后会逐渐缩小搜索范围和步长, 来寻找更精确的最优值。 这种操作方案可以降低所需的时间和计算量, 但由于目标函数一般是非凸的, 所以很可能会错过全局最优值

2. 随机搜索

随机搜索的思想与网格搜索比较相似, 只是不再测试上界和下界之间的所有值, 而是在搜索范围中随机选取样本点。 它的理论依据是, 如果样本点集足够大, 那么通过随机采样也能大概率地找到全局最优值, 或其近似值。 随机搜索一般会比网格搜索要快一些, 但是和网格搜索的快速版一样, 它的结果也是没法保证的。

3. 贝叶斯优化算法

贝叶斯优化算法在寻找最优最值参数时, 采用了与网格搜索、 随机搜索完全不同的方法。 网格搜索和随机搜索在测试一个新点时, 会忽略前一个点的信息;而贝叶斯优化算法则充分利用了之前的信息。 贝叶斯优化算法通过对目标函数形状进行学习, 找到使目标函数向全局最优值提升的参数。具体来说, 它学习目标函数形状的方法如下:

  1. 首先根据先验分布, 假设一个搜集函数;
  2. 然后, 每一次使用新的采样点来测试目标函数时, 利用这个信息来更新目标函数的先验分布;
  3. 最后, 算法测试由后验分布给出的全局最值最可能出现的位置的点。

对于贝叶斯优化算法, 有一个需要注意的地方, 一旦找到了一个局部最优值, 它会在该区域不断采样, 所以很容易陷入局部最优值。 为了弥补这个缺陷, 贝叶斯优化算法会在探索和利用之间找到一个平衡点, “探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样

参考文献:

0. 《百面机器学习》

1. https://blog.csdn.net/lz_peter/article/details/78133069

2. AUC计算方法与Python实现

算法知识点——(2)模型评估相关推荐

  1. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  2. 炼丹知识点:模型评估里的陷阱

    在实践中,做推荐系统的很多朋友思考的问题是如何对数据进行挖掘,大多数论文致力于开发机器学习模型来更好地拟合用户行为数据.然而,用户行为数据是观察性的,而不是实验性的.这里面带来了非常多的偏差,典型的有 ...

  3. 机器学习算法——概率类模型评估指标4(校准可靠性曲线及预测概率直方图)

    一.预测概率直方图 我们可以通过绘制直方图来查看模型的预测概率的分布. 直方图以样本的预测概率分箱后的结果为横坐标,每个箱中的样本数量为纵坐标绘制一个图像. 具体代码实现为: from sklearn ...

  4. python机器学习(一)算法学习的步骤、机器学习的应用及流程(获取数据、特征工程、模型、模型评估)

    机器学习入门 机器学习中需要理论性的知识,如数学知识为微积分(求导过程,线性回归的梯度下降法),线性代数(多元线性回归,高纬度的数据,矩阵等),概率论(贝叶斯算法),统计学(贯穿整个学习过程),算法根 ...

  5. sklearn使用投票回归VotingRegressor算法构建多模型融合的投票回归模型、并自定义子回归器的权重(weights)、评估多模型融合的回归模型、评估R2、mse、rmse、mape

    sklearn使用投票回归VotingRegressor算法构建多模型融合的投票回归模型.并自定义子回归器的权重(weights).评估多模型融合的回归模型.评估R2.mse.rmse.mape 目录

  6. ML之回归预测:利用Lasso、ElasticNet、GBDT等算法构建集成学习算法AvgModelsR对国内某平台上海2020年6月份房价数据集【12+1】进行回归预测(模型评估、模型推理)

    ML之回归预测:利用Lasso.ElasticNet.GBDT等算法构建集成学习算法AvgModelsR对国内某平台上海2020年6月份房价数据集[12+1]进行回归预测(模型评估.模型推理) 目录 ...

  7. ML之XGBoost:利用XGBoost算法对波士顿数据集回归预测(模型调参【2种方法,ShuffleSplit+GridSearchCV、TimeSeriesSplitGSCV】、模型评估)

    ML之XGBoost:利用XGBoost算法对波士顿数据集回归预测(模型调参[2种方法,ShuffleSplit+GridSearchCV.TimeSeriesSplitGSCV].模型评估) 目录 ...

  8. ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)

    ML之回归预测:利用十类机器学习算法(线性回归.kNN.SVM.决策树.随机森林.极端随机树.SGD.提升树.LightGBM.XGBoost)对波士顿数据集[13+1,506]回归预测(模型评估.推 ...

  9. ML之ME/LF:基于不同机器学习框架(sklearn/TF)下算法的模型评估指标(损失函数)代码实现及其函数(Scoring/metrics)代码实现(仅代码)

    ML之ME/LF:基于不同机器学习框架(sklearn/TF)下算法的模型评估指标(损失函数)代码实现及其函数(Scoring/metrics)代码实现(仅代码) 目录 单个评价指标各种框架下实现 1 ...

  10. DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别、模型评估(99.4%)

    DL之CNN:利用自定义DeepConvNet[7+1]算法对mnist数据集训练实现手写数字识别.模型评估(99.4%) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 netwo ...

最新文章

  1. mysql编码不对_MySQL编码不一致导致乱码问题总结
  2. 关于numpy中eye和identity的区别详解
  3. mass Framework pagination插件
  4. ConcurrentHashMap的源码分析-JDK1.7和Jdk1.8版本的变化
  5. 浅谈Flutter的状态State
  6. 《计算机网络入门到精通》网络体系结构
  7. C# 类型参数的约束
  8. vscode 模拟本地服务器打开文件,设置默认浏览器为chrome
  9. android sdk manager 更新失败
  10. 计算机中专自考,中专怎么自考大专
  11. 海康工业相机的一些坑(USB接口的相机连上halcon17后,客户端无法打开相机,错误是无驱动,但是驱动是好好的,如何解决)
  12. 魔术师usm安装服务器系统,系统总裁开发的u盘魔术师安装win7图文教程
  13. 基于python管理系统论文_基于Python的学生信息管理系统
  14. 微信小程序开发教程、小程序资讯、小程序demo合揖(10月16日更新)
  15. cmd贪吃蛇(cmd贪吃蛇怎么做)
  16. JAVA--获取当前日期两个月之前的日期
  17. java粘包_Java网络通信基础系列-Netty粘包与拆包
  18. 「UG/NX」BlockUI 控件集合
  19. iOS_导航栏的navigationBar.hidden与navigationBarHidden的区别
  20. 腾讯零反射全动态Android插件框架Shadow解析

热门文章

  1. 【6.10校内test】T3 加分二叉树
  2. sudo su 和sudo -s的区别
  3. 5-9 第五天 微信 JS-SDK-使用微信官方的WEB调试工具
  4. ServletContext和ServletConfig
  5. Python爬上不得姐 并将段子写入数据库
  6. Oracle中connect by...start with...的使用
  7. Sequence operation3397
  8. 未能加载文件或程序集System.EnterpriseServices
  9. 【使用工具和软件汇总】
  10. 【Tensorflow】【损失函数】交叉熵数据验证(上)---CategoricalCrossentropy多分类