解释Scikit中的学习曲线

时间:2019-01-23 12:38:53

标签: python machine-learning scikit-learn neural-network

我是机器学习的新手,目前正在将 ScikitLearn的MLPClassifier用于神经网络任务。根据吴安德(Andrew Ng)著名的机器学习课程,我正在使用ScikitLearn的function learning_curve绘制学习曲线(另请参见文档:https://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html):

clf = MLPClassifier(solver='adam', activation='relu', alpha=0.001,
 learning_rate='constant',learning_rate_init=0.0001,
 hidden_layer_sizes=[39, 37, 31, 34],   batch_size=200,
 max_iter=1000, verbose=True) 


cv=GroupKFold(n_splits=8)

estimator =clf
ylim=(0.7, 1.01)
cv=cv
n_jobs=1
train_sizes=np.linspace(.01, 1.0, 100)


#Calculate learning curve
train_sizes, train_scores, test_scores = learning_curve(
    estimator, X_array_train, Y_array_train,
    groups=groups_array_train, cv=cv, n_jobs=n_jobs,
    train_sizes=train_sizes, scoring='accuracy',verbose=10)

我的 MLPClassifier 求解器是'adam',批处理大小是200。

这是结果图: https://i.imgur.com/jDNoEVg.png

关于这种学习曲线的解释,我有两个问题

1。)据我了解,这条曲线为我提供了不同数量的训练数据的训练和交叉验证得分,直到一个历元结束(历元=一个向前通过和一个向后通过所有培训示例中)。看看这两者之间的“差距”,如果我有很大的偏见或差异问题,我可以诊断出它们最终得分是多少。但是,根据我的 MLPClassifier 的详细描述,神经网络正在多个历时进行训练,因此曲线中给出了哪个历时(训练的第一个历时,最后一个历时或所有历时的平均分数?)。 。还是在我身边有一个时代的误会?

2。)开始新批次(经过200和400个训练示例之后),我得到了加薪。解释它们的正确方法是什么?

3。)可能理解1.)还将回答以下问题:是什么使该函数如此缓慢,以至于您需要几个并行的作业n_jobs才能在合理的时间内完成它?在我的情况下,clf.fit(X,y)很快。

如果有人可以帮助我更好地理解这一点,我将非常感激。我也愿意接受文学方面的建议。

非常感谢!

1 个答案:

答案 0 :(得分:1)

学习曲线只能在稳定,可概括的模型上计算。您确定模型不会过拟合吗?

1)对估计器进行训练,使其完成,即达到最后纪元或任何早期停止阈值。这是多少取决于您的估算器配置。 实际上,learning_curve函数根本没有纪元的概念。它也可以应用于不使用历元的分类器。

2)与总样本数相比,您的批量非常大。考虑较小的批次大小,可能是50或20。 SPECULATION (可能):对于201个样品,可能会得到200个批次和1个批次。这可能会导致问题。

3)学习曲线将针对每个训练样本选择的每个交叉验证折叠进行训练。就您而言,您似乎正在测试所有500种可能的训练量。 5倍CV,这将是2500轮训练。如果不进行并行化,这将花费一个fit()+ predict()的2500倍。相反,您应该只采样一些训练集大小。 train_sizes = numpy.linspace(0.0, 1.0, 30)获得30分,介于您数据的0%和100%之间。