我有一个包含21个不同样本数量的主体的数据集。我制作了一条曲线(请查看图表)。我从每个主体中移除了以下数量的样本:[10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,32,34,36,38,40]。我使用了StratifiedShuffleSplit,设置了90%的训练集大小和10%的测试集大小。这意味着:
- 当我移除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("")
回答:
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
所做的那样,应该可以工作(抱歉我无法测试)。