2016-08-28 2 views
1

J'essaie de faire quelque chose de similaire à GridSearch dans sklearn: Je veux obtenir une liste de trois modèles, où tous les paramètres sont fixés à l'exception de C correspondant aux 1, 10 et 100 dans chaque modèle. J'ai les deux fonctions suivantes. Je construis ensuite un modèle et spécifie un dictionnaire de paramètres.Impossible de reproduire GridSearch à partir de sklearn en python

def params_GridSearch(dic_params): 
    keys, values = dic_params.keys(), dic_params.values() 
    lst_params = [] 
    for vs in itertools.product(*values): 
     lst_params.append({k:v for k,v in zip(keys,vs)}) 
    return lst_params 

def models_GridSearch(model, dic_params): 
    models = [ model.set_params(**params) for params in params_GridSearch(dic_params) ] 
    return models 

from sklearn.svm import SVC 
model = SVC() 
dic = {'C': [1,10,100]} 

Et de générer les modèles en utilisant les fonctions que je viens de définir.

models = models_GridSearch(model, dic) 

Cependant, le résultat est le même modèle (en utilisant le dernier paramètre, à savoir 100) étant répétée 3 fois. Il semble qu'il y ait un certain alias.

Répondre

3

model fait référence au même objet au cours de chaque itération de la liste dans model_GridSearch, alors vous êtes juste d'attribuer une valeur C 3 fois pour le même objet. Vous pouvez corriger plusieurs choses: vous pouvez copier l'objet à l'aide du module copy ou passer la classe dans la fonction models_GridSearch au lieu d'une instance, et instancier un objet à chaque itération. Vous pouvez également refactoriser votre code de différentes façons pour réparer les choses. Tout dépend de vos objectifs.

Copie Méthode:

import copy 

def models_GridSearch(model, dic_params): 
    models = [ copy.deepcopy(model).set_params(**params) for params in params_GridSearch(dic_params) ] 
    return models 

Pass en classe:

def models_GridSearch(Model, dic_params): 
    models = [ Model().set_params(**params) for params in params_GridSearch(dic_params) ] 
    return models 


from sklearn.svm import SVC 
Model = SVC 
dic = {'C': [1,10,100]} 

models = models_GridSearch(Model, dic) 
print models 
+0

Salut, seulement comme complément d'information: J'utilise '' randomizedSearchCV' et faire grid.predict() 'est équivalent à faire 'grid.best_estimator_.predict()'. C'est parce que sklearn suppose que lorsque l'attribut '.best_estimator_' est présent, le modèle est entraîné. Sinon, il n'est pas entraîné, donc il est insensé de prédire avec. Ainsi, 'grid.predict()' instancie directement l'objet '.best_estimator_'. Vraiment je ne sais pas si cette logique a lieu pour 'gridSearchCV' aussi. – Nacho