1. ホーム
  2. Machine Learning

RandomizedSearchCV と GridSearchCV で、fit メソッドを呼び出すと list オブジェクトに属性 'values' がないエラーが発生する。

2022-02-09 20:36:09

[Pyhon version 3.5.0 skit-learn version <0.18.1> ]です。

昨日見つけた、RandomizedSearchCVがチューニングされない問題。

# Split the dataset in two equal parts
X_train, X_test, y_train, y_test = train_test_split(
    data,label, test_size=0.25, random_state=0)
 
# Set the parameters by cross-validation
tuned_parameters = [{'n_neighbors': range(2,7)},
                     {'leaf_size':range(9,100,3)},
                     {'p':range(1,5)}]
 
svr = KNeighborsClassifier()
 
scores = ['precision', 'recall']
 
for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()
 
    labels=y_train.values
    aa
    c, r = labels.shape
    labels = labels.reshape(c,)
 
    clf = RandomizedSearchCV(svr, tuned_parameters,cv=5,n_jobs=-1,verbose=3)
# clf = GridSearchCV(svr, tuned_parameters,cv=5,n_jobs=-1,verbose=3)
clf.fit(X_train, labels)



以下のようにエラーが報告されます。

 File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)
 
  File "C:/Users/gzhuangzhongyi/Desktop/NetEase/test/RandomSearchCV_Functional.py", line 46, in <module>
    clf.fit(X_train, labels)
 
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 1190, in fit
    return self._fit(x, y, groups, sampled_params)
 
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 564, in _fit
    for parameters in parameter_iterable
 
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 758, in __call__
    while self.dispatch_one_batch(iterator):
 
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 603, in dispatch_one_batch
    tasks = BatchedCalls(itertools.islice(iterator, batch_size))
 
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 127, in __init__
    self.items = list(iterator_slice)
 
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 557, in <genexpr>
    )(delayed(_fit_and_score)(clone(base_estimator), X, y, self.scorer_,
 
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 230, in __iter__
    for v in self.param_distributions.values()])
 
AttributeError: 'list' object has no attribute 'values'



フィット視聴後 メソッドで、どのように調整しても フィット メソッドのパラメータを指定しますが、どれもうまくいきません。

しかし、もしあなたが GridSearchCV が実行できるようになります。

クラスの実装を見てみると、どちらのクラスも同じように フィット メソッドですが フィット メソッドには暗黙のうちにパラメータが渡されます。

sampled_params = ParameterSampler(self.param_distributions,
                                          self.n_iter,
                                          random_state=self.random_state)
        return self._fit(x, y, groups, sampled_params)



<スパン ここで sampled_params は、入力されるパラメータのサンプリングです。

その受信パラメータは、初期化時に渡される。

clf = RandomizedSearchCV(svr, tuned_parameters,cv=5,n_jobs=-1,verbose=3)



そして、このパラメータは次のように与えられます。

tuned_parameters = [{'n_neighbors': range(2,7)},
                     {'leaf_size':range(9,100,3)},
                     {'p':range(1,5)}]



ステートメントが設定されている、ここには3つの辞書があります。そして、正しいのは

tuned_parameters = [{'n_neighbors': range(2,7),
                     'leaf_size':range(9,100,3),
                     'p':range(1,5)}]






グリッド は、辞書にあるすべてのパラメータの組み合わせに対して反復処理されるので、辞書の分割は重要ではありません。

 for p in self.param_grid:
            # Always sort the keys of a dictionary, for reproducibility
            items = sorted(p.items())
            if not items:
                yield {}
            else:
                keys, values = zip(*items)
                for v in product(*values):
                    params = dict(zip(keys, v))
                    yield params




<スパン しかし ランダム化する。 辞書として渡された場合、その辞書の値を取る分布として扱われる

# Always sort the keys of a dictionary, for reproducibility
            items = sorted(self.param_distributions.items())
            for _ in six.moves.range(self.n_iter):
                params = dict()
                for k, v in items:
                    if hasattr(v, "rvs"):
                        if sp_version < (0, 16):
                            params[k] = v.rvs()
                        else:
                            params[k] = v.rvs(random_state=rnd)
                    else:
                        params[k] = v[rnd.randint(len(v))]
                yield params



ランダム は入力された引数をチェックし、それがトラバース可能であればそれを分布と見なします。

として渡されたパラメータは フィット トラバース可能なオブジェクトの辞書としてではなく、パラメータのセットで .値 その代わり、配布要素をひとつずつ組み合わせて、辞書のように リスト が、ディストリビューションが渡される代わりに リスト だから、分布に値を取ることはできない。


上記2つの関数、GridSearchCVは、以下のようなパラメータセットを生成します。


RandomizeSearchCVで生成されたパラメータセットは、デバッグのチューニングができないため、表示することができません。