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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

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

Python

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

Q&A

解決済

1回答

1948閲覧

アンサンブル学習(VotingClassifier)のエラー

yakinikuteishok

総合スコア6

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/06/06 09:02

編集2021/06/06 09:05

オリジナルのデータセットを用いてLightGBMで機械学習モデルを作成し(5 seed x 5 cv の計25モデル)、それらをsklearnのVotingClassifierのsoft-votingでアンサンブルする際にエラーが発生しました。

python

1X = df.data # 説明変数 2y = df.target # 目的変数 3 4# 学習データとテストデータに分ける 5X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=11, stratify=y) 6 7# 学習データを学習用と検証用に分ける 8X_train, X_eval, y_train, y_eval = train_test_split(X_train, y_train, test_size=0.2, random_state=22, stratify=y_train) 9 10# LightGBMの5つのモデルを保存するリストの初期化 11lgbm_models = [] 12 13# 5つのシード値で予測 14for seed_no in range(5): 15 16 # KFlodクラスをインスタンス化(これを使って5分割する) 17 kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed_no) 18 19 # KFoldクラスで分割した回数だけ実行(=5) 20 for tr_idx, va_idx in kf.split(X_train, y_train): 21 tr_x, va_x = X_train.iloc[tr_idx], X_train.iloc[va_idx] 22 tr_y, va_y = y_train.iloc[tr_idx], y_train.iloc[va_idx] 23 24 # 学習用 25 lgb_train = lgb.Dataset(tr_x, tr_y) 26 27 # 検証用 28 lgb_val = lgb.Dataset(va_x, va_y, reference=lgb_train) 29 30 # パラメータの設定 31 params = {'task': 'train', 32 'boosting_type': 'gbdt', 33 'learning_rate': 0.02, 34 'num_leaves': 16, 35 'min_data_in_leaf': 1, 36 'objective': 'binary', 37 'metric': 'binary_logloss'} 38 39 # 学習の経過を保存する箱 40 validation_results = {} 41 42 # LightGBMの学習を実行 43 model = lgb.train(params, 44 train_set=lgb_train, 45 num_boost_round=10000, 46 valid_names=['train', 'valid'], 47 valid_sets=[lgb_train, lgb_val], 48 evals_result=validation_results, 49 early_stopping_rounds=100, 50 verbose_eval=-1) 51 52 # テストデータで予測する 53 # 予測確率 54 y_pred_proba = model.predict(X_test, num_iteration=model.best_iteration) 55 56 # 確率を予測ラベル(0または1)に 57 y_pred = np.round(y_pred_proba) 58 59 # 学習が終わったモデルをリストに入れておく 60 lgbm_models.append(model)

上記のlgbm_modelsには25の'lightgbm.basic.Booster'が入っていることは確認できました。
これを用いて、

python

1XX = np.array(X_test) 2yy = np.array(y_test) 3 4s_voting = VotingClassifier(lgbm_models, voting='soft') 5s_voting.fit(XX, yy)

としても、

python

1--------------------------------------------------------------------------- 2TypeError Traceback (most recent call last) 3<ipython-input-169-04ddf77ec35b> in <module> 4 1 s_voting = VotingClassifier(lgbm_models, voting='soft') 5----> 2 s_voting.fit(XX, yy) 6 7~/opt/anaconda3/lib/python3.7/site-packages/sklearn/ensemble/voting.py in fit(self, X, y, sample_weight) 8 277 transformed_y = self.le_.transform(y) 9 278 10--> 279 return super().fit(X, transformed_y, sample_weight) 11 280 12 281 def predict(self, X): 13 14~/opt/anaconda3/lib/python3.7/site-packages/sklearn/ensemble/voting.py in fit(self, X, y, sample_weight) 15 85 % (len(self.weights), len(self.estimators))) 16 86 17---> 87 names, clfs = zip(*self.estimators) 18 88 self._validate_names(names) 19 89 20 21TypeError: zip argument #1 must support iteration

というエラーが生じます。

【試したこと】
公式ドキュメント(https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html)の使用例を見ると、

python

1eclf1 = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='hard')

となっていたので、

python

1# 試しに3つだけ取り出してみる 2s_voting = VotingClassifier([('lgbm1', lgbm_models[0]), ('lgbm2', lgbm_models[1]), ('lgbm3', lgbm_models[2])], voting='soft') 3s_voting.fit(XX, yy)

としてみましたが、今度は

python

1TypeError: Cannot clone object '<lightgbm.basic.Booster object at 0x7fcf73baa890>' (type <class 'lightgbm.basic.Booster'>): it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods.

というエラーが生じ、何が問題なのか、どう対処すれば良いのかわかりません。
やり方としては後者の方が正しいのかな?と考えておりますが、対応策を教えて頂けましたら幸いです。
どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

lgb.trainの代わりに、lgb.LGBMClassifierの返り値を入れてください。
s_voting.fit(XX, yy)とするとlgbmもtrainingされます。

投稿2021/06/07 13:30

fukatani

総合スコア626

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

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

yakinikuteishok

2021/06/12 11:14

ありがとうございました!解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問