8
votes

GradientboostingClassificateur avec un BaseSimator en scikit-apprendre?

J'ai essayé d'utiliser GradientBoostingClassificateur dans Scikit-Apprendre et cela fonctionne bien avec ses paramètres par défaut. Cependant, lorsque j'ai essayé de remplacer la baseImator par un classificateur différent, il n'a pas fonctionné et m'a donné l'erreur suivante,

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


0 commentaires

4 Réponses :


4
votes

Stimulation de gradient nécessite généralement que l'apprenant de base soit un algorithme qui effectue une prédiction numérique, pas la classification. Je suppose que c'est votre problème.


2 commentaires

Merci pour votre commentaire. Si vous jetez un oeil à Sklearn / Ensemble / Gradient_boosting.py, vous pouvez constater qu'il a un support pour les problèmes de classification (rechercher ESIDUEL = Perte.Negative_gradent (Y, Y_PRED, K = K))


La poussée de dégradé est intrinsèquement un algorithme de régression. Il peut être adapté à la classification avec une fonction de perte appropriée. Je n'ai pas le temps de lire tout leur code, mais cela ne signifie pas que cela n'utilise pas de régresseur pour effectuer la classification. La fonction de perte des moindres carrés utilise la même méthode. J'essaierais d'abord un autre régresseur non linéaire de voir si le problème est bien que vous devriez utiliser un algorithme de régression. Je n'ai jamais vu que personne n'utilise une augmentation de gradient avec un algorithme capable de non-régression.



5
votes

Comme suggéré par les développeurs Scikit-apprendre, le problème peut être résolu en utilisant un adaptateur comme celui-ci:

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)


1 commentaires

Bonjour, je suis confronté à une erreur très similaire avec GBC et LR: y_pred [:, k] + = apprendre_rate * arbre.predict (x) .Ravel () IndexError: Trop d'indices - essayé d'utiliser votre idée de l'adaptateur, mais en vain. , l'erreur reste. Avez-vous des idées comment résoudre ce problème?



9
votes

Une version améliorée de réponse IAMPAT et légère modification de Les développeurs de Scikits doivent faire le tour. xxx


0 commentaires

5
votes

Voici une version complète et, à mon avis, version plus simple de l'extrait de code d'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)


0 commentaires