0

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

4

2 回答 2

5

首先,有几点说明:

  • 该算法的名称是 Gradient Boosting(回归树或机器),与 Stochastic Gradient Descent 没有直接关系

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

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

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

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

于 2013-05-16T09:10:52.117 回答
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)。

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

于 2013-05-17T06:26:30.970 回答