【问题标题】:How to get the train_scores to plot a learning curve without using the learning_curve fuction fo scikitlearn?如何在不使用 learning_curve 函数的情况下让 train_scores 绘制学习曲线做 scikit 学习?
【发布时间】:2017-05-05 23:46:24
【问题描述】:

我有一个包含 21 个受试者的数据集,每个受试者的样本数量不同。 我做了一条曲线(检查图)。我从每个主题中删除: [10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,32,34,36,38,40] 个样本。我正在使用具有 90% train_size 和 10% test_size 的 StratifiedShuffleSplit。这意味着:

  • 当我删除 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("") 

【问题讨论】:

    标签: python-3.x pandas numpy machine-learning scikit-learn


    【解决方案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 一样,它应该可以工作(我无法测试它,抱歉)。

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 2016-11-29
      • 2020-09-09
      • 2016-10-06
      • 2019-05-04
      • 1970-01-01
      • 2020-11-15
      • 2013-12-20
      • 2014-04-29
      相关资源
      最近更新 更多