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
4 Réponses :
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. p>
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.
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)
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?
Une version améliorée de réponse IAMPAT et légère modification de Les développeurs de Scikits doivent faire le tour.
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)