【问题标题】:Gradient boosting training loss increases at every iteration每次迭代时梯度提升训练损失都会增加
【发布时间】:2020-07-20 23:07:57
【问题描述】:

每次迭代,train 损失都在增加。

      Iter       Train Loss   Remaining Time 
         1        5313.1014           22.51s
         2        5170.8669           21.21s
         3     1641863.7866           20.05s
         4     1640770.5703           18.86s
         5     1695332.9514           17.62s
         6     1689162.9816           16.42s
         7     1689562.3732           15.26s
         8     1803110.9519           14.08s
         9     1801803.5873           12.94s
        10     2274529.9750           11.77s
        11    17589338.0388           10.59s
        12  1121779686.7875           10.03s
        13 1071057062185277527192667544912333682394851905403317706031104.0000            
        14 1071057062185277527192667544912333682394851905403317706031104.0000            
        15 1071057062185277527192667544912333682394851905403317706031104.0000            
        16 1071057062185277527192667544912333682394851905403317706031104.0000            
        17 1071057062185277527192667544912333682394851905403317706031104.0000            
        18 1071057062185277527192667544912333682394851905403317706031104.0000            
        19 1071057062185277527192667544912333682394851905403317706031104.0000            
        20 1071057062185277527192667544912333682394851905403317706031104.0000           

我的输入是一个 0 和 1 的大矩阵(向量化的词,作为稀疏矩阵),我的目标是整数:

array([131,  64,  64, 134,  32,  50,  42, 154, 124,  29,  64, 154, 137,
        64,  64,  64,  89,  16, 125,  64])

也许我的代码有问题,但我对此表示怀疑。这里是:

xgboost = GradientBoostingClassifier(n_estimators=20, 
                                     min_samples_leaf=2, 
                                     min_samples_split=3,
                                     verbose=10, max_features=20)
xgboost.fit(xtrain, ytrain)

我的输入形状是:

<1544x19617 sparse matrix of type '<class 'numpy.int64'>'
    with 202552 stored elements in Compressed Sparse Row format>

【问题讨论】:

  • 没有更多信息,以下只是推测。我可能想知道的一件事是max_features &lt;&lt; n_features。 Boosting 已被证明可能会过度强调数据中的噪声,并且鉴于与矩阵的(假定)等级相关的少数特征,该算法可能会迭代地对噪声的数量赋予更多的权重。可能是由于每次拆分(伪噪声)或数据本身(实际噪声)考虑的一小部分特征。您可能还想尝试较小的学习率。
  • 这听起来只有与验证数据有关时才有意义。
  • 啊,是的。我看错了你的帖子。增强/噪声动态仅适用于样本外
  • 如果您通过更改损失函数(并降低学习率)明确使用 AdaBoost,是否还会发生这种情况?
  • 通过使用连续调用一次拟合一个估计器并使用 warm_start 功能来查看您的概率是否呈爆炸式增长也可能很有趣

标签: python machine-learning scikit-learn xgboost


【解决方案1】:

当训练损失突然爆发时,有时是因为陷入了退化的解决方案空间。降低学习率可能会有所帮助(在这种情况下似乎)。在梯度提升中,学习率会影响每棵连续树对现有预测的影响。通过降低学习率,任何一棵树从根本上改变整体预测的能力都会降低,这有助于避免意外地陷入退化的解空间。

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 2020-08-27
    • 2015-10-28
    • 2019-08-07
    • 1970-01-01
    • 2018-06-06
    • 2021-12-12
    • 2018-12-15
    • 2021-06-20
    相关资源
    最近更新 更多