ValueError: Girdi, NaN, sonsuzluk veya dtype için çok büyük bir değer içeriyor ('float32')


41

RandomForest modelini kullanarak test verilerini tahmin ederken ValueError aldım.

Benim kod:

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)

Hata:

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

Test veri setinde hatalı değerleri nasıl bulabilirim? Ayrıca, bu kayıtları bırakmak istemiyorum, onları ortalama ya da medyan ile değiştirebilir miyim?

Teşekkürler.

Yanıtlar:


44

İle np.isnan(X)sizin içeren pozisyonlar için true ile bir boolean maske geri almak NaNs.

İle np.where(np.isnan(X))sizin i, j koordinatları ile bir demet geri almak NaNs.

Son olarak, np.nan_to_num(X)sizinle "nan'i sıfırla ve sonlu sayılarla inf ile değiştir" ile.

Alternatif olarak, şunları kullanabilirsiniz:


Nan'i kontrol etmek için kimlik koşullarını tercih ediyorum, eğer x! = X return Yok, çoğu zaman np.isnan (x) benim için başarısız oldu, sebebini hatırlama
Itachi

1
NaN değerlerinin sıfırlarla değiştirilmesi tavsiye edilmez. NaN değerleri hala eksik ve önemini sıfırlarla etkilemede hala önemli olabilir, muhtemelen yapabileceğiniz en kötü şey ve kullandığınız en kötü değerlendirme yöntemidir. Değişkeninizi çarpıtacak olan sadece rasgele sıfırlar tanıtmakla kalmayacak, 0 değişkenlerinizde kabul edilebilir bir değer bile olmayacak, yani değişkeniniz gerçek bir sıfır olmayabilir.
hussam

Hiçbir rehberlik sağlamadığımı fark ettim. Verilerinizi etkilemek istiyorsanız, .rolling()eksik değeri bir haddeleme penceresinin ortalama değeriyle değiştirmek için kullanarak bir haddeleme ortalaması kullanın . Daha sağlam bir şey kullanmak istiyorsanız, <b> missingpy </b> modülünü kullanın, rastgele bir temsili işlem için kullanabilirsiniz MissForest.
hussam

7

X_testBir pandalar veri çerçevesi olduğunu varsayarsak , DataFrame.fillnaNaN değerlerini ortalamayla değiştirmek için kullanabilirsiniz :

X_test.fillna(X_test.mean())

X_test, numpy dizisidir. Sadece orijinal soruda df_test güncellendi, hala aynı hatayı aldım ...
Edamame

6

Bunun karşısında olan herkes için aslını değiştirmek için:

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

Orijinalin üzerine yazmak için:

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

Bir görünümde kopya olup olmadığını kontrol etmek için:

X_test._is_view

2
Bu teknik olarak doğru olsa da pratikte yanlıştır. X_test NA'larını X_test ortasıyla dolduramazsınız, çünkü gerçek hayatta bir örnek öngörürken X_test ortalamasına sahip olmazsınız. Bu (senaryolardan 99% olarak) elinde aslında tek veri olduğu için X_train ortalama kullanmalıdır
Omri374

4

Unutma

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

Bu np.nan değerlerini gösteren bir boole maskesi döndürür.

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

Hangi np.nan göründüğü satırları döndürür. Sonra basit indeksleme ile np.nan olan tüm puanlarınızı işaretleyebilirsiniz.

df.loc[row_mask,col_mask]

2

Benzer bir problemle karşılaştım ve numpy'nin NaN ve Inf'i farklı şekilde ele aldığını gördüm.
Verilerinizde Inf varsa, şunu deneyin:

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

Bu, NA değerlerinin mevcut olduğu yerlerin bir demetini verecektir.

Verilerinizde Nan varsa, şunu deneyin:

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

2

İnf değerleri de kontrol etmeyi unutmayın. Benim için çalışan tek şey:

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

Sklearn kullanıyorsanız ve hatta daha iyi

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 etiketlerinin bir dizisi olduğunda, örneğin:

number_features = ['median_income', 'gdp']

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.