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

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

ただいまの
回答率

90.10%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 61

rneko

score 12

お世話になります.

前提・実現したいこと

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

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

from sklearn.multioutput import MultiOutputRegressor
from xgboost import XGBRegressor
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

xgb = XGBRegressor()
pipe_reg = Pipeline([("mltxgb", MultiOutputRegressor(xgb))]) # Pipelineを用います
param_xgb = {'mltxgb__estimator__max_depth': [2,4,6], 'mltxgb__estimator__n_estimators': [50,100,200]}
reg_cv = GridSearchCV(pipe_reg, param_xgb, cv=5)
reg_cv.fit(X, y)


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

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


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

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

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

----> 1 reg_cv.fit(seq_train, target_train)
# 省略
/usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan)
     54                 not allow_nan and not np.isfinite(X).all
     55             type_err = 'infinity' if allow_nan else 'NaN, infinity'
---> 56             raise ValueError(msg_err.format(type_err, X.dtype))
     57     # for object dtype data, we only check for NaNs (GH-13254)
     58     elif X.dtype == np.dtype('object') and not allow_nan:

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').


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

試したこと

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

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


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • tiitoi

    2019/10/09 19:16

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

    キャンセル

  • rneko

    2019/10/09 19:25

    tiitoiさん
    ご返信ありがとうございます.
    「NaNを埋める」は「NaNを補間する」
    という意味で使っていました.

    XGBoostやLight GBMは,NaNを入力しても大丈夫だという記述を何度か見たことがあるのですが(例えばhttp://threeprogramming.lolipop.jp/blog/?p=964),私が何か間違った認識をしてしまっているのでしょうか.

    キャンセル

  • tiitoi

    2019/10/09 19:52

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

    キャンセル

  • hayataka2049

    2019/10/10 01:23

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

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 90.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる