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


127

私は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を使用しています。


3
私はこれを閉じることに投票します。著者は自分のデータは無効であり、すべてがそれを指し示していても、彼は検証しませんでした。
マーカス・ミュラー

11
私のデータセットにも同じ問題がありました。結局のところ、scikitの学習のバグではなく、データの間違いです。以下の回答のほとんどは役に立ちますが、誤解を招きます。チェックチェックデータをチェックし、変換時にfloat64有限であり、有限ではないことを確認してくださいnan。エラーメッセージは適切です-これはほぼ間違いなくここにいる人にとって問題です。
オーウェン

1
レコードと@Owenの+1については、入力データを確認し、行またはグリッドに欠損値がないことを確認してください。Imputerクラスを使用して、この問題を回避できます。
abautista

回答:


103

これはscikit内で発生する可能性があり、それはあなたが何をしているかに依存します。使用している関数のドキュメントを読むことをお勧めします。たとえば、マトリックスが正定であり、その基準を満たさないことに依存するものを使用している可能性があります。

編集:どうすればそれを逃すことができますか:

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であるかどうかを確認したい場合...


4
ドキュメントではこのエラーについて何も触れていません。nupy配列から無限値を取り除く方法が必要です
Ethan

3
私が言ったように:それらはおそらくあなたの入力配列にありません。それらは、入力と魔法の出力の間で発生する数学で発生する可能性があります。重要なのは、このすべての計算は入力の特定の条件に依存するということです。ドキュメントを注意深く読んで、入力がこれらの条件を満たしているかどうかを確認する必要があります。
マーカス・ミュラー

1
@MarcusMüllerに、入力行列の要件を指定しているこのドキュメントの場所を教えてもらえますか?あなたが参照している「ドキュメント」が見つからないようです。ありがとうございます:)
user2253546

38

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

df = df.reset_index()

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

df = df[df.label=='desired_one']

1
わたしは、あなたを愛しています!これは、エラーの原因がわからないにもかかわらず、適切な解決策を見つけることのまれな例です。
Alexandr Kapshuk、2018

df.reset_index()を実行することにより、結果のdfに列として「インデックス」を追加します。これは、すべてのシナリオに役立つわけではありません。df.reset_index(drop = True)が実行された場合、同じエラーがスローされます。
smm 2018

14

これは、(に基づいて私の機能であり、こののデータセットをきれいにする)nanInfおよび(スキューデータセットの)不足している細胞:

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)

なぜナンを2回落とすの?最初に、dropna次にinfをドロップするときに2回目。
luca

この関数を使用してデータセットをクリーンアップすると、一部のデータが失われます。なぜ問題があるのですか???
hackerbuddy

2
これがうまくいった唯一の答えです。私はSOで他の20の答えを試しましたが、うまくいきませんでした。これにはもっと投票が必要だと思います。
コンタンゴ


10

これは失敗したチェックです:

それは言う

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以外の値があることを確認してください。そして、これらすべての値は実際には浮動小数点値です。いずれの値もInfであってはなりません。


5

このバージョンの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

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

df = df.reindex(index=my_index)

ことが判明したmy_indexに含まれていなかった含まれている値df.indexREINDEX機能は、いくつかの新しい行を挿入して、それらを満たしたので、nan


2

ほとんどの場合、無限値とnull値を取り除くことでこの問題は解決します。

無限値を取り除く。

df.replace([np.inf, -np.inf], np.nan, inplace=True)

好きな方法でnull値、999などの特定の値を取り除く、平均する、または欠損値を補完する独自の関数を作成する

df.fillna(999, inplace=True)

2

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

X = X.values.astype(np.float)
y = y.values.astype(np.float)

編集:最初に提案されたX.as_matrix()は非推奨です


1

同じエラーが発生しました。それはで働いdf.fillna(-99999, inplace=True)置換など、任意の交換を行う前に、


4
これは汚い修正です。配列にnan値が含まれているのには理由があります。あなたはそれを見つける必要があります。
エリアスストレーレ

データにはnanが含まれる可能性があり、これにより、データを、彼/彼女が許容できると
考える

0

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


0

すべての無限値を削除します。

(およびその列の最小または最大に置き換えます)

# find min and max values for each column, ignoring nan, -inf, and inf
mins = [np.nanmin(matrix[:, i][matrix[:, i] != -np.inf]) for i in range(matrix.shape[1])]
maxs = [np.nanmax(matrix[:, i][matrix[:, i] != np.inf]) for i in range(matrix.shape[1])]

# go through matrix one column at a time and replace  + and -infinity 
# with the max or min for that column
for i in range(log_train_arr.shape[1]):
    matrix[:, i][matrix[:, i] == -np.inf] = mins[i]
    matrix[:, i][matrix[:, i] == np.inf] = maxs[i]

-1

試す

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))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.