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


41

RandomForestモデルを使用してテストデータを予測すると、ValueErrorが発生しました。

私のコード:

clf = RandomForestClassifier(n_estimators=10, max_depth=6, n_jobs=1, verbose=2)
clf.fit(X_fit, y_fit)

df_test.fillna(df_test.mean())
X_test = df_test.values  
y_pred = clf.predict(X_test)

エラー:

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

テストデータセットで不適切な値を見つけるにはどうすればよいですか?また、これらのレコードを削除したくないのですが、平均値または中央値に置き換えることはできますか?

ありがとう。

回答:


45

ではnp.isnan(X)、あなたは含む位置に対して真とブールマスク取り戻すNaN秒。

を使用しnp.where(np.isnan(X))て、i、j座標のNaNsを持つタプルを取得します。

最後に、np.nan_to_num(X)「nanをゼロに、infを有限数に置き換えて」ください。

または、次を使用できます。

  • 欠損値の平均/中央値代入のsklearn.impute.SimpleImputer、または
  • pandas ' pd.DataFrame(X).fillna()、ゼロで埋める以外の何かが必要な場合。

x!= xがNoneを返し、np.isnan(x)が何度も失敗した場合、nanをチェックするためのアイデンティティ条件を好む、理由を覚えていない
イタチ

1
NaN値をゼロに置き換えることはお勧めできません。NaN値は欠落しているという意味でまだ重要である可能性があり、ゼロでそれらを代入することはおそらくあなたができる最悪のことであり、使用する最悪の代入方法です。変数をゆがめる可能性のあるゼロを任意に導入するだけでなく、変数で0が許容値にならない場合もあります。つまり、変数に真のゼロがない場合があります。
フッサム

私はガイダンスを提供していないことに気付きました。データを補完する場合、ローリング平均を使用.rolling()して欠損値をローリングウィンドウの平均値に置き換えます。より堅牢なモジュールが必要な場合は、<b> missingpy </ b>モジュールを使用MissForestして、ランダムフォレストベースの代入に使用できます。
ハッサム

7

X_testパンダのデータフレームであると仮定するとDataFrame.fillna、NaN値を平均に置き換えることができます。

X_test.fillna(X_test.mean())

X_testはnumpy配列です。元の質問のdf_testを更新しましたが、それでも同じエラーが発生しました...
枝豆

6

これに遭遇した人のために、実際にオリジナルを変更するには:

X_test.fillna(X_train.mean(), inplace=True)

オリジナルを上書きするには:

X_test = X_test.fillna(X_train.mean())

コピー中かビュー中かを確認するには:

X_test._is_view

2
これは技術的には事実ですが、実際には間違っています。X_test NAにX_test平均を入力することはできません。実際の生活では、サンプルを予測するときにX_test平均を取得できないためです。X_train平均を使用する必要があるのは、これが実際に手元にある唯一のデータであるためです(シナリオの99%で)
Omri374

4

忘れないで

col_mask=df.isnull().any(axis=0) 

np.nan値を示すブールマスクを返します。

row_mask=df.isnull().any(axis=1)

np.nanが現れた行を返します。次に、単純なインデックス付けにより、np.nanであるすべてのポイントにフラグを立てることができます。

df.loc[row_mask,col_mask]

2

私は同様の問題に直面し、numpyがNaNとInfを異なる方法で処理するのを見ました。
データにInfがある場合は、これを試してください:

np.where(x.values >= np.finfo(np.float64).max)
Where x is my pandas Dataframe 

これにより、NA値が存在する場所の場所のタプルが提供されます。

データにNanが含まれている場合は、これを試してください:

np.isnan(x.values.any())

2

inf値も確認することを忘れないでください。私のために働いた唯一のもの:

df[df==np.inf]=np.nan
df.fillna(df.mean(), inplace=True)

sklearnを使用している場合はさらに良い

def replace_missing_value(df, number_features):

    imputer = Imputer(strategy="median")
    df_num = df[number_features]
    imputer.fit(df_num)
    X = imputer.transform(df_num)
    res_def = pd.DataFrame(X, columns=df_num.columns)
    return res_def

number_featuresがnumber_featuresラベルの配列の場合、例えば:

number_features = ['median_income', 'gdp']

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