Sklean学习之旅——交叉验证
前言
近期开始学习数据分析相关知识,先从简单的sklearn入手,也是第一次写东西。如有不正确的地方敬请各位大神指正,谢谢!
交叉验证的目的
交叉验证(Cross Validation)为CV,CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),,以此来做为评价分类器的性能指标。
简单的说,交叉验证的目的就是用来评估模型的泛化能力,即验证我们训练所得到的模型是否具有实用性。我们先来看看欠拟合与过拟合的概念:
- 欠拟合:模型在训练集和测试级上的表现都较差。
- 过拟合:模型在训练集上的表现很好,但是在测试集上的表现较差。
根据对数据集划分方式的不同,验证策略可分为以下几种:
Hold-OUT Method
from sklearn.model_selection import train_test_split
将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型。此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV。
K-fold验证(较常用)
from sklearn.model_selection import KFold
K-折验证:将数据集分成K份,利用其中k-1份组子集作为训练集,剩下一份作为测试集。得K个模型,将这K个模型验证集的分类准确率的平均数作为此K-CV分类器的最终性能指标。
通常情况下,设置看=5或k=10,是一种较好的选择。
留一交叉验证(数据量很少的情况下使用)
from sklearn.model_selection import LeaveOneOut
每个样本单独作为验证集,其余的N-1个样本作为训练集,故LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。
当数据量较大时,因计算成本太高,不适用。
另:
留P交叉验证: LeavePOut 与 LeaveOneOut 非常相似,因为它通过从整个集合中删除 p 个样本来创建所有可能的 训练/测试集。对于 n 个样本,这产生了 {n \choose p} 个 训练-测试 对。与 LeaveOneOut 和 KFold 不同,当 p > 1 时,测试集会重叠。
计算交叉验证的性能指标
from sklearn.model_selection import cross_val_score,cross_validate # 交叉验证所需的函数
``
例:`
import numpy as np
from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = svm.SVC(kernel=‘linear’, C=1, random_state=0)
n_folds = 5
kf = KFold(n_folds, shuffle=True, random_state=42)
scores = cross_val_score(clf, X, y, scoring=‘precision_macro’, cv = kf)