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
    



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