2016-12-20 47 views
0

我有一個數據集的21個科目不同數量的樣品每個。 我做了一個曲線(查看圖)。我刪除:[10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40]來自每個主題的樣本。我使用StratifiedShuffleSplit和90%的train_size和10%的test_size。這意味着:如何讓train_scores繪製學習曲線而不使用scikitlearn的learning_curve功能?

  • 當我除去10個樣品,9將用於訓練和1用於測試
  • 當我除去20個樣品,18將被用於訓練和2用於測試
  • 如果我移除30個樣品,27將用於訓練和3用於測試
  • 當我除去40個樣品,36將被用於訓練和4用於測試

該曲線示出了精度(test_score)但不是train_score 。

如何在不使用scikit-learn的learning_curve函數的情況下繪製train_score? http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html

的代碼:

result_list = [] 

    #LOADING .mat FILE 
    x=sio.loadmat('/home/curve.mat')['x'] 
    s_y=sio.loadmat('/home/rocio/curve.mat')['y'] 
    y=np.ravel(s_y) 


    #SENDING THE FILE TO PANDAS 
    df = pd.DataFrame(x) 
    df['label']=y 


    #SPECIFYING THE # OF SAMPLES TO BE REMOVED 
    for j in [10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,32,34,36,38,40]: 
     df1 = pd.concat(g.sample(j) for idx, g in df.groupby('label')) 

     #TURNING THE DATAFRAME TO ARRAY 
     X = df1[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]].values 
     y = df1.label.values 


     #Cross-validation 
     clf = make_pipeline(preprocessing.RobustScaler(), neighbors.KNeighborsClassifier()) 
     ####################10x2 SSS#################### 
     print("Cross-validation:10x10") 
     xSSSmean10 = [] 
     for i in range(10): 
      sss = StratifiedShuffleSplit(2, test_size=0.1, random_state=i) 

      scoresSSS = model_selection.cross_val_score(clf, X, y, cv=sss.split(X, y)) 
      xSSSmean10.append(scoresSSS.mean()) 


     result_list.append(xSSSmean10) 
     print("") 

enter image description here

回答

1

StratifiedShuffleSplit.split返回兩個值:訓練集和測試。您可以將sss.split(X, y)產生的值分配給一個元組,例如testtuple。然後,您創建僅由列車套,traintuple一個新的元組,構成如下:

traintuple = (testtuple[0],testtuple[0]) 

然後你計算的只是訓練集精度:

scoreSSS_train = model_selection.cross_val_score(clf, X, y, cv=traintuple) 

這樣既訓練並在同一組上進行測試。

scoreSSS_train的平均值添加到一個新的空列表中,就像您使用xSSSmean10一樣,它應該可以工作(我無法測試它,對不起)。