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

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 に答える