随机梯度提升给出不可预测的结果

时间:2013-05-16 05:44:18

标签: python machine-learning scikit-learn scikits

我正在使用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%)的准确度。知道为什么它的表现存在如此巨大的差距吗?

2 个答案:

答案 0 :(得分:4)

首先,几句话:

  • 算法的名称是Gradient Boosting(回归树或机器)并且与随机梯度下降没有直接关系

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

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

你在训练错误中观察到如此大的变化这一事实虽然很奇怪。也许您的输出信号与非常少量的信息功能非常相关,而大多数其他功能只是噪声?

您可以尝试将RandomForestClassifier模型放入数据中,并使用计算出的feature_importance_数组来丢弃嘈杂的功能并帮助稳定GBRT模型。

答案 1 :(得分: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)。

如果您没有看到突然跳跃且没有明显减少,我强烈建议先关闭子采样并调整学习速率。