Saya mendapat ValueError saat memprediksi data uji menggunakan model RandomForest.
Kode saya:
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)
Kesalahan:
ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
Bagaimana cara menemukan nilai buruk dalam dataset uji? Juga, saya tidak ingin menghapus catatan ini, dapatkah saya menggantinya dengan nilai tengah atau median?
Terima kasih.
python
random-forest
pandas
sejenis kacang-kacangan dari Jepang
sumber
sumber
.rolling()
untuk mengganti nilai yang hilang dengan nilai rata-rata dari jendela bergulir. Jika Anda menginginkan sesuatu yang lebih kuat, gunakan modul <b> missingpy </b> yang dapat Anda gunakanMissForest
untuk imputasi berbasis hutan acak.Dengan asumsi
X_test
adalah kerangka data panda, Anda dapat menggunakanDataFrame.fillna
untuk mengganti nilai NaN dengan mean:sumber
Bagi siapa saja yang melakukan hal ini, untuk benar-benar mengubah yang asli:
Untuk menimpa yang asli:
Untuk memeriksa apakah Anda berada dalam salinan vs tampilan:
sumber
Jangan lupa
Yang mengembalikan topeng boolean yang menunjukkan nilai np.nan.
Yang mengembalikan baris tempat np.nan muncul. Kemudian dengan pengindeksan sederhana Anda dapat menandai semua poin Anda yang np.nan.
sumber
Jangan lupa untuk memeriksa nilai inf juga. Satu-satunya hal yang berhasil untuk saya:
Dan bahkan lebih baik jika Anda menggunakan sklearn
Ketika number_features akan menjadi array dari label number_features, misalnya:
sumber
Saya menghadapi masalah serupa dan melihat bahwa numpy menangani NaN dan Inf secara berbeda.
Jika Anda memiliki data Inf, coba ini:
Ini akan memberikan tuple lokasi tempat di mana nilai-nilai NA ada.
Jika Anda memiliki data Nan, coba ini:
sumber
Dalam kebanyakan kasus, menyingkirkan nilai tak terbatas dan nol memecahkan masalah ini.
singkirkan nilai yang tak terbatas.
singkirkan nilai-nilai nol seperti yang Anda suka, nilai spesifik seperti 999, berarti, atau buat fungsi Anda sendiri untuk menyalahkan nilai yang hilang
atau
sumber
Jika nilai Anda lebih besar dari
float32
, coba jalankan scaler terlebih dahulu. Itu akan agak tidak biasa untuk memiliki penyimpangan yang mencakup lebih darifloat32
.sumber
Berikut adalah kode untuk cara "Ganti NaN dengan nol dan tak terbatas dengan angka hingga yang besar." menggunakan numpy.nan_to_num .
Lihat juga jawaban fernando .
sumber