Comment utiliser la sortie de GridSearch?

23

Je travaille actuellement avec Python et Scikit learn à des fins de classification, et en lisant autour de GridSearch, j'ai pensé que c'était un excellent moyen d'optimiser mes paramètres d'estimateur pour obtenir les meilleurs résultats.

Ma méthodologie est la suivante:

  1. Divisez mes données en formation / test.
  2. Utilisez GridSearch avec la validation 5Fold Cross pour former et tester mes estimateurs (Random Forest, Gradient Boost, SVC entre autres) pour obtenir les meilleurs estimateurs avec la combinaison optimale d'hyper paramètres.
  3. Je calcule ensuite des métriques sur chacun de mes estimateurs tels que Precision, Recall, FMeasure et Matthews Correlation Coefficient, en utilisant mon ensemble de tests pour prédire les classifications et les comparer aux étiquettes de classe réelles.

C'est à ce stade que je vois un comportement étrange et je ne sais pas comment procéder. Dois-je prendre le .best_estimator_ de GridSearch et l'utiliser comme sortie «optimale» de la recherche dans la grille , et effectuer une prédiction à l'aide de cet estimateur? Si je fais cela, je trouve que les métriques de l'étape 3 sont généralement beaucoup plus faibles que si je m'entraîne simplement sur toutes les données d'entraînement et teste sur l'ensemble de test. Ou, est-ce que je prends simplement l'objet GridSearchCV de sortie comme nouvel estimateur ? Si je fais cela, j'obtiens de meilleurs scores pour mes métriques de stade 3, mais cela semble étrange d'utiliser un objet GridSearchCV au lieu du classificateur prévu (par exemple une forêt aléatoire) ...

EDIT: Ma question est donc quelle est la différence entre l'objet GridSearchCV retourné et l'attribut .best_estimator_? Laquelle de celles-ci dois-je utiliser pour calculer d'autres mesures? Puis-je utiliser cette sortie comme un classificateur ordinaire (par exemple en utilisant Predict), ou bien comment dois-je l'utiliser?

Dan Carter
la source

Réponses:

27

Décidé de partir et de trouver les réponses qui satisferaient ma question, et de les écrire ici pour quiconque se le demanderait.

L'attribut .best_estimator_ est une instance du type de modèle spécifié, qui a la «meilleure» combinaison de paramètres donnés de param_grid. Que cette instance soit utile ou non dépend du fait que le paramètre refit est défini sur True (c'est par défaut). Par exemple:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

Renvoie un RandomForestClassifier. Tout cela est assez clair dans la documentation . Ce qui n'est pas clair dans la documentation, c'est pourquoi la plupart des exemples n'utilisent pas spécifiquement le .best_estimator_ et font à la place ceci:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

Cette deuxième approche renvoie une instance de GridSearchCV, avec toutes les cloches et les sifflets de GridSearchCV tels que .best_estimator_, .best_params, etc., qui lui-même peut être utilisé comme un classificateur entraîné car:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

Il utilise simplement la même instance du meilleur estimateur lors des prévisions. Donc, dans la pratique, il n'y a pas de différence entre ces deux sauf si vous ne voulez spécifiquement que l'instance d'estimateur elle-même. En remarque, mes différences dans les métriques n'étaient pas liées à une fonction de pondération de classe de buggy.

Dan Carter
la source
Merci pour votre message @Dan, il est très utile. Je voulais vous demander une précision. A ce dernier cas, si je refit=Falsepuis clf.fitne sera pas fait le meilleur classificateur?
Poete Maudit
@PoeteMaudit Le paramètre refit indique à la fonction GridSearchCV de prendre les meilleurs paramètres trouvés et de recycler le modèle en utilisant ces paramètres sur l'ensemble de données entier. Si refit = False, alors best_estimator n'est pas disponible, selon la documentation: scikit-learn.org/stable/modules/generated/…
Dan Carter
0

