2016-08-28 2 views
1

私はsklearnのGridSearchに似たことをしようとしています:1、10、100に対応するC以外のすべてのパラメータが固定されている3つのモデルのリストを取得したい各モデルで。私は次の2つの機能を持っています。PythonのsklearnからGridSearchを再現できません

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]} 

ここで定義した関数を使用してモデルを生成します。

models = models_GridSearch(model, dic) 

しかし、結果は同じモデル(最後のパラメータ、つまり100を使用)を3回繰り返したものです。何らかのエイリアシングが起こっているようです。

答えて

3

modelmodel_GridSearchでリスト内包の各反復を通して同じオブジェクトを参照するので、あなただけの同じオブジェクトをC値を3回を割り当てています。この問題を解決するには、copyモジュールを使用してオブジェクトのコピーを作成するか、インスタンスではなくmodels_GridSearch関数にクラスを渡して、各繰り返しでオブジェクトをインスタンス化します。また、さまざまな方法でコードをリファクタリングして修正することもできます。それはすべてあなたの目標に依存します。

Copyメソッド:クラスの

import copy 

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

パス:

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

こんにちは、のみなどの追加情報:私は 'randomizedSearchCV'を使用し、' grid.predictを(やって) 'です'grid.best_estimator_.predict()'と同じです。これは、 '.best_estimator_'属性が存在するとき、モデルが訓練されていることをSklearnが想定しているからです。さもなければ、それは訓練されていないので、それを予測することは無意味です。したがって、 'grid.predict()'は '.best_estimator_'オブジェクトに直接インスタンス化します。本当に私はこのロジックが 'gridSearchCV'に対しても起こっているかどうかわかりません。 – Nacho

関連する問題