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

时间:2016-12-12 09:04:28

标签: python machine-learning scikit-learn classification

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

(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()

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我会说你过拟合。考虑到您正在使用交叉验证,训练与交叉验证分数之间的差距可能太大。如果没有交叉验证或随机拆分,则可能是您的训练和测试数据在某些方面有所不同。

您可以尝试几种方法来减轻这种情况:

  • 添加更多数据(培训分数可能还会进一步降低)
  • 减少估计量,甚至更好,使用提前停止
  • 增加伽马以进行修剪
  • 使用子采样(按树,按列...)

这里有lots of parameters that you can play with,所以请找点乐子! :-D

答案 2 :(得分:-1)

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

通常情况下,列车和测试精度都会提高,但测试精度却落后。