web-dev-qa-db-ja.com

sklearnエラーValueError:入力にNaN、無限大、またはdtypeには大きすぎる値が含まれています( 'float64')

私はsklearnを使用していて、親和性伝播に問題があります。入力行列を作成しましたが、次のようなエラーが表示され続けます。

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

走った

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

使ってみた

mat[np.isfinite(mat) == True] = 0

無限の値を削除するにはこれはうまくいきませんでした。アフィニティ伝播アルゴリズムを使用できるようにするために、行列内の無限値を取り除くために何ができますか?

私はanacondaとpython 2.7.9を使っています。

86
Ethan Waldie

これはscikitの中で起こるかもしれません、そしてそれはあなたがしていることによります。あなたが使用している関数のドキュメントを読むことをお勧めします。あなたは依存するものを使用しているかもしれません。あなたのマトリックスが明確かつ明確な基準を満たしていないこと。

EDIT:どうしてそれを見逃すことができます:

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

明らかに間違っています。正しいでしょう:

np.any(np.isnan(mat))

そして

np.all(np.isfinite(mat))

any関数の戻り値が数値かどうかではなく、要素のいずれかがNaNであるかどうかを確認します。

76
Marcus Müller

sklearnパンダで使用したときに同じエラーメッセージが表示されました。私の解決策は、sklearnコードを実行する前に、データフレームのインデックスdfをリ​​セットすることです。

df = df.reset_index()

私はdfからいくつかのエントリを削除したときにこの問題に何度も遭遇しました。

df = df[df.label=='desired_one']
23
Jun Wang

私の入力csvは空のスペースを持っていたので私の入力配列の次元はゆがんでいました。

11
Ethan Waldie

これはそれが失敗するチェックです:

それは言う

def _assert_all_finite(X):
    """Like assert_all_finite, but only for ndarray."""
    X = np.asanyarray(X)
    # First try an O(n) time, O(1) space solution for the common case that
    # everything is finite; fall back to O(n) space np.isfinite to prevent
    # false positives from overflow in sum method.
    if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum())
            and not np.isfinite(X).all()):
        raise ValueError("Input contains NaN, infinity"
                         " or a value too large for %r." % X.dtype)

そのため、入力にNaN以外の値があることを確認してください。そしてそれらの値はすべて実はfloat値です。いずれの値もInfにしないでください。

8
tuxdna

これはnanInfのデータセットを消去するための( this に基づく)私の関数です。

import pandas as pd

def clean_dataset(df):
    assert isinstance(df, pd.DataFrame), "df needs to be a pd.DataFrame"
    df.dropna(inplace=True)
    indices_to_keep = ~df.isin([np.nan, np.inf, -np.inf]).any(1)
    return df[indices_to_keep].astype(np.float64)
6
Boern

このバージョンのpython 3では

/opt/anaconda3/bin/python --version
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)

エラーの詳細を見ると、失敗の原因となっているコード行が見つかりました。

/opt/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X)
     56             and not np.isfinite(X).all()):
     57         raise ValueError("Input contains NaN, infinity"
---> 58                          " or a value too large for %r." % X.dtype)
     59 
     60 

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

これから、私はエラーメッセージによって与えられた同じテストを使用して私のデータで起こっていることをテストする正しい方法を抽出することができました:np.isfinite(X)

それから素早くて汚いループで、私のデータが確かにnansを含んでいることがわかりました。

print(p[:,0].shape)
index = 0
for i in p[:,0]:
    if not np.isfinite(i):
        print(index, i)
    index +=1

(367340,)
4454 nan
6940 nan
10868 nan
12753 nan
14855 nan
15678 nan
24954 nan
30251 nan
31108 nan
51455 nan
59055 nan
...

あとは、これらのインデックスの値を削除するだけです。

4
Raphvanns

行のサブセットを選択しようとした後にエラーが発生しました。

df = df.reindex(index=my_index)

my_indexdf.indexに含まれていない値が含まれていることが判明したため、reindex関数はいくつかの新しい行を挿入し、それらにnanを入力しました。

3
Elias Strehle

私も同じエラーがあり、私の場合はXとyがデータフレームだったので、それらを行列に変換する必要がありました。

X = X.as_matrix().astype(np.float)
y = y.as_matrix().astype(np.float)
2
tekumara

私は同じエラーを受けました。置き換えや置き換えなどを行う前にdf.fillna(-99999, inplace=True)でうまくいきました

1
Cohen

やってみる

mat.sum()

データの合計が無限大(最大浮動小数点数の3.402823e + 38より大きい)の場合、そのエラーが発生します。

scikitソースコードのvalidation.pyにある_assert_all_finite関数を見てください。

if is_float and np.isfinite(X.sum()):
    pass
Elif is_float:
    msg_err = "Input contains {} or a value too large for {!r}."
    if (allow_nan and np.isinf(X).any() or
            not allow_nan and not np.isfinite(X).all()):
        type_err = 'infinity' if allow_nan else 'NaN, infinity'
        # print(X.sum())
        raise ValueError(msg_err.format(type_err, X.dtype))
0
Rick Hill

私の場合、問題は多くのscikit関数がnumpy配列を返すことで、これはパンダインデックスを持たないことです。そのため、それらの派手な配列を使用して新しいDataFrameを作成し、それから元のデータと混在させようとしたときに、インデックスの不一致がありました。

0
luca