首页 文章

学习曲线(高偏差/高差异)为什么测试学习曲线变得平坦

提问于
浏览
1

我使用渐变增强决策树作为分类器实现了一个模型,我绘制了训练和测试集的学习曲线,以决定下一步做什么以改进我的模型 . 结果如图:

(Y轴是精度(正确预测的百分比),而x轴是我用来训练模型的样本数 . )
enter image description here

我知道训练和测试分数之间的差距可能是由于高差异(过度拟合) . 但是图像还显示测试分数(绿线)增加很少,而样本数量从2000增加到3000.测试分数的曲线变得平缓 . 即使有更多的样本,模型也没有变得更好 .

我的理解是,平坦的学习曲线通常表示高偏差(欠拟合) . 在这个模型中是否可能发生过度拟合和过度拟合?或者平曲线有另一种解释吗?

任何帮助,将不胜感激 . 提前致谢 .

=====================================

我使用的代码如下 . 基本我使用与sklearn中的示例相同的代码document

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
                    n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):
    plt.figure()
    plt.title(title)
    if ylim is not None:
        plt.ylim(*ylim)
    plt.xlabel("Training examples")
    plt.ylabel("Score")
    train_sizes, train_scores, test_scores = learning_curve(
        estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
    train_scores_mean = np.mean(train_scores, axis=1)
    train_scores_std = np.std(train_scores, axis=1)
    test_scores_mean = np.mean(test_scores, axis=1)
    test_scores_std = np.std(test_scores, axis=1)
    plt.grid()

    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
                     train_scores_mean + train_scores_std, alpha=0.1,
                     color="r")
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
                     test_scores_mean + test_scores_std, alpha=0.1, color="g")
    plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
             label="Training score")
    plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
             label="Cross-validation score")

    plt.legend(loc="best")
    return plt

title = "Learning Curves (GBDT)"
# Cross validation with 100 iterations to get smoother mean test and train
# score curves, each time with 20% data randomly selected as a validation set.
cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0)

estimator = GradientBoostingClassifier(n_estimators=450)
X,y= features, target #features and target are already loaded
plot_learning_curve(estimator, title, X, y, ylim=(0.6, 1.01), cv=cv, n_jobs=4)

plt.show()

2 回答

  • -1

    首先,当您添加更多示例时,您的训练准确度会下降很多 . 所以这仍然可能是高度差异 . 但是,我怀疑这是唯一的解释,因为差距似乎太大了 .

    训练精度和测试精度之间存在差距的原因可能是训练样本和测试样本的不同分布 . 但是,通过交叉验证,这不应该发生(你是否进行k折交叉验证,你为每个k折叠重新训练?)

  • 0

    你应该更加注意你的训练准确性 . 如果它在训练期间出现故障,那么你做了一件非常错误的事情 . 再次检查数据的正确性(标签是否正确?)和您的模型 .

    通常,列车和测试精度都应该提高,但测试精度却落后了 .

相关问题