我是机器学习的新手,目前正在使用ScikitLearn的MLPC分类器执行神经网络任务。根据吴恩达著名的机器学习课程,我正在绘制学习曲线,在我的情况下,使用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.stack.imgur.com/KERxC.jpg
关于这种学习曲线的解释,我有两个问题:
1.)根据我对这条学习曲线的理解,它为我提供了不同数量的训练数据的训练和交叉验证分数,直到一个历元结束(历元=所有训练示例的一个前向传球和一个后向传球)。如果我有高偏倚或方差问题,看看这两者之间的"差距",以及它们最终的得分,我就能诊断出来。然而,根据我的MLPClassifier的详细信息,神经网络在几个时期内进行训练,那么曲线中给出了哪个时期(训练的第一个时期、最后一个时期或所有时期的平均分数?)。还是我对划时代有误解?
2.)开始新的一批(在200和400个训练示例之后),我得到了尖峰。解释它们的正确方法是什么?
3.)可能理解1.)也会回答这个问题:是什么让这个函数如此缓慢,以至于你需要几个并行的作业n_jobs才能在合理的时间内完成它?clf。fit(X,y)在我的情况下很快。
如果有人能帮助我更好地理解这一点,我将不胜感激。我也愿意接受文献推荐。
非常感谢!
学习曲线只能在稳定、可推广的模型上计算。您是否确保模型不会过拟合?
1) 估计器被训练到完成(即到最后的历元或任何早期停止阈值)。这是多少取决于您的估计器配置。事实上,learning_curve
函数根本没有划时代的概念。它同样可以应用于不使用历元的分类器。
2) 与样品总数相比,您的批量非常大。考虑一个较小的批量,可能是50或20。推测:对于201个样本,您最终会得到一批200个和一批1个。那批1可能会引起问题。
3) 学习曲线将针对每个训练样本选择的每个交叉验证折叠进行训练。在你的情况下,看起来你正在测试所有500种可能的训练尺寸。有了5倍的简历,这将是2500轮训练。如果没有并行化,这需要一个fit()+predict()的2500倍。相反,你应该只采样一些训练集大小。train_sizes = numpy.linspace(0.0, 1.0, 30)
,用于在数据的0%和100%之间的30个点。