1. ホーム
  2. コンパイラ言語
  3. パイソン

sklearn インターフェースがエラーを報告する Input contains NaN, infinity or value too large for dtype('float64')

2022-01-21 07:22:39

1. エラーのシナリオ

あるパッケージが スカラーン インターフェースで、Input に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれると fit(x,y) でエラーが報告されます。

2. エラーの原因

/sklearn/utils/validation.py ファイルを見ると、次のようなコードがありました。

  1. if is_float and (np.isfinite(_safe_accumulator_op(np.sum, X))):
  2. pass
  3. elif is_float:
  4. msg_err = "Input contains {} or a value too large for {!r}. "
  5. if (allow_nan and np.isinf(X).any() or
  6. not allow_nan and not np.isfinite(X).all()):
  7. type_err = 'infinity' if allow_nan else 'NaN, infinity'
  8. raise ValueError(
  9. msg_err.format
  10. (type_err,
  11. msg_dtype if msg_dtype is not None else X.dtype)
  12. )
  13. # for object dtype data, we only check for NaNs (GH-13254)
  14. elif X.dtype == np.dtype('object') and not allow_nan:
  15. if _object_dtype_isnan(X).any():
  16. raise ValueError("Input contains NaN")

を渡すと

np.isinf(X).any()=True or np.isfinite(X).all()=False to determine if the dataset contains infinite values

3. ソリューション

any() は or 演算で、任意の要素を True、出力を True にする。
all() は with 演算で、すべての要素が True になり、出力は True になります。

データセットをチェックし、もし

np.isinf(X).any()=False

np.isfinite(X).all()=Trueとする。

np.isnan(X).any()=False

であれば、データセットに欠損値や無限大の値が含まれていないことになります。

4. その他のチェック

チェック3が完了した時点で、私のデータセットには問題がないことがわかりました。しかし、まだInputが表示されます。 が含まれています。 NaN、infinity、またはdtype('float64')に対して大きすぎる値があり、考え込んでしまいます。

X.copy().fillna(-1).reset_index(drop=True)

Xは欠損値埋め操作を行ったが、yに何か問題があるのだろうか?

を実行した。

y = y.reset_index(drop=True)

というわけで、プログラムは元に戻りました・・・・。

5. まとめ

このエラーが発生した場合、以下の確認が必要です。

  • 欠落している値
  • 無限大の値
  • データフレームまたはシリーズのreset_index