7

私はscikit-learnでGradientBoostingClassifierを使用しようとしましたが、デフォルトパラメータで正常に動作します。私は別の分類器でBaseEstimatorを交換しようとしたときしかし、それは仕事、私に次のエラーを与えていなかった、Scikit-learnでBaseEstimatorを使用したGradientBoostingClassifier?

return y - np.nan_to_num(np.exp(pred[:, k] - 
IndexError: too many indices 

あなたが問題のすべてのソリューションを持っていますか。

このエラーは、次のスニペットを使用して再生することができる:ここ

import numpy as np 
from sklearn import datasets 
from sklearn.ensemble import GradientBoostingClassifier 
from sklearn.linear_model import LogisticRegression 
from sklearn.utils import shuffle 

mnist = datasets.fetch_mldata('MNIST original') 
X, y = shuffle(mnist.data, mnist.target, random_state=13) 
X = X.astype(np.float32) 
offset = int(X.shape[0] * 0.01) 
X_train, y_train = X[:offset], y[:offset] 
X_test, y_test = X[offset:], y[offset:] 

### works fine when init is None 
clf_init = None 
print 'Train with clf_init = None' 
clf = GradientBoostingClassifier((loss='deviance', learning_rate=0.1, 
          n_estimators=5, subsample=0.3, 
          min_samples_split=2, 
          min_samples_leaf=1, 
          max_depth=3, 
          init=clf_init, 
          random_state=None, 
          max_features=None, 
          verbose=2, 
          learn_rate=None) 
clf.fit(X_train, y_train) 
print 'Train with clf_init = None is done :-)' 

print 'Train LogisticRegression()' 
clf_init = LogisticRegression(); 
clf_init.fit(X_train, y_train); 
print 'Train LogisticRegression() is done' 

print 'Train with clf_init = LogisticRegression()' 
clf = GradientBoostingClassifier(loss='deviance', learning_rate=0.1, 
          n_estimators=5, subsample=0.3, 
          min_samples_split=2, 
          min_samples_leaf=1, 
          max_depth=3, 
          init=clf_init, 
          random_state=None, 
          max_features=None, 
          verbose=2, 
          learn_rate=None) 
clf.fit(X_train, y_train) # <------ ERROR!!!! 
print 'Train with clf_init = LogisticRegression() is done' 

エラーのHTE完全なトレースバックである:一般ブースティング

Traceback (most recent call last): 
File "/home/mohsena/Dropbox/programing/gbm/gb_with_init.py", line 56, in <module> 
    clf.fit(X_train, y_train) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 862, in fit 
    return super(GradientBoostingClassifier, self).fit(X, y) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 614, in fit random_state) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 475, in _fit_stage 
    residual = loss.negative_gradient(y, y_pred, k=k) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 404, in negative_gradient 
    return y - np.nan_to_num(np.exp(pred[:, k] - 
    IndexError: too many indices 

答えて

4

によって示唆されるように開発者をscikit-学び、問題はこのようにアダプタを使用することによって解決することができますトリック。

class init: 
    def __init__(self, est): 
     self.est = est 
    def predict(self, X): 
     return self.est.predict_proba(X)[:,1][:,numpy.newaxis] 
    def fit(self, X, y): 
     self.est.fit(X, y) 
+0

こんにちは、私はGBCとLRと非常に似たエラーに直面しています:y_pred [:, k] + = learning_rate * tree.predict(X).ravel() IndexError:インデックスが多すぎます - 役に立たなかった場合、エラーは残ります。これを解決する方法はありますか? – abalogh

3

グラデーション行うアルゴリズムであることを基地学習者が必要数値予測、分類ではない。私はそれがあなたの問題だと思います。

def __init__(self, est): 
    self.est = est 
def predict(self, X): 
    return self.est.predict_proba(X)[:, 1] 
def fit(self, X, y): 
    self.est.fit(X, y) 
+0

ご意見ありがとうございます。 sklearn/ensemble/gradient_boosting.pyを見ると、分類問題をサポートしていることがわかります。(訳注:defid = loss.negative_gradient(y、y_pred、k = k)) – iampat

+0

勾配ブーストは本質的に回帰アルゴリズム。それは、適切な損失関数を有する分類に適合させることができる。 すべてのコードを読む時間がありませんが、それは回帰分析を使用して分類を実行しているわけではありません。最小2乗損失関数は、同じ方法を使用します。 まず、別の非線形回帰分析を試して、まず問題が回帰アルゴリズムを使用しているべきかどうかを確認します。 Gradient Boostingを非回帰可能なアルゴリズムで使用している人は見たことがありません。 –

4

これは完全で、私の意見では、iampatのコードスニペットの単純なバージョンです。

class RandomForestClassifier_compability(RandomForestClassifier): 
     def predict(self, X): 
      return self.predict_proba(X)[:, 1][:,numpy.newaxis] 
    base_estimator = RandomForestClassifier_compability() 
    classifier = GradientBoostingClassifier(init=base_estimator) 
関連する問題