GridSearchCV vous permet de combiner un estimateur avec un préambule de recherche de grille pour régler les hyper-paramètres. La méthode sélectionne le paramètre optimal à partir de la recherche dans la grille et l'utilise avec l'estimateur sélectionné par l'utilisateur. GridSearchCV hérite des méthodes du classificateur, donc oui, vous pouvez utiliser les méthodes .score, .predict, etc. directement via l'interface GridSearchCV. Si vous souhaitez extraire les meilleurs hyper-paramètres identifiés par la recherche dans la grille, vous pouvez utiliser .best_params_ et cela retournera le meilleur hyper-paramètre. Vous pouvez ensuite transmettre cet hyperparamètre à votre estimateur séparément.

L'utilisation directe de .predict donnera les mêmes résultats que l'obtention du meilleur hyper-paramètre via .best_param_, puis son utilisation dans votre modèle. En comprenant les rouages ​​soulignés de la recherche dans la grille, nous pouvons voir pourquoi c'est le cas.


Recherche dans la grille

Cette technique est utilisée pour trouver les paramètres optimaux à utiliser avec un algorithme. Ce ne sont PAS les poids ou le modèle, ceux-ci sont appris à l'aide des données. C'est évidemment assez déroutant donc je vais faire la distinction entre ces paramètres, en appelant un hyper-paramètres.

Les hyper-paramètres sont comme les k dans k-voisins les plus proches (k-NN). k-NN oblige l'utilisateur à sélectionner le voisin à considérer lors du calcul de la distance. L'algorithme ajuste ensuite un paramètre, un seuil, pour voir si un nouvel exemple correspond à la distribution apprise, cela se fait avec les données.

Comment choisissons-nous k?

Certaines personnes se contentent de recommandations basées sur des études antérieures du type de données. D'autres utilisent la recherche par grille. Cette méthode sera en mesure de déterminer au mieux quel k est optimal à utiliser pour vos données.

Comment ça marche?

[1,2,3,...,10]

Cela va à l'encontre des principes de non utilisation des données de test !!

nnn1n

La valeur d'hyper-paramètre sélectionnée est celle qui atteint les performances moyennes les plus élevées parmi les n-plis. Une fois que vous êtes satisfait de votre algorithme, vous pouvez le tester sur l'ensemble de test. Si vous allez directement à l'ensemble de test, vous risquez de sur-adapter.

JahKnows
la source
Salut Jah, c'est une bonne réponse mais je ne suis toujours pas plus sage quant à la réponse à ma question. J'ai mis à jour le titre de la question et la question elle-même pour essayer de clarifier les choses.
Dan Carter
Écrivez votre propre recherche sur la grille. Il s'agit littéralement de créer un tableau, puis d'ajouter une boucle for autour de votre modèle. Ensuite, à la fin de votre boucle for, enregistrez les performances résultantes dans un tableau. Après avoir parcouru toutes les valeurs possibles de votre grille, examinez les tableaux de performances et choisissez la meilleure. C'est la valeur optimale pour votre hyper-paramètre. S'appuyer sur des fonctions intégrées pour les bases n'est pas recommandé pour la science des données. Les données varient énormément et il est préférable pour vous d'avoir le contrôle!
JahKnows
Ce serait une bonne suggestion si je n'avais qu'un seul hyperparamètre à optimiser, mais si j'en ai 4? 5? Une boucle imbriquée 4/5 fois est moche et je ne vois pas la nécessité de réinventer la roue ici, ce serait une perte de temps, et c'est la raison pour laquelle des packages comme celui-ci existent.
Dan Carter
GridSearchCV vous permet de combiner un estimateur avec le paramètre GridSearchCV. Il fait donc exactement ce dont nous venons de parler. Il sélectionne ensuite le paramètre optimal et l'utilise avec l'estimateur que vous avez sélectionné. GridSearchCV hérite des méthodes du classificateur, donc oui, vous pouvez utiliser les méthodes .score, .predict, etc. directement via l'interface GridSearchCV. Je ne recommande pas de le faire cependant, des outils plus faciles signifient moins de contrôle. Pour quelque chose d'aussi simple qu'une recherche dans la grille, codez-le vous-même.
JahKnows
1
Cette réponse ne répond pas à la question, qui concerne l'utilisation de GridSearchCV.
Hobbes