我正在使用 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 %)。
首先,有几点评论:
该算法的名称是梯度提升(回归树或机器),与随机梯度下降没有直接关系
使用sklearn.cross_validation.train_test_split
将X
和y
拆分为X_train
,y_train
用于拟合,X_test
,y_test
用于评分。
现在来回答你的问题,GBRT 模型确实是非确定性模型。为了获得确定性 / 可重现的运行,您可以通过random_state=0
来播种伪随机数生成器(或者通过max_features=None
,但不建议这样做)。
事实上,你在训练误差中观察到如此大的变化是很奇怪的,也许你的输出信号与非常少量的信息特征非常相关,而大多数其他特征只是噪音?
您可以尝试使RandomForestClassifier
模型适合您的数据,并使用计算的feature_importance_
数组来丢弃噪声特征并帮助稳定 GBRT 模型。
您应该查看每次迭代的训练损失,这可能表明损失是否突然“跳跃”,这可能表明数值困难:
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)。
如果您没有看到突然的跳跃,并且没有实质性的减少,我强烈建议先关闭子采样并调整学习率。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(87条)