🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

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

Python

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

Q&A

1回答

4435閲覧

PipelineでXGBoostを行うときにNaNを埋めることなく使いたい

rneko

総合スコア18

機械学習

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

Python

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

0グッド

0クリップ

投稿2019/10/09 10:04

お世話になります.

前提・実現したいこと

Google Colabを使用しています.
以下のようにライブラリを読み込み,XGBoostで多クラスの出力を行うことを目的としています.
その一貫として,グリッドサーチを行います.この際,MultiOutputRegressorを用いるため,Pipelineを用いました.
参考にしたページ(Stack Overflow)

この際,Pipelineを用いると,データセットにNaNが有った場合にエラーが出てしまうことが問題で,それを解決したいと思っています.

python

1from sklearn.multioutput import MultiOutputRegressor 2from xgboost import XGBRegressor 3from sklearn.pipeline import Pipeline 4from sklearn.model_selection import GridSearchCV 5 6xgb = XGBRegressor() 7pipe_reg = Pipeline([("mltxgb", MultiOutputRegressor(xgb))]) # Pipelineを用います 8param_xgb = {'mltxgb__estimator__max_depth': [2,4,6], 'mltxgb__estimator__n_estimators': [50,100,200]} 9reg_cv = GridSearchCV(pipe_reg, param_xgb, cv=5) 10reg_cv.fit(X, y)

入力値Xと予測値yの配列は以下あくまで例ですが,このような配列があるとして質問させてください.

python

1print(X.shape) # (227900, 1128) 2print(y.shape) # (227900, 108)

この配列にはNaNが含まれています

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

このときに以下のようなエラーが発生します.

python

1----> 1 reg_cv.fit(seq_train, target_train) 2# 省略 3/usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan) 4 54 not allow_nan and not np.isfinite(X).all 5 55 type_err = 'infinity' if allow_nan else 'NaN, infinity' 6---> 56 raise ValueError(msg_err.format(type_err, X.dtype)) 7 57 # for object dtype data, we only check for NaNs (GH-13254) 8 58 elif X.dtype == np.dtype('object') and not allow_nan: 9 10ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

どうやら,Pipelineでエラーが発生していると思われます.

試したこと

Pipelineが原因だとわかったのは,以下のような処理を試して同様のエラーを得たためです.

python

1xgb = XGBRegressor() 2pipe_reg = Pipeline([("mltxgb", MultiOutputRegressor(xgb))]) 3pipe_reg.fit(X, y)

同様にMultiOutputRegressor(xgb)をフィットさせようとしたところ,エラーは出ませんでした.

どのようにすれば良いのか,教えていただければ幸いです.
よろしくお願いいたします.

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

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

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

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

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

tiitoi

2019/10/09 10:16

機械学習のアルゴリズムを実行する以上、NaN はメディアンなどで埋めるか、NaN が含まれるサンプルを消すかしか選択肢はないように思いますが、「NaNを埋めることなく」とはどういう意味でしょうか?
rneko

2019/10/09 10:25

tiitoiさん ご返信ありがとうございます. 「NaNを埋める」は「NaNを補間する」 という意味で使っていました. XGBoostやLight GBMは,NaNを入力しても大丈夫だという記述を何度か見たことがあるのですが(例えばhttp://threeprogramming.lolipop.jp/blog/?p=964),私が何か間違った認識をしてしまっているのでしょうか.
tiitoi

2019/10/09 10:52

確かに調べたら、XGBoost は NaN が入力にあってもよいという記述がありました。 すみませんが、XGBoost は詳しくないので、そのエラーの解決方法はわからないです。 ごめんなさい。
hayataka2049

2019/10/09 16:23

エラーの省略部分を記載してください。すべて見てみないとエラーが出た経緯がわからないです。
guest

回答1

0

Pipelineを使うのをやめたらいかがでしょうか。

XGBoostならば直接多クラス判別が可能ですので。
たとえば下記記事などご参考になるかと

Python: XGBoost を使ってみる

投稿2020/07/04 06:14

aokikenichi

総合スコア2240

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問