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

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

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

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

Python 3.x

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

Q&A

1回答

7142閲覧

lightgbmの訓練データとテストデータについて

s_kj

総合スコア31

DataSet

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

Python 3.x

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

0グッド

0クリップ

投稿2021/05/05 07:36

機械学習の勉強中の初学者です。
lightgbmに関する質問です。

lightgbmは初めて使ってみたのですが、これまで使ってみたサポートベクターマシンと比較すると70%そこそこの精度が、80%まで改善し驚いています。

一方で、学習モデルを構築する際、コードの③のlgb.train()では、予測対象のlgb_eval(テストデータ)をvalid_setsの引数に使用しています。
サポートベクターマシンでは、②のようにデータセットは作成せず、コードの①のように分割するだけで良いと認識しています。

コードの②と、③のvalid_setsにはどのような意味があるのでしょうか。
予測対象を学習モデルの構築に使用している違和感を感じているのですが、間違いないでしょうか。
(valid_setsを記載しないで学習することはできませんでした)

*学習モデル構築の時点で、予測データも学習に使用してしまい予測精度が高くなってしまっていることを危惧しています。

ご回答よろしくお願いいたします。

#①訓練データとテストデータに分割する X_train, X_test, y_train, y_test = train_test_split(X, y) #②データセットを生成する lgb_train = lgb.Dataset(X_train, y_train) lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) # LightGBM のハイパーパラメータ params = {'objective': 'binary','metric': 'auc','verbosity': -1} # ③上記のパラメータでモデルを学習する model = lgb.train(params, lgb_train, **valid_sets=lgb_eval,** verbose_eval=50,num_boost_round=1000, early_stopping_rounds=100)``` #学習モデルでの予測 y_pred = model.predict(X_test, num_iteration=model.best_iteration)

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

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

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

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

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

guest

回答1

0

valid_setsを記載しないで学習することはできませんでした

lightgbm.train
に「valid_sets」は「optional」と書かれてるので、無くてもいいはずです

「model = lgb.train(...」から「early_stopping_rounds=100」を削除すれば、「valid_sets=lgb_eval」無しで学習できませんでしょうか?

 
確認のため、
【Python】Kaggleで引っ張りだこ!lightgbmの2種類の使い方!Training APIとScikit-learn API!【lightgbm】
の「Training API」のPythonコードで、下記を変更して、他はそのままで実行したら、学習後の推定結果の精度や混合行列は上記Webページの記載と同じになりました

python

1X = cancer.data # Numpy array

↓ 修正 (全角スペースを半角に)

python

1X = cancer.data # Numpy array

.

python

1 early_stopping_rounds=20, 2 valid_sets=[validation_data]

↓ 修正 (コメント化)

python

1 #early_stopping_rounds=20, 2 #valid_sets=[validation_data]

.

python

1accuracy = accuracy_score(y_pred, y_test)

↓ 修正

python

1accuracy = accuracy_score(y_pred, y_validation)

.

python

1cm = confusion_matrix(y_test, y_pred)

↓ 修正

python

1cm = confusion_matrix(y_validation, y_pred)

下記をコードの最後に追加

python

1import matplotlib.pyplot as plt 2plt.show()

投稿2021/05/06 05:18

編集2021/05/06 05:58
jbpb0

総合スコア7651

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

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

s_kj

2021/05/07 07:24

ご回答ありがとうございます。 1点目ですが、valid_setsを記載しない、かつ「early_stopping_rounds=100」を削除することで、学習を実施することができました。 一方で、学習の精度は10%程度下がってしまい、valid_setsが予測の精度に影響を与えている懸念は払拭できませんでした。 まずは、感謝申し上げるとともに、Lightgbmの奥の深さも理解しましたので、勉強を重ねたいと思います。
jbpb0

2021/05/07 07:58

> valid_setsが予測の精度に影響を与えている懸念は払拭できません データを ・学習用 ・valid_sets用 ・最終テスト用 に分けて、最終テスト用データでの結果が、valid_setsの有無でどう変わるのか、を確認してみたらいかがでしょうか? もし、valid_sets有りの方が(valid_sets用データとは異なる)最終テスト用データでの結果が良ければ、valid_sets有りの方がうまく学習できてることになりますよね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問