- 交叉验证概念:一种统计学上将数据样本切割成较小子集的实用方法。即:大部分样本进行建模,剩余小部分样本用于对建好的模型进行预测,并求该小部分样本的预测误差,记录误差的平方加和。这一过程一直进行,直到所有样本被预测有且仅有一次,再把每个样本预测的误差平方加和,就称为PRESS(predicted Error Sum of Squares)。
- 交叉验证常见形式:(1)Holdout验证——随机从最初的样本中选出部分形成交叉验证数据,剩余数据作为训练数据。一般,少于原样本1/3的数据作为验证数据。(2)k-fold交叉验证——k折交叉验证初始采样分割为k个子样本,一个单独子样本作为验证模型的数据,其他剩余的(k-1)个样本用于训练模型。然后交叉验证重复k次,每个子样本作为验证数据被验证一次,平均k次的结果或使用其他结合方式,得到一个单一估测。10折交叉验证最常用。(3)留一验证(leave-one-out Cross Validation,LOOCV)——只使用原本样本中的一项作为验证资料,剩余样本的留下来作为训练模型的数据。该步骤一直持续到每个样本都被当做一次验证数据。等同于k-fold交叉验证的一种特例,但此时k等于原本样本的个数。
- 交叉验证目的:获得较可靠的稳定的模型。建立PCR、PLS模型时,一个重要因素是取多少个主成分的问题。用交叉验证校验每个主成分下的PRESS值,选择PRESS值小的主成分数或PRESS不再变小的主成分数,或者说,通过反复的交叉验证,用损失函数度量建立的模型的好坏,最后得到一个较好的模型。如果是建立初步模型,不做深入分析,则Holdout交叉验证即可,否则用k折验证。样本量少时,用留一交叉验证。
- http://scikit-learn.org/stable/tutorial/statistical_inference/model_selection.html
from sklearn import datasets,svm digits = datasets.load_digits() # load iris flower dataset x_digits = digits.data # trian dataset y_digits = digits.target # prediction dataset svc = svm.SVC(C=1,kernel = 'linear') # build a linear regression model svc.fit(x_digits[:-100],y_digits[:-100]).score(x_digits[-100:],y_digits[-100:]) # get a prediction accuracy score and return 0.979999999 # k-folds cross validation import numpy as np x_folds = np.array_split(x_digits,3) y_folds = np.array_split(y_digits,3) # y_digits 数据是0到9的分类,len(y_folds)=3,每个子数据集599条数据向量 scores = list() for k in range(3): x_train = list(x_folds) x_test = x_train.pop(k) # 排除一个折,剩余的作为测试数据集 x_train = np.concatenate(x_train) # 将训练数据连接为一个array y_train = list(y_folds) y_test = y_train.pop(k) y_train = np.concatenate(y_train) svc = svm.SVC( C=1,kernel='linear') scores.append(svc.fit(x_train,y_train).score(x_test,y_test)) print(scores) # new and easier method to calculate #split method set indices for each iteration of the chosen CV strategy # for instance from sklearn.model_selection import KFold,cross_val_score X = ["a","a","b","c","c","d","d"] k_fold = KFold(n_splits=3) for train_indices,test_indices in k_fold.split(X): print("train:%s | test:%s" % (train_indices,test_indices)) cross_val_score(svc,x_digits,y_digits,cv=k_fold,n_jobs=-1) # n_jobs=-1指计算调用CPU