オリジナルのデータセットを用いて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.
というエラーが生じ、何が問題なのか、どう対処すれば良いのかわかりません。
やり方としては後者の方が正しいのかな?と考えておりますが、対応策を教えて頂けましたら幸いです。
どうぞよろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/12 11:14