一、模型评估
混淆矩阵Confusion Matrix
在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆(也就是一个class被预测成另一个class)。
Example
假设有一个用来对猫(cats)、狗(dogs)、兔子(rabbits)进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。假设总共有 27只动物:7只猫, 8条狗, 12只兔子。结果的混淆矩阵如下图:
这个混淆矩阵中,实际有 7只猫,但是系统将其中2只预测成了狗;对于 8条狗,其中有 2条被预测成了兔子,3条被预测成了猫。从混淆矩阵中我们可以看出系统对于区分猫和狗存在一些问题,但是区分兔子和其他动物的效果还是不错的。所有正确的预测结果都在对角线上,所以从混淆矩阵中可以很方便直观的看出哪里有错误,因为他们呈现在对角线外面。
Table of confusion
在预测分析中,混淆表格(有时候也称为混淆矩阵),是由false positives,false negatives,true positives和true negatives组成的两行两列的表格。它允许我们做出更多的分析,而不仅仅是局限在正确率(准确率,下面会讲,ACC)。
假定一个实验有 P个positive实例,在某些条件下有 N 个negative实例。那么上面这四个输出可以用下面的偶然性表格(或混淆矩阵)来表示:
混淆矩阵2.png
这个表中呈现了所有衡量模式性能的方法,PPV,FDR,FOR,NPV,TPR,FPR,FNR,TNR以及Accuracy,都是用我们上面的false positives,false negatives,true positives和true negatives来进行计算的。
而其中,False Positive被称为1类错误,而False Negative被称为2类错误。
除去对角线分类正确的点不说,False Positive是说本身这个事物是正确的,但是却判断为错误的,False Negative是说本身这个事物是错误的,但却判断为正确的。我们针对不同的场景,重视False Negative或者False Positive的程度不同,比如我们现在已诊断病人的场景为例
混淆矩阵3.png
False Negative是明明生病了,却诊断为健康的,False Positive是明明是健康的,却判断为生病的,哪一个比重多影响严重呢?很明显,False Negative比重大影响更重。所以就出现了很多除了acc以外衡量模型的方法。这中间比较最重要的就是精确率precision和召回率recall。
下一个最先引出的内容就是Accuracy
准确率accuracy
可以从上面那个图很清楚的看到,
ACC = (所有True Positive + 所有 True Negative)/ 所有点
accuracy = (TP + TN) / (TP + FP + TN + FN)
就是准确率。换句话说,就是所有被分类正确的点在所有点中的概率。
肯定很好奇,已经有了ACC为什么还有那么多其他的判断标准,其实,ACC有很多场景是不适合使用的。
准确率对于分类器的性能分析来说,并不是一个很好地衡量指标,因为如果数据集不平衡(每一类的数据样本数量相差太大),很可能会出现误导性的结果。例如,如果在一个数据集中有95只猫,但是只有5条狗,那么某些分类器很可能偏向于将所有的样本预测成猫。整体准确率为95%,但是实际上该分类器对猫的识别率是100%,而对狗的识别率是0%。那么这个模型也是一个很不好的模型,并没有真正的正确分类。
所以又通过混淆矩阵引出了另外的衡量模型的方法:
精确率precision
精确率precision总是和准确率Accuracy一同出现,但其实表达的并不是一样的含义
精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),也就是TPR。
precision
召回率recall
召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN),也就上面那个总图对应的PPV。
那么用图示来看下上面两个的区别
pre&re.png
精确率和召回率又被称为查准率和查全率,
查准率=检索出的相关信息量 / 检索出的信息总量
查全率=检索出的相关信息量 / 系统中的相关信息总量
F1 score
有时候我们用召回率,有时候又要用精确率确实比较迷惑,所以这时,就引入了F1分数,F1分数公式如下:
F1 Score:F1 Score = 2*P*R/P+R
,其中P和R分别为 precision 和
recall
F1的由来主要是因为调和平均数,调和平均数(英语:Harmonic mean),是求一组数值的平均数的方法中的一种,调和平均数永远小于一般的算数平均数,所以调和平均数,更接近小一点的那个值,套入F1公式的话,就是更接近精确率和召回率更小一点的那个值。
F-beta Score
首先链接是F1的链接哈,下面有F-beta Score的公式。
这个beta可以理解为偏向某个方向的天平,从下图可以看出如果beta越小,那么越重视精确率,如果beta越大,则说明越重视召回率。
fb.png
fb2.png
接收者操作特征曲线ROC curve
ROC空间将伪阳性率(FPR)定义为 X 轴,真阳性率(TPR)定义为 Y 轴。
- TPR:在所有实际为阳性的样本中,被正确地判断为阳性之比率。
TPR = TP / (TP + FN) - FPR:在所有实际为阴性的样本中,被错误地判断为阳性之比率。
FPR = FP / (FP + TN)
给定一个二元分类模型和它的阈值,就能从所有样本的(阳性/阴性)真实值和预测值计算出一个 (X=FPR, Y=TPR) 座标点。
从 (0, 0) 到 (1,1) 的对角线将ROC空间划分为左上/右下两个区域,在这条线的以上的点代表了一个好的分类结果(胜过随机分类),而在这条线以下的点代表了差的分类结果(劣于随机分类)。
ROC空间里的单点,是给定分类模型且给定阈值后得出的。但同一个二元分类模型的阈值可能设定为高或低,每种阈值的设定会得出不同的FPR和TPR。
- 将同一模型每个阈值 的 (FPR, TPR) 座标都画在ROC空间里,就成为特定模型的ROC曲线。
如下图,人体的血液蛋白浓度是呈正态分布的连续变数,病人的分布是红色,平均值为A g/dL,健康人的分布是蓝色,平均值是C g/dL。健康检查会测量血液样本中的某种蛋白质浓度,达到某个值(阈值,threshold)以上诊断为有疾病征兆。研究者可以调整阈值的高低(将左上图的B垂直线往左或右移动),便会得出不同的伪阳性率与真阳性率,总之即得出不同的预测准确率。
1. 由于每个不同的分类器(诊断工具、侦测工具)有各自的测量标准和测量值的单位(标示为:“健康人-病人分布图”的横轴),所以不同分类器的“健康人-病人分布图”都长得不一样。
2. 比较不同分类器时,ROC曲线的实际形状,便视两个实际分布的重叠范围而定,没有规律可循。
3. 但在同一个分类器之内,阈值的不同设定对ROC曲线的影响,仍有一些规律可循:
-
当阈值设定为最高时,亦即所有样本都被预测为阴性,没有样本被预测为阳性,此时在伪阳性率 FPR = FP / ( FP + TN ) 算式中的 FP = 0,所以 FPR = 0%。同时在真阳性率(TPR)算式中, TPR = TP / ( TP + FN ) 算式中的 TP = 0,所以 TPR = 0%
-
当阈值设定为最高时,必得出ROC座标系左下角的点 (0, 0)。
-
当阈值设定为最低时,亦即所有样本都被预测为阳性,没有样本被预测为阴性,此时在伪阳性率FPR = FP / ( FP + TN ) 算式中的 TN = 0,所以 FPR = 100%。同时在真阳性率 TPR = TP / ( TP + FN ) 算式中的 FN = 0,所以 TPR=100%
当阈值设定为最低时,必得出ROC座标系右上角的点 (1, 1)。 -
因为TP、FP、TN、FN都是累积次数,TN和FN随着阈值调低而减少(或持平),TP和FP随着阈值调低而增加(或持平),所以FPR和TPR皆必随着阈值调低而增加(或持平)。
roc.PNG
随着阈值调低,ROC点 往右上(或右/或上)移动,或不动;但绝不会往左下(或左/或下)移动。
以上就是ROC空间和ROC曲线,但是针对ROC曲线还有一个很重要的性质,那就是曲线下面积(AUC),AUC的意义是: -
因为是在1x1的方格里求面积,AUC必在0~1之间。
-
假设阈值以上是阳性,以下是阴性;
-
若随机抽取一个阳性样本和一个阴性样本,分类器正确判断阳性样本的值高于阴性样本之机率 = AUC。
-
简单说:AUC值越大的分类器,正确率越高。
auc.png
下面来看下数据分步和AUC的关系,可以明显看出,如果不是很好分出的数据,他的auc大概在0.5左右,而如果能完美分类的模型,他的auc为1.
上面的评估指标都是评估分类模型的,现在让我们来学评估回归模型的指标
平均绝对误差(Mean absolute error MAE)
其实顾名思义了,直接看图看公式吧
mae.png
很容易对不对,误差的绝对值的总和求平均。
机器学习中我们一般用sklearn的mean_absolute_error函数来算结果。
mae2.png
但因为我们是用的绝对值做计算,这种情况我们不能去求导来做梯度下降(梯度下降通过求导的负数来得出我们的线段的斜率和偏移该怎么变化,或者说是变化方向),那么就引入了下一个误差方式来方便求导,那就是:
均方误差Mean squared error MSE
同样,也基本是看到就知道大概意思了,那么我们直接看公式
mse.png
很明显对不对,点和线段的偏差的平方求和来求平均
mse2.png
同样我们常用sklearn的mean_squared_error 函数来实现这个功能
决定系数R2 score
另外一个非常重要的判定分数是R2 score,又叫Coefficient of determination,R2 score在回归问题评估上非常常见,R2 score是通过将我们的模型和最简单的模型相比得出的,
具体计算如下:
R2
上图可以看出,决定系数越接近1,这个模型评估也好。
同样用sklearn的r2_score函数计算。
R2.png
二、模型选择
方差,偏差,过拟合和欠拟合
首先要选择模型,自然要知道什么样的模型是不好的,针对模型来说,我们有两种比较不好的模型,一种是过拟合的模型,另一种是欠拟合的模型,而这两种不好的模型其实反应的是方差和偏差,这里有非常好的资料可以进行学习。
那么我们从头细细道来:
当我们讨论预测模型时,预测误差可以分解为我们关心的两个主要子部分内容:由于“偏差”引起的误差和由于“方差”引起的误差。在模型最小化偏差和方差的能力之间存在权衡。了解这两种类型的错误可以帮助我们诊断模型结果并避免过拟合或欠拟合。
1、偏差和方差Bias and Variance
了解不同的误差源如何导致偏差和方差有助于我们改进数据拟合过程,从而产生更准确的模型。我们以三种方式定义偏差和方差:概念上,图形上和数学上。
概念上:
(1)由偏差引起的误差:由于偏差引起的误差被视为我们模型的预期(或平均)预测与我们正确值之间的差异。当然,你只有一个模型,所以谈论预期或平均预测值可能看起来有点奇怪。但是,假设您可以多次重复整个模型构建过程:每次收集新数据并运行新分析创建新模型。由于基础数据集中的随机性,所得到的模型将具有一系列预测。偏差衡量这些模型的预测与正确值的距离。
(2)由方差引起的误差:由于方差引起的误差被视为给定数据点的模型预测的可变性。再次,假设您可以多次重复整个模型构建过程。方差是给定点的预测在模型的不同实现之间变化的程度。
图形上:
bias
这个靶子目标的中心是一个完美预测正确值的模型。靶子上的点请理解为每一次模型评估后实现,可以看到命中点与模型中心的偏差,最左上的很明显,偏差和方差都很小的情况下,模型评估几乎都正中红心,这是一个良好模型的体现,而高方差的情况,点虽然靠近中心,但有些像四周分散,这就是过拟合的表现,就像一个人比较极端偏执,眼光比较狭隘,极端拟合了一些状态,没有大局观,而高偏差呢,能看到我们的点并没有像中心靠拢,而是有些偏斜,这就是欠拟合的表现,就像一个人想面面俱到的做事情,比较圆滑,放任某些错误的逻辑继续走偏。
从第二张模型复杂度图(后面讲)也能看到,我们variance方差和bias的存在基本是互斥的,高方差的话偏差就低,高偏差的话方差就低,就像我们的过拟合的状态一样,而我们就是要找到最低的那个error,尽量去找那个“完美”模型。
我们也可以看下面这个例子,来理解:
fitting.png
2、模型复杂度图表
模型复杂性图比较训练误差training errors和交叉验证误差cross-validation errors ,以便测量某个模型对给与的数据集是否过拟合或者欠拟合。就像这个图中所示,比如第一个使用的是一阶线性回归,对于训练数据有3个错分类的点,对于测试数据有3个错分类的点,这就勾出了曲线的第一个节点,以此类推,这样的一个整体的图,就是模型复杂度图了
以这个图来看,degree=2是最好的模型,在这之后的模型测试数据判断失误开始增多,图形趋近于过拟合
K折交叉验证
首先,什么是Cross-validation交叉验证?它也叫循环估计,是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是在训练阶段定义一组用于“测试”模型的数据集,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。
那么同样k折交叉验证就是将训练集分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10次交叉验证是最常用的。
使用sklearn的方法如下
学习曲线
学习曲线,是表示通过增长学习经验来观察学习能力变化的一个图表,这是原本的学习曲线的含义。
举个栗子:
leanring curve
那么在机器学习中,学习曲线的y轴表示的是错误error或者是acc正确率,而原来表示经验的x轴可能是用于学习的训练样本的数量或用于优化系统模型参数的迭代次数等等。
learningcurves.png
可以用以下代码生成学习曲线:
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
- estimator,是我们针对数据使用的实际分类器,例如 LogisticRegression() 或 GradientBoostingClassifier()。
- X 和 y 是我们的数据,分别表示特征和标签。
- train_sizes 是用来在曲线上绘制每个点的数据大小。
- train_scores 是针对每组数据进行训练后的算法训练得分。
- test_scores 是针对每组数据进行训练后的算法测试得分。
网格搜索
首先要了解一个概念,超参数,可能会觉得很奇怪,经常听到参数,超参数什么?原文-参数与超参数的不同
模型参数是模型内部的配置变量,可以用数据估计模型参数的值;模型超参数是模型外部的配置,必须手动设置参数的值。
具体来说,首先,我们来看一下“参数”是什么?
参数作为模型从历史训练数据中学到的一部分,是机器学习算法的关键 。
统计学中的“参数”:
在统计学中,你可以假设一个变量的分布,比如高斯分布。高斯分布的两个参数分别是平均值(μ)和标准差(sigma)。这在机器学习中是有效的,其中这些参数可以用数据估计得到并用作预测模型的一部分。
编程中的“参数”:
编程中可以将参数传递给函数。在这种情况下,参数是一个函数参数,可以有一个值范围。在机器学习中,您正在使用的具体模型就是函数,需要参数才能对新数据进行预测。
参数和模型有什么关系?
根据经典的机器学习文献,可以将模型看作假设,而参数是根据特定的数据集对假设进行的具体调整。
模型是否具有固定或可变数量的参数,决定了模型是“参数”模型或“非参”模型。
什么是模型参数?
简单来说,模型参数就是模型内部的配置变量,可以用数据估计它的值。
具体来讲,模型参数有以下特征:
- 进行模型预测时需要模型参数。
- 模型参数值可以定义模型功能。
- 模型参数用数据估计或数据学习得到。
- 模型参数一般不由实践者手动设置。
- 模型参数通常作为学习模型的一部分保存。
通常使用优化算法估计模型参数,优化算法是对参数的可能值进行的一种有效搜索。
模型参数的一些例子包括:
- 人造神经网络中的权重。
- 支持向量机中的支持向量。
- 线性回归或逻辑回归中的系数。
什么是模型超参数?
模型超参数是模型外部的配置,其值不能从数据估计得到。
具体特征有:
- 模型超参数常应用于估计模型参数的过程中。
- 模型超参数通常由实践者直接指定。
- 模型超参数通常可以使用启发式方法来设置。
- 模型超参数通常根据给定的预测建模问题而调整。
怎样得到它的最优值: 对于给定的问题,我们无法知道模型超参数的最优值。但我们可以使用经验法则来探寻其最优值,或复制用于其他问题的值,也可以通过反复试验的方法。
模型超参数的一些例子包括:
- 训练神经网络的学习速率。
- 支持向量机的C和sigma超参数。
- k邻域中的k。
两者联系:
当针对特定问题调整机器学习算法时,例如在使用网格搜索或随机搜索时,你将调整模型或命令的超参数,以发现一个可以使模型预测最熟练的模型参数。许多模型中重要的参数无法直接从数据中估计得到。例如,在K近邻分类模型中...这种类型的模型参数被称为调整参数,因为没有可用的分析公式来为其计算一个合适的值。
第64-65页,应用预测建模,2013
两者区分:
模型超参数通常被称为模型参数,这种叫法很容易让人产生误解。解决这个问题的一个很好的经验法则如下:如果你必须手动指定一个“模型参数”,那么它可能就是一个模型超参数。
那么介绍完了超参数我们来真正进入网格搜索,这里有一篇讲解的很好的文章,可以进行学习:
网格搜索算法与K折交叉验证
大致介绍来说,Grid Search是一种调参手段,是通过穷举法来找到自己所探索的参数中,最好的那一套参数,一般结合交叉验证来用。举例的话上面那个链接里写的就很好了,这里就不说了。
最后,如何在sklearn中进行使用呢?
在 sklearn 中的网格搜索非常简单。 我们将用一个例子来说明一下。 假设我们想要训练支持向量机,并且我们想在以下参数之间做出决定:
kernel:poly或rbf。
C:0.1,1 或 10。
( 注:这些参数对于你来说,现在可以简单了解一下,我们将在该纳米学位接下来的监督学习部分中详细了解它们。
具体步骤如下所示:
1. 导入 GridSearchCV
from sklearn.model_selection import GridSearchCV
2.选择参数:
现在我们来选择我们想要选择的参数,并形成一个字典。 在这本字典中,键 (keys) 将是参数的名称,值 (values) 将是每个参数可能值的列表。
parameters = {'kernel':['poly', 'rbf'],'C':[0.1, 1, 10]}
3.创建一个评分机制 (scorer)
我们需要确认将使用什么指标来为每个候选模型评分。 这里,我们将使用 F1 分数。
from sklearn.metrics import make_scorer
from sklearn.metrics import f1_score
scorer = make_scorer(f1_score)
4. 使用参数 (parameter) 和评分机制 (scorer) 创建一个 GridSearch 对象。 使用此对象与数据保持一致 (fit the data) 。
# Create the object.
grid_obj = GridSearchCV(clf, parameters, scoring=scorer)
# Fit the data
grid_fit = grid_obj.fit(X, y)
5. 获得最佳估算器 (estimator)
best_clf = grid_fit.best_estimator_
现在你可以使用这一估算器best_clf来做出预测。
网友评论