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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

XGBoost

XGBoostは、アンサンブル学習と決定木を組み合わせた手法です。弱学習器の構築時に、以前構築された弱学習器の結果を用いて弱学習器を構築。高度な汎化能力を持ち、勾配ブースティングとも呼ばれています。

Python 3.x

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

Python

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

Q&A

解決済

1回答

1482閲覧

XGBoostError: value 0 for Parameter num_class

yusuke_nagayama

総合スコア13

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

XGBoost

XGBoostは、アンサンブル学習と決定木を組み合わせた手法です。弱学習器の構築時に、以前構築された弱学習器の結果を用いて弱学習器を構築。高度な汎化能力を持ち、勾配ブースティングとも呼ばれています。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/12/11 23:46

編集2021/12/12 14:24

前提・実現したいこと

薬の副作用の重症度を分類したく、検査値の変動が-25%,26-50%,51-75%,75%-といった形で4 classに分類し決定木を取り出して臨床応用したく分析を行っています。XGBoostでモデルを作成している途中で下記のエラーが発生しました。xは年齢、性別、体重、検査値、投与量などで、yは上記の検査値変動の分類で、左から0,1,2,3と定義しています。

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

エラーメッセージ
XGBoostError: value 0 for Parameter num_class should be greater equal to 1
num_class: Number of output class in the multi-class classification.

該当のソースコード

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0) params={ 'silent':1, 'max_depth':6, 'min_child_weight':1, 'eta':0.1, 'tree_method':'exact', 'objective':'multi:softmax', 'eval_metric':'mlogloss', 'predictor':'cpu_predictor'} dtrain = xgb.DMatrix(x_train,label=y_train) dtest = xgb.DMatrix(x_test,label=y_test) model = xgb.train(params=params, dtrain=dtrain, num_boost_round=1000, early_stopping_rounds=5, evals=[(dtest,'test')])

試したこと

・params={}にnum_class=4を入れて実行しましたがエラーメッセージに変化はありませんでした。
・model=xgb.train()にnum_class=4を入れて実行すると
TypeError: train() got an unexpected keyword argument 'num_class'が出ました

補足情報(FW/ツールのバージョンなど)

jupyter notebook python3 で実行しました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/12 12:46 編集

np.unique(y_train)の値に思った通りの値(4種類)が入っているか見てもらっていいですか? 動かしていないので完全にカンですが、エラーの言わんとするところが、XGBoostが「クラス情報がないのに何を学習しろと?」と言っているように見えます。つまり、XGBoostが怒っているのは(指定したclass数ではなく)実際に渡されたy_trainなのかy_testなのかが空っぽかもしれない、ということです。 念のため、明示的にparams={}のくだりに'num_class':4も加えてください。 ※質問掲載の編集画面で<CODE>ボタンを押すとPythonのコードを見やすく挿入できます。合わせてこれも編集ください。
yusuke_nagayama

2021/12/12 14:32

質問にお答えいただきありがとうございます。コードの部分は編集させていただきました。すごく見やすくなって感動しております。 np.unique(y_train)   で実行すると array([0, 1, 2, 3], dtype=int64)   と返ってきました。
guest

回答1

0

ベストアンサー

Google Colabで、適当なデータを使って実行し確認したところ、下記の変更をしたらエラーは出なくなりました

python

1params={ 2 'silent':1, 3 'max_depth':6, 4 'min_child_weight':1, 5 'eta':0.1, 6 'tree_method':'exact', 7 'objective':'multi:softmax', 8 'eval_metric':'mlogloss', 9 'predictor':'cpu_predictor'}

↓ 「'num_class':4」を追加

python

1params={ 2 'silent':1, 3 'max_depth':6, 4 'min_child_weight':1, 5 'eta':0.1, 6 'tree_method':'exact', 7 'objective':'multi:softmax', 8 'eval_metric':'mlogloss', 9 'predictor':'cpu_predictor', 10 'num_class':4}

上記の変更をする前は、下記のエラーが出ました

XGBoostError: value 0 for Parameter num_class should be greater equal to 1

投稿2021/12/13 00:27

編集2021/12/13 00:40
jbpb0

総合スコア7653

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

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

jbpb0

2021/12/13 00:33

データは、下記のようにして作りました x_train = np.random.rand(100, 10) y_train = np.random.randint(0, 4, (100, 1)) x_test = np.random.rand(100, 10) y_test = np.random.randint(0, 4, (100, 1)) 念のために、下記のようにして0〜3が全部揃わないようにしても、大丈夫でした y_train = np.random.randint(1, 3, (100, 1)) y_test = np.random.randint(0, 2, (100, 1))
yusuke_nagayama

2021/12/13 11:03

もう一度1からやり直したらできました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問