模型评估和验证【2】——交叉验证与模型评估

2.模型评估方法之数据集划分

在机器学习任务中,拿到数据后,我们首先会将原始数据集分为三部分:训练集、验证集和测试集。 
训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。

在使用机器学习的时候,往往会有;验证集与测试集,他们的作用不同。

区分验证集,与测试集。

 

注:

Validation(验证集)可选-----参与模型训练过程,对不同模型参数的结果进行交叉验证,选择模型的最优超参数

Test(测试集) 可选----用于独立评估模型的泛化能力,绝对不参与模型训练

 如何从数据中抽取验证集与测试集?

在Scikit-learn中有封装好的模块,来实现数据集划分。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test =train_test_split(datasets_X, datasets_y, test_size=0.3,random_state=0)

简单的验证,这种验证具有偶然性,利用平均的思想来减少模型评估的误差。还有一点需要注意,交叉验证时所使用的数据只在划分数据之后的train_x中,进行二次分解,这点需要理解的,那么问题来了,什么是交叉验证?


什么是交叉验证法?

它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。

为什么用交叉验证法?

  1. 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
  2. 还可以从有限的数据中获取尽可能多的有效信息。

k 一般取 10, 
数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。 
数据量大的时候,k 可以设小一点。

使用交叉验证的最简单的方法是调用cross_val_score,下面的例子演示了如何估算一个线性的准确性.

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_val_score(clf, iris.data, iris.target, cv=5)
>>> scores                                              
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])

>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)

默认情况下,score在每次CV中计算的分数都是模型默认的score方法,我们可以通过使用scoring参数来改变模型的评估准则。(By default, the score computed at each CV iteration is the score method of the estimator. It is possible to change this by using the scoring parameter:)。

>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, iris.data, iris.target, cv=5, scoring='f1_macro')
>>> scores                                              
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])

See The scoring parameter: defining model evaluation rules for details. 

 

3.模型评估指标

3.1分类模型的评估指标

评估一个分类器,通常比评估一个回归器更加玄学。所以我们将会花大量的篇幅在这个话题上。有许多量度性能的方法。

  • 误分类矩阵
  • 准确率(Precision)
  • 召回率(Recall)
  • F1分数
  • AUC
  • ROC

基于混淆矩阵的评估度量

混淆矩阵赋予一个分类器性能表现更全面的认识,同时它通过计算各种分类度量,指导你进行模型选择。

正确率(Accuracy)”陷阱

• 如果训练样本中正例占比非常少:正例100个(1%),反例9900个(99%),你要特别注意!
• 这类问题叫样本类别不平衡问题

       提出confusion_matrics的原因是因为利用正确率来衡量模型分类的置信度时会出错,(出现这类问题是常常在不平衡的样本中)所以提出了混肴矩阵。

  • 真阳性(True Positive,TP):指被分类器正确分类的正例数据
  • 真阴性(True Negative,TN):指被分类器正确分类的负例数据
  • 假阳性(False Positive,FP):被错误地标记为正例数据的负例数据
  • 假阴性(False Negative,FN):被错误地标记为负例数据的正例数据

一般来说:准确率高时召回率就低;而召回率高时准确率就低

F1分数,又称平衡F分数,它被定义为准确率和召回率的调和平均数,用它来综合评估模型性能

调和平均数:

ROC曲线和AUC

      ROC(Receiver Operating Characteristic,接受者工作特征曲线)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣。

       很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值进行比较,若大于阈值则分为正类,否则为反类。例如,神经网络在一般情形下是对每个测试样本预测出一个[0.0,1.0]之间的实值,然后将这个值与阈值0.5进行比较,大于0.5则判为正例,否则为反例。这个阈值设置的好坏,直接决定了学习器的泛化能力。因此,阈值设置的好坏,体现了综合考虑学习器在不同任务下的泛化性能的好坏。为了形象的描述这一变化,在此引入ROC曲线,ROC曲线则是从阈值选取角度出发来研究学习器泛化性能的有力工具。

ROC曲线:受试者工作特性曲线(Receiver Operating Characteristic Curve)。横轴是假正例率(False Positive Rate, fpr),纵轴是真正例率(True Positive Rate, tpr)。

横轴:FPR = FP / (TN + FP):负样本中预测为正样本的比例。分母就是负样本的数量。 
纵轴:TPR = TP / (TP + FN):正样本中预测为正样本的比例,其实就是recall。分母就是正样本的数量。

ROC的评判标准:

1.若一个分类器的ROC曲线被另一个分类器的ROC曲线完全“包住”,则后者性能优于前者 
2.若两个分类器的ROC曲线发生交叉,则难以一般性地断言两者孰优孰劣。如果一定要进行比较,可以比较AUC大小。

       AUC是现在分类模型,特别是二分类模型使用的主要离线评测指标之一。相比于准确率、召回率、F1等指标,AUC有一个独特的优势,就是不关注具体得分,只关注排序结果,这使得它特别适用于排序问题的效果评估,例如推荐排序的评估。AUC这个指标有两种解释方法,一种是传统的“曲线下面积”解释,另一种是关于排序能力的解释。例如0.7的AUC,其含义可以大概理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分高于对负样本的打分。可以看出在这个解释下,我们关心的只有正负样本之间的分数高低,而具体的分值则无关紧要。

3.2 回归模型的评估指标

      对于分类问题,评价测度是准确率,但这种方法不适用于回归问题,我们使用针对连续数值的评价指标。这里介绍3种常用的针对回归问题的评价指标。

1)平均绝对误差(Mean Absolute Error,MAE)

2) 均方误差(Mean Squared Error,MSE)

3) 均方根误差(Root Mean Squared Error,RMSE)

demo:以均方根误差为例

import numpy as np
sum_mean = 0
for i in range(len(y_pre)):
    sum_mean+=(y_pre[i]-y_test.values[I])**2
print("RMSE:",np.sqrt(sum_mean/len(y_pre))

参考资料:

http://scikit-learn.org/stable/modules/cross_validation.html#cross-validation

猜你喜欢

转载自blog.csdn.net/qq_20412595/article/details/81775133
今日推荐