【问题标题】:Stochastic Gradient Boosting giving unpredictable results随机梯度提升产生不可预测的结果
【发布时间】:2013-05-10 21:27:40
【问题描述】:

我正在使用 Python 的 Scikit 模块来实现随机梯度提升。我的数据集有 2700 个实例和 1700 个特征 (x),并且包含二进制数据。我的输出向量是“y”,包含 0 或 1(二进制分类)。我的代码是,

gb = GradientBoostingClassifier(n_estimators=1000,learn_rate=1,subsample=0.5) gb.fit(x,y)

print gb.score(x,y)

运行一次,准确度为 1.0 (100%),有时准确度约为 0.46 (46%)。知道为什么它的性能差距如此之大吗?

【问题讨论】:

    标签: python machine-learning scikit-learn scikits


    【解决方案1】:

    您应该查看每次迭代的训练损失,这可能表明损失是否突然“跳跃”,这可能表明存在数值困难::

    import pylab as plt
    train_scores = gb.train_score_
    plt.plot(np.arange(train_scores.shape[0]), train_scores, 'b-')
    

    生成的图应该逐渐减小,就像左图中的蓝线http://scikit-learn.org/dev/auto_examples/ensemble/plot_gradient_boosting_regression.html

    如果您看到逐渐减少但突然跳跃,则可能表明存在数值稳定性问题 - 为了避免它们,您应该降低学习率(例如尝试 0.1)。

    如果您没有看到突然的跳跃并且没有大幅下降,我强烈建议您先关闭子采样并调整学习率。

    【讨论】:

      【解决方案2】:

      先说两句:

      • 算法的名称是梯度提升(回归树或机器),与随机梯度下降没有直接关系

      • 您永远不应该根据您的训练数据评估机器学习算法的准确性,否则您将无法检测到模型的过度拟合。使用:sklearn.cross_validation.train_test_splitXy 拆分为X_trainy_train 用于拟合,X_testy_test 用于评分。

      现在回答您的问题,GBRT 模型确实是非确定性模型。要获得确定性/可重现的运行,您可以传递 random_state=0 为伪随机数生成器提供种子(或者传递 max_features=None,但不建议这样做)。

      您观察到训练误差如此大的变化这一事实很奇怪。如果您的输出信号与极少数的信息特征非常相关,并且大多数其他特征只是噪声,那么也许您的输出信号只是噪声?

      您可以尝试将 RandomForestClassifier 模型拟合到您的数据中,并使用计算出的 feature_importance_ 数组来丢弃噪声特征并帮助稳定您的 GBRT 模型。

      【讨论】:

        猜你喜欢
        • 2012-07-02
        • 2018-02-21
        • 1970-01-01
        • 2017-03-01
        • 1970-01-01
        • 2018-09-21
        • 2012-05-29
        • 1970-01-01
        • 2019-12-04
        相关资源
        最近更新 更多