ScikitLearn 中关于 epochs 的学习曲线解释

Posted

技术标签:

【中文标题】ScikitLearn 中关于 epochs 的学习曲线解释【英文标题】:Interpretation of learning curve in ScikitLearn concerning epochs 【发布时间】:2019-06-17 01:23:32 【问题描述】:

我是机器学习的新手,目前正在使用 ScikitLearn 的 MLPClassifier 进行神经网络任务。根据 Andrew Ng 著名的机器学习课程,我正在绘制学习曲线,在我的例子中是使用 ScikitLearn 的函数 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 的详细说明,神经网络正在训练多个 epoch,因此曲线中给出了哪个 epoch(训练的第一个 epoch、最后一个 epoch 或所有 epoch 的平均分数?) .还是我对时代有误解?

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

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

如果有人能帮助我更好地理解这一点,我将不胜感激。我也愿意接受文献推荐。

提前非常感谢!

【问题讨论】:

您的估算器是如何配置的? 刚刚编辑了我的代码 :) 我认为我的问题是,我必须更详细地了解亚当如何使用时代。另请参阅下面的评论。 【参考方案1】:

只能在稳定的、可泛化的模型上计算学习曲线。您是否确保模型没有过度拟合?

1) 估计器被训练到完成,即到最后一个时期或任何早期停止阈值)。这有多少取决于您的估算器配置。 事实上learning_curve 函数根本没有时代的概念。它也可以应用于不使用 epoch 的分类器。

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

3) 学习曲线将针对每个训练样本选择的每个交叉验证折叠进行训练。在您的情况下,您似乎正在测试所有 500 种可能的训练规模。以 5 倍的 CV 计算,将是 2500 轮训练。如果没有并行化,这需要 fit()+predict() 的 2500 倍。相反,您应该只对一些训练集大小进行抽样。 train_sizes = numpy.linspace(0.0, 1.0, 30) 在数据的 0% 和 100% 之间获得 30 个点。

【讨论】:

您好 Jonnor,非常感谢您的回答。我知道 learning_curve 函数不直接使用纪元这一事实。我试图做的是解释与时代的关系。我对此的想法:学习曲线是针对我的训练数据的 0% 到 100% 之间的数据部分绘制的。对我 100% 的训练数据进行训练仅相当于一个 epoch 的训练。这种解释正确吗?然而,我最终得到了一个最终的测试分数,它在我最终在学习曲线中的交叉验证分数的范围内。所以我想知道,还有哪些时代正在发生变化。 在您的估算器上设置 verbose=True 以打印时期。 epoch 的数量通常设置为大于 1,更像是 100,并且与训练规模没有直接关系。

以上是关于ScikitLearn 中关于 epochs 的学习曲线解释的主要内容,如果未能解决你的问题,请参考以下文章

ScikitLearn 随机森林中的欠采样与 class_weight

基于scikitlearn的深度学习环境安装(完整版)

iOS中关于字符 “&”的作用?

python中关于本地文件的API

将人类可读的日期从 Epoch 转换为变量

Django错误中关于页面的***