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

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

新規登録して質問してみよう
ただいま回答率
85.49%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4123閲覧

python sklearnのall_estimators(type_filter="classifier")での識別機の件数について

watzkang98

総合スコア8

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/02/11 06:49

編集2020/02/11 09:58

前提・実現したいこと

https://betashort-lab.com/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/%E6%9C%80%E9%81%A9%E3%81%AA%E3%83%A2%E3%83%87%E3%83%AB%E9%81%B8%E3%81%B3all_estimators/

概ね、上のURL通りの学習をしていますが、どうも後も6番目のアルゴリズムの施行の際にエラーが起きてしまいます。
テキストを読みながら、google colabでメインに学習しています。
エラーメッセージから、yの値がstr型ではできないアルゴリズムを試行している感じはあるのですが...
~~このエラーの回避はどうすればいいのでしょうか?
~~
追)エラー回避ができました。そうなると、そもそもなぜこのエラーが起こったかが問題になります。試したことのところに記載してあります。

発生している問題・エラーメッセージ

google

1AdaBoostClassifier の正解率= 0.9666666666666667 2BaggingClassifier の正解率= 0.9666666666666667 3BernoulliNB の正解率= 0.26666666666666666 4CalibratedClassifierCV の正解率= 0.9666666666666667 5CategoricalNB の正解率= 0.9333333333333333 6--------------------------------------------------------------------------- 7ValueError Traceback (most recent call last) 8<ipython-input-46-e861a1f245d7> in <module>() 9 3 clf = algorithm() 10 4 11----> 5 clf.fit(x_train, y_train) 12 6 13 7 y_pred = clf.predict(x_test) 14 156 frames 16/usr/local/lib/python3.6/dist-packages/sklearn/utils/_mocking.py in fit(self, X, y, **fit_params) 17 93 assert self.check_y(y) 18 94 self.classes_ = np.unique(check_array(y, ensure_2d=False, 19---> 95 allow_nd=True)) 20 96 if self.expected_fit_params: 21 97 missing = set(self.expected_fit_params) - set(fit_params) 22 23/usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator) 24 529 array = array.astype(dtype, casting="unsafe", copy=False) 25 530 else: 26--> 531 array = np.asarray(array, order=order, dtype=dtype) 27 532 except ComplexWarning: 28 533 raise ValueError("Complex data not supported\n" 29 30/usr/local/lib/python3.6/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order) 31 83 32 84 """ 33---> 85 return array(a, dtype, copy=False, order=order) 34 86 35 87 36 37/usr/local/lib/python3.6/dist-packages/pandas/core/series.py in __array__(self, dtype) 38 949 warnings.warn(msg, FutureWarning, stacklevel=3) 39 950 dtype = "M8[ns]" 40--> 951 return np.asarray(self.array, dtype) 41 952 42 953 # ---------------------------------------------------------------------- 43 44/usr/local/lib/python3.6/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order) 45 83 46 84 """ 47---> 85 return array(a, dtype, copy=False, order=order) 48 86 49 87 50 51/usr/local/lib/python3.6/dist-packages/pandas/core/arrays/numpy_.py in __array__(self, dtype) 52 164 53 165 def __array__(self, dtype=None): 54--> 166 return np.asarray(self._ndarray, dtype=dtype) 55 167 56 168 _HANDLED_TYPES = (np.ndarray, numbers.Number) 57 58/usr/local/lib/python3.6/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order) 59 83 60 84 """ 61---> 85 return array(a, dtype, copy=False, order=order) 62 86 63 87 64 65ValueError: could not convert string to float: 'Iris-versicolor'

jupiternoteboook

1AdaBoostClassifier の正解率= 0.7333333333333333 2BaggingClassifier の正解率= 0.7333333333333333 3BernoulliNB の正解率= 0.0 4CalibratedClassifierCV の正解率= 0.4666666666666667 5CheckingClassifier の正解率= 0.0 6--------------------------------------------------------------------------- 7TypeError Traceback (most recent call last) 8<ipython-input-2-46de1eef946c> in <module> 9 16 allAlgorithms = all_estimators(type_filter="classifier") 10 17 for (name, algorithm) in allAlgorithms: 11---> 18 clf = algorithm() 12 19 13 20 clf.fit(X_train, y_train) 14 15TypeError: __init__() missing 1 required positional argument: 'base_estimator' 16

該当のソースコード

colab

1import pandas as pd 2from sklearn.model_selection import train_test_split 3from sklearn.metrics import accuracy_score 4import warnings 5from sklearn.utils.testing import all_estimators 6 7import urllib.request as req 8url = "https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv" 9savefile = "iris.csv" 10req.urlretrieve(url, savefile) 11iris_data = pd.read_csv(savefile, encoding="utf-8") 12 13y = iris_data.loc[:,"Name"] 14x = iris_data.loc[:,["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]] 15y 16 17x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = 0.2, train_size = 0.8, shuffle = True) 18 19warnings.filterwarnings('ignore') 20allAlgorithms = all_estimators(type_filter="classifier") 21 22for (name, algorithm) in allAlgorithms: 23 clf = algorithm() 24 25 clf.fit(x_train, y_train) 26 27 y_pred = clf.predict(x_test) 28 29 print(name,"の正解率=", accuracy_score(y_test, y_pred))

jupiternotebook

1import pandas as pd 2from sklearn.model_selection import train_test_split 3from sklearn.metrics import accuracy_score 4from sklearn.utils.testing import all_estimators 5from sklearn.datasets import load_iris 6import warnings 7warnings.filterwarnings('ignore') 8iris = load_iris() 9X = iris.data 10y = iris.target 11 12X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False) 13 14 15#最適なモデルを選ぶ 16all_estimators() 17allAlgorithms = all_estimators(type_filter="classifier") 18for (name, algorithm) in allAlgorithms: 19 clf = algorithm() 20 21 clf.fit(X_train, y_train) 22 23 y_pred = clf.predict(X_test) 24 25 print(name,"の正解率=", accuracy_score(y_test, y_pred)) 26

###試したこと
該当部分をいかに変更しました。これにより、エラー無視で処理が行なえます。

for (name, algorithm) in allAlgorithms: try: clf = algorithm() clf.fit(x_train, y_train) y_pred = clf.predict(x_test) print(name,"の正解率=", accuracy_score(y_test, y_pred)) except: pass

その結果が、以下となります。

AdaBoostClassifier の正解率= 0.7666666666666667 BaggingClassifier の正解率= 0.9666666666666667 BernoulliNB の正解率= 0.3 CalibratedClassifierCV の正解率= 0.9 CategoricalNB の正解率= 1.0 ComplementNB の正解率= 0.6666666666666666 DecisionTreeClassifier の正解率= 0.8666666666666667 DummyClassifier の正解率= 0.36666666666666664 ExtraTreeClassifier の正解率= 0.8333333333333334 ExtraTreesClassifier の正解率= 0.9666666666666667 GaussianNB の正解率= 0.9666666666666667 GaussianProcessClassifier の正解率= 1.0 GradientBoostingClassifier の正解率= 0.9666666666666667 HistGradientBoostingClassifier の正解率= 0.8666666666666667 KNeighborsClassifier の正解率= 1.0 LabelPropagation の正解率= 1.0 LabelSpreading の正解率= 1.0 LinearDiscriminantAnalysis の正解率= 1.0 LinearSVC の正解率= 0.9333333333333333 LogisticRegression の正解率= 1.0 LogisticRegressionCV の正解率= 1.0 MLPClassifier の正解率= 1.0 MultinomialNB の正解率= 0.9666666666666667 NearestCentroid の正解率= 1.0 NuSVC の正解率= 1.0 PassiveAggressiveClassifier の正解率= 0.8666666666666667 Perceptron の正解率= 0.6666666666666666 QuadraticDiscriminantAnalysis の正解率= 1.0 RadiusNeighborsClassifier の正解率= 1.0 RandomForestClassifier の正解率= 0.9333333333333333 RidgeClassifier の正解率= 0.8666666666666667 RidgeClassifierCV の正解率= 0.8666666666666667 SGDClassifier の正解率= 0.6666666666666666 SVC の正解率= 1.0

見た感じ、書籍や参考URLからClassfierの件数が多くなっていることがわかります。例えば、CategoricalNB など。
これは、
all_estimators(type_filter="classifier")
のclasssfierでフィルタされる、そもそものアルゴリズムが増えたという認識であっているでしょうか?
それとも、フィルタが間違っていたのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

なにで例外になっているのかを見てみると良いのでは。

python

1 try: 2 clf = algorithm() 3 clf.fit(x_train, y_train) 4 y_pred = clf.predict(x_test) 5 print(name,"の正解率=", accuracy_score(y_test, y_pred)) 6 except: 7 print("error", algorithm)

tracebackからもある程度は読めます。sklearn/utils/_mocking.pyでエラーになるのはCheckingClassifierの中で使われているcheck_arrayの中だ、というところまではスタックトレースから読めます(コードと突き合わせれば)。

こんな実装です。

scikit-learn/validation.py at 97d49f2074d69ed314531e8450b0af45ed3d59d1 · scikit-learn/scikit-learn

割と経験的な話で恐縮ですが、scikit-learnには「targetは文字列の配列とかでもいけなくはないけど、そんなに相性は良くない」「DataFrameとかでもいけなくはないけど、そんなに相性は(ry」といった特性があるように思います。目的変数はLabelEncoderで変換しておき、ついでにDataFrameからnumpy配列に変換して入力してあげると無難です。


次のは、必ずコンストラクタに引数を渡せという分類器があるので、そのせいでエラーになっています。これかな。

sklearn.multioutput.ClassifierChain — scikit-learn 0.22.1 documentation


classsfierでフィルタされる、そもそものアルゴリズムが増えたという認識であっているでしょうか?

その認識でいいかと思います。scikit-learnは活発に開発されており、分類器の種類も増えていますので、何が返るかは実行したscikit-learnのバージョンによって全然違います。

投稿2020/02/11 12:12

hayataka2049

総合スコア30933

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

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

watzkang98

2020/02/11 12:51

補足までご丁寧に...!ありがとうございます。 ちょうどerror起こしてるアルゴリズム名を出すコードにしておりました。 ``` for (name, algorithm) in allAlgorithms: try: clf = algorithm() clf.fit(x_train, y_train) y_pred = clf.predict(x_test) print(name,"の正解率=", accuracy_score(y_test, y_pred)) except: print(name) pass ``` 結果、以下のアルゴリズムがエラってました ``` CheckingClassifier ClassifierChain MultiOutputClassifier OneVsOneClassifier OneVsRestClassifier OutputCodeClassifier StackingClassifier VotingClassifier ``` >>tracebackからもある程度は読めます。 なるほど,,,パット見が難解すぎてスルーしてましたが今後は確認して行きます。 >>割と経験的な話で恐縮ですが... 今の僕には半分ほどしか理解できない部分ですが、こういうのすごくありがたいです...!本当にありがとうございます...!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問