随机梯度提升给出不可预测的结果(gradient boosting python)

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

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

gb = GradientBoostingClifier(n_estimators=1000,learn_rate=1,subsample=0.5) gb.fit(x,y) print gb.score(x,y)

一旦我运行它,并得到了 1.0(100 %)的精度,有时我得到的精度约为 0.46(46 %)。

5

首先,有几点评论:

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

使用sklearn.cross_validation.train_test_splitXy拆分为X_trainy_train用于拟合,X_testy_test用于评分。

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

事实上,你在训练误差中观察到如此大的变化是很奇怪的,也许你的输出信号与非常少量的信息特征非常相关,而大多数其他特征只是噪音?

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

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

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(314)
在Microsoft365管理中心中部署OfficeWeb加载项
上一篇
登录前带光标的黑屏(windows black screen on boot)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(65条)