我正在使用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%)的准确度。知道为什么它的表现存在如此巨大的差距吗?
答案 0 :(得分:4)
首先,几句话:
算法的名称是Gradient Boosting(回归树或机器)并且与随机梯度下降没有直接关系
您永远不应该评估机器学习算法对训练数据的准确性,否则您将无法检测到模型的过度拟合。使用: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模型。
答案 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)。
如果您没有看到突然跳跃且没有明显减少,我强烈建议先关闭子采样并调整学习速率。