質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3284閲覧

scikit-learnのRandomizedSearchCVエラー

mimamoru

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/05/06 05:19

編集2018/05/06 10:23
import numpy as np from sklearn import datasets from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LogisticRegression from sklearn.decomposition import PCA from sklearn.svm import SVC from sklearn.pipeline import Pipeline digits = datasets.load_digits() X,y=digits.data,digits.target from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0) clf1=LogisticRegression() clf2=SVC() estimators = [('pca', PCA()), ('clf', clf1)] pipe1 = Pipeline(estimators) param1 = {'clf__C':[1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 'pca__whiten':[True,False], } gs = GridSearchCV(pipe1, param1) gs.fit(X_train, y_train) gs.score(X_test, y_test) from sklearn.model_selection import RandomizedSearchCV estimators= [('pca', PCA()), ('clf',SVC())] pipe2 = Pipeline(estimators) gamma_range_exp = np.arange(-10.0, 0.0, 3) gamma_range = 10 ** gamma_range_exp param2 =[ {'clf__C':[1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 'clf__kernel':['linear'], 'pca__whiten':[True,False], 'pca__n_components': [30, 20, 10]}, {'clf__C':[1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 'clf__kernel':['rbf'], 'gamma': gamma_range, 'pca__whiten':[True,False], 'pca__n_components': [30, 20, 10]} ] gs = RandomizedSearchCV(pipe2, param2, n_jobs=-1, verbose=2) gs.fit(X_train, y_train)

エラー内容
AttributeError Traceback (most recent call last)
<ipython-input-11-21305e2006cc> in <module>()
12
13 gs = RandomizedSearchCV(pipe2, param2, n_jobs=-1, verbose=2)
---> 14 gs.fit(X_train, y_train)

~/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_search.py in fit(self, X, y, groups, **fit_params)
616 n_splits = cv.get_n_splits(X, y, groups)
617 # Regenerate parameter iterable for each fit
--> 618 candidate_params = list(self._get_param_iterator())
619 n_candidates = len(candidate_params)
620 if self.verbose > 0:

~/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_search.py in iter(self)
236 # in this case we want to sample without replacement
237 all_lists = np.all([not hasattr(v, "rvs")
--> 238 for v in self.param_distributions.values()])
239 rnd = check_random_state(self.random_state)
240

AttributeError: 'list' object has no attribute 'values'

イメージ説明

イメージ説明

イメージ説明

イメージ説明

イメージ説明

1のようにグリットサーチをしたかったのですが、エラーが出てしまいました。
何がちがうのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/05/06 09:17

質問文のコードは画像で貼らずに、ソースコードをcodeタグで囲って記載していただけませんか。
guest

回答2

0

ベストアンサー

umyuさんのfixで問題なく動かせました。

python: 3.6.3
numpy: 1.14.2
sklearn: 0.19.1

python

1import numpy as np 2from sklearn import datasets 3from sklearn.model_selection import GridSearchCV 4from sklearn.linear_model import LogisticRegression 5from sklearn.decomposition import PCA 6from sklearn.svm import SVC 7from sklearn.pipeline import Pipeline 8digits = datasets.load_digits() 9 10X, y = digits.data, digits.target 11 12from sklearn.model_selection import train_test_split 13X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) 14 15clf1 = LogisticRegression() 16clf2 = SVC() 17 18estimators = [('pca', PCA()), 19 ('clf', clf1)] 20pipe1 = Pipeline(estimators) 21 22param1 = {'clf__C': [1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 23 'pca__whiten': [True, False]} 24 25gs = GridSearchCV(pipe1, param1) 26gs.fit(X_train, y_train) 27 28print(gs.score(X_test, y_test)) 29 30from sklearn.model_selection import RandomizedSearchCV 31estimators = [('pca', PCA()), 32 ('clf', SVC())] 33pipe2 = Pipeline(estimators) 34gamma_range_exp = np.arange(-10.0, 0.0, 3) 35gamma_range = 10 ** gamma_range_exp 36 37param2 = {'clf__C': [1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 38 'clf__kernel': ['rbf', 'linear'], 39 'clf__gamma': gamma_range, 40 'pca__whiten': [True, False], 41 'pca__n_components': [30, 20, 10]} 42 43print('start') 44gs = RandomizedSearchCV(pipe2, param2, n_jobs=-1, verbose=2) 45gs.fit(X_train, y_train)

投稿2018/05/06 12:32

編集2018/05/06 12:33
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/05/06 12:54

>mkgreiさんへ お手数をおかけしました。こちらの環境ではjoblibのImportErrorが発生します><
mimamoru

2018/05/06 13:05

ありがとうございます。 確かにmkgreiさんのコードではエラーが出ませんが、'clf__kernel'のlinearにはgammaがないのすよね?計算の無駄になるので、辞書のリストにするようにと学んだのですが違うのでしょうか? from sklearn.svm import SVC clf = SVC() C_range_exp = np.arange(-2.0, 10.0) C_range = 10 ** C_range_exp gamma_range_exp = np.arange(-10.0, 0.0, 3) gamma_range = 10 ** gamma_range_exp param = [ {'C': C_range, 'kernel': ['linear']}, {'C': C_range, 'gamma': gamma_range, 'kernel': ['rbf']} ] gs = GridSearchCV(clf, param, n_jobs=-1, verbose=2) gs.fit(X_train, y_train) のようなコードを参考にしました
mimamoru

2018/05/06 13:14

ありがとうございます。なかなか難しいですねm(_ _)m 私はmacで実行しています^ - ^
mkgrei

2018/05/06 13:18

@mimamoruさん 更新タイミングでずれてしまいました。 GridSearchCVとRandomizedSearchCVでparams_gridの引数のとり方が少し違います。 GridSearchCVならlistを渡せるのですが、RandomizedSearchCVではdictしか受け付けません。 確かに無駄があるかもしれません… 改善法を探ってみます。
mimamoru

2018/05/06 13:25

そうだったんですね!ありがとうございます!試しにGridSearchCVにして実行していますが...やはり時間がかかりすぎますね笑 お二方とも回答ありがとうございました! とても勉強になりました!
umyu

2018/05/06 13:34

>mkgreiさんへ 情報ありがとうございました。if __name__ == '__main__':で一連の処理を囲むとjoblibのImportErrorが発生しなくなりました。勉強になりました。
mkgrei

2018/05/06 14:13

@mimamoruさん いろいろ試してみましたがRandomizedSearchCVでは調整できないかもしれませんね。 hyperoptなど他のライブラリを検討する必要があるかもしれません。 @umyuさん 解決してよかったです。
mimamoru

2018/05/07 02:54

ありがとうございました! 私ももう少し勉強してみます!
guest

0

Python

1AttributeError: 'list' object has no attribute 'values'

param2 がlistになっているので、[]を外して実行しても同じエラーが発生しますか?

Python

1param2 ={'clf__C':[1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 2 'clf__kernel':['linear'], 3 'pca__whiten':[True,False], 4 'pca__n_components': [30, 20, 10]}, 5 6 {'clf__C':[1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 7 'clf__kernel':['rbf'], 8 'gamma': gamma_range, 9 'pca__whiten':[True,False], 10 'pca__n_components': [30, 20, 10]} 11

追記
VotingClassifierを使いつつGridSearchCV/RandomizedSearchCVでパラメータチューニング


Python

1param2 ={'clf__C':[1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 2 'clf__kernel':['rbf', 'linear'], 3 'clf__gamma': gamma_range, 4 'pca__whiten':[True,False], 5 'pca__n_components': [30, 20, 10]} 6

◇実行環境
python: 3.6.5
numpy: 1.13.3
sklearn: 0.19.1
OS: Windows 10
PyCharmより実行。

txt

1ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not support forking. To use parallel-computing in a script, you must protect your main loop using "if __name__ == '__main__'". Please see the joblib documentation on Parallel for more information

joblibはどこに・・・


mkgreiさんに教えて頂いたリンクにより質問文のコードを改造した処
Windows環境でもエラーは発生しないようにできました。

Python

1import numpy as np 2from sklearn import datasets 3from sklearn.model_selection import GridSearchCV 4from sklearn.linear_model import LogisticRegression 5from sklearn.decomposition import PCA 6from sklearn.svm import SVC 7from sklearn.pipeline import Pipeline 8from sklearn.model_selection import train_test_split 9from sklearn.model_selection import RandomizedSearchCV 10 11 12def main() ->None: 13 digits = datasets.load_digits() 14 X, y = digits.data, digits.target 15 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) 16 17 clf1 = LogisticRegression() 18 clf2 = SVC() 19 estimators = [('pca', PCA()), 20 ('clf', clf1)] 21 pipe1 = Pipeline(estimators) 22 param1 = {'clf__C': [1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 23 'pca__whiten': [True, False]} 24 gs = GridSearchCV(pipe1, param1) 25 gs.fit(X_train, y_train) 26 print(gs.score(X_test, y_test)) 27 estimators = [('pca', PCA()), 28 ('clf', SVC())] 29 pipe2 = Pipeline(estimators) 30 gamma_range_exp = np.arange(-10.0, 0.0, 3) 31 gamma_range = 10 ** gamma_range_exp 32 33 param2 = {'clf__C': [1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], 34 'clf__kernel': ['rbf', 'linear'], 35 'clf__gamma': gamma_range, 36 'pca__whiten': [True, False], 37 'pca__n_components': [30, 20, 10]} 38 39 print('start') 40 gs = RandomizedSearchCV(pipe2, param2, n_jobs=-1, verbose=2) 41 gs.fit(X_train, y_train) 42 43 44if __name__ == '__main__': 45 main() 46

投稿2018/05/06 10:30

編集2018/05/06 13:41
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimamoru

2018/05/06 11:02

ありがとうございます。 File "<ipython-input-14-460466b2ce87>", line 6 {'clf__C':[1e-5, 1e-3, 1e-2, 1, 1e2, 1e5, 1e10], ^ IndentationError: unexpected indent というエラーが発生してしまいます。
umyu

2018/05/06 11:17 編集

あ、ごめんなさい。間違った回答になってしまったので、お手数ですが低評価をお願いします。 params2の宣言を変更して手元の環境で実行してみましたが。 別のエラーが発生したので、ちょっと詳しい方を待たれたほうが良いかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問