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)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。
为什么用交叉验证法?
- 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
- 还可以从有限的数据中获取尽可能多的有效信息。
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