【问题标题】:Bug in Scikit-Learn GradientBoostingClassifier?Scikit-Learn GradientBoostingClassifier 中的错误?
【发布时间】:2017-09-10 13:56:52
【问题描述】:

我正在从 Sklearn 运行 GradientBoostingClassifier,我从详细输出中得到了一些奇怪的输出。我从我的整个数据集中随机抽取 10% 的样本,大多数看起来都很好,但有时我会得到奇怪的输出和糟糕的结果。有人可以解释发生了什么吗?

“好”结果:

n features = 168
GradientBoostingClassifier(criterion='friedman_mse', init=None,
              learning_rate=0.01, loss='deviance', max_depth=4,
              max_features=None, max_leaf_nodes=None,
              min_impurity_split=1e-07, min_samples_leaf=1,
              min_samples_split=2, min_weight_fraction_leaf=0.0,
              n_estimators=2000, presort='auto', random_state=None,
              subsample=1.0, verbose=1, warm_start=False)
      Iter       Train Loss   Remaining Time 
         1           0.6427           40.74m
         2           0.6373           40.51m
         3           0.6322           40.34m
         4           0.6275           40.33m
         5           0.6230           40.31m
         6           0.6187           40.18m
         7           0.6146           40.34m
         8           0.6108           40.42m
         9           0.6071           40.43m
        10           0.6035           40.28m
        20           0.5743           40.12m
        30           0.5531           39.74m
        40           0.5367           39.49m
        50           0.5237           39.13m
        60           0.5130           38.78m
        70           0.5041           38.47m
        80           0.4963           38.34m
        90           0.4898           38.22m
       100           0.4839           38.14m
       200           0.4510           37.07m
       300           0.4357           35.49m
       400           0.4270           33.87m
       500           0.4212           31.77m
       600           0.4158           29.82m
       700           0.4108           27.74m
       800           0.4065           25.69m
       900           0.4025           23.55m
      1000           0.3987           21.39m
      2000           0.3697            0.00s
predicting
this_file_MCC = 0.5777

“坏”结果:

Training the classifier
n features = 168
GradientBoostingClassifier(criterion='friedman_mse', init=None,
              learning_rate=1.0, loss='deviance', max_depth=5,
              max_features='sqrt', max_leaf_nodes=None,
              min_impurity_split=1e-07, min_samples_leaf=1,
              min_samples_split=2, min_weight_fraction_leaf=0.0,
              n_estimators=500, presort='auto', random_state=None,
              subsample=1.0, verbose=1, warm_start=False)
      Iter       Train Loss   Remaining Time 
         1           0.5542            1.07m
         2           0.5299            1.18m
         3           0.5016            1.14m
         4           0.4934            1.16m
         5           0.4864            1.19m
         6           0.4756            1.21m
         7           0.4699            1.24m
         8           0.4656            1.26m
         9           0.4619            1.24m
        10           0.4572            1.26m
        20           0.4244            1.27m
        30           0.4063            1.24m
        40           0.3856            1.20m
        50           0.3711            1.18m
        60           0.3578            1.13m
        70           0.3407            1.10m
        80           0.3264            1.09m
        90           0.3155            1.06m
       100           0.3436            1.04m
       200           0.3516           46.55s
       300        1605.5140           29.64s
       400 52215150662014.0469           13.70s
       500 585408988869401440279216573629431147797247696359586211550088082222979417986203510562624281874357206861232303015821113689812886779519405981626661580487933040706291550387961400555272759265345847455837036753780625546140668331728366820653710052494883825953955918423887242778169872049367771382892462080.0000            0.00s
predicting
this_file_MCC = 0.0398

【问题讨论】:

  • 你能找出导致这个问题的数据样本吗?
  • 我正在对大约 100 万行数据集的“咬样本”进行训练。每个样本大约有 100k 行。问题似乎与输入数据无关,因为我在相同的示例文件上运行了 sklearn.ensemble.ExtraTreesClassifier,没有出现错误。
  • 好的。我在问这样我们就可以有一个可重现的例子来在 sklearn 上放置一个错误。

标签: python python-2.7 scikit-learn gradient-descent


【解决方案1】:

您对“坏”示例的学习率太高,并且您在梯度提升算法的梯度下降步骤中跳过了局部或全局最小值。这会导致分歧情况,并导致您看到的错误激增。看看this lecture from Andrew Ng's Machine Learning Course。与学习率相关的部分大约在 4:30 出现。

将梯度下降/上升视为尝试找到通往山谷/山丘底部或顶部的路径的过程,或者理想情况下到达全球最低/最高点的过程。如果山丘/山谷非常大并且您采取微小的步骤,您最终应该能够找到至少到达当地最小值/最大值的方式。但是,如果山丘/山谷与您的步数相比很小,那么很容易跨越最大值/最小值并最终到达一个可怕的地方。学习率代表你的步长,在“好”的情况下,你的学习率 (alpha) 是 0.01,所以你可以在正确的方向(大部分)采取微小的步骤,直到达到最小值,但是在“坏”的情况下,您的 alpha 为 1.0,因此您迈出了大步并跳过了局部最小值并最终上升而不是下降。这是思考学习率在算法中的作用的一种非常基本的方式。

如果你在tuning the learning rate on DatumBox 上阅读这篇文章,你会看到一个经常被回收的过程可视化(不确定是谁从谁那里偷了这张图片,但它无处不在)以及一些关于自适应改变学习率的讨论。不确定这是否是 sklearn 中的默认设置,但我不会指望它。

【讨论】:

  • 由于我随机选择参数,我知道某些组合会是“坏的”。但是,当出现问题时,GradientBoostingClassifier 似乎正在输出垃圾。对于某些输入样本,相同的参数实际上可以正常工作并产生相当高的性能。
  • 这可能是随机种子的结果。你用的是固定种子吗?如果不是基于您开始下降的位置,则某些参数有时可能有效,但其他参数无效。
  • 如果您想找到最佳模型,我建议您使用 grid_serch 而不仅仅是随机化参数。
  • 我正在这样做:stat.berkeley.edu/~breiman/pastebite.pdf 使用堆叠比广泛调整单个模型的性能要好得多。
  • 这个问题不是关于如何调整梯度提升分类器,而是关于为什么详细输出包含垃圾。
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 2019-02-10
  • 2016-01-26
  • 2016-08-11
  • 2014-06-27
  • 2018-10-29
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多