Sklearn plot Cross-Validated Predictions

  1. 交叉验证概念一种统计学上将数据样本切割成较小子集的实用方法。即:大部分样本进行建模,剩余小部分样本用于对建好的模型进行预测,并求该小部分样本的预测误差,记录误差的平方加和。这一过程一直进行,直到所有样本被预测有且仅有一次,再把每个样本预测的误差平方加和,就称为PRESS(predicted Error Sum of Squares)。
  2. 交叉验证常见形式:(1)Holdout验证——随机从最初的样本中选出部分形成交叉验证数据,剩余数据作为训练数据。一般,少于原样本1/3的数据作为验证数据。(2)k-fold交叉验证——k折交叉验证初始采样分割为k个子样本,一个单独子样本作为验证模型的数据,其他剩余的(k-1)个样本用于训练模型。然后交叉验证重复k次,每个子样本作为验证数据被验证一次,平均k次的结果或使用其他结合方式,得到一个单一估测。10折交叉验证最常用。(3)留一验证(leave-one-out Cross Validation,LOOCV)——只使用原本样本中的一项作为验证资料,剩余样本的留下来作为训练模型的数据。该步骤一直持续到每个样本都被当做一次验证数据。等同于k-fold交叉验证的一种特例,但此时k等于原本样本的个数。
  3. 交叉验证目的:获得较可靠的稳定的模型。建立PCR、PLS模型时,一个重要因素是取多少个主成分的问题。用交叉验证校验每个主成分下的PRESS值,选择PRESS值小的主成分数或PRESS不再变小的主成分数,或者说,通过反复的交叉验证,用损失函数度量建立的模型的好坏,最后得到一个较好的模型。如果是建立初步模型,不做深入分析,则Holdout交叉验证即可,否则用k折验证。样本量少时,用留一交叉验证。
  4. http://scikit-learn.org/stable/tutorial/statistical_inference/model_selection.html
  5. 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
    



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章