Ich habe ValueError erhalten, als ich Testdaten mit einem RandomForest-Modell vorhersagte.
Mein Code:
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)
Der Fehler:
ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
Wie finde ich die schlechten Werte im Testdatensatz? Ich möchte diese Datensätze auch nicht löschen. Kann ich sie einfach durch den Mittelwert oder den Median ersetzen?
Vielen Dank.
python
random-forest
pandas
Edamame
quelle
quelle
.rolling()
, um den fehlenden Wert durch den Mittelwert eines gleitenden Fensters zu ersetzen. Wenn Sie etwas Robusteres möchten, verwenden Sie das Modul <b> missingpy </ b>, das SieMissForest
für eine zufallsbasierte Imputation verwenden können.Angenommen, es
X_test
handelt sich um einen Pandas-Datenrahmen, können SieDataFrame.fillna
die NaN-Werte durch den Mittelwert ersetzen:quelle
Um das Original tatsächlich zu ändern, gehen Sie wie folgt vor:
So überschreiben Sie das Original:
So prüfen Sie, ob Sie sich in einer Kopie oder in einer Ansicht befinden:
quelle
Nicht vergessen
Dadurch wird eine boolesche Maske zurückgegeben, die np.nan-Werte angibt.
Was die Zeilen zurückgibt, in denen np.nan auftaucht. Dann können Sie durch einfaches Indizieren alle Ihre Punkte markieren, die np.nan sind.
quelle
Ich hatte ein ähnliches Problem und sah, dass Numpy mit NaN und Inf unterschiedlich umgeht.
Falls Ihre Daten Inf haben, versuchen Sie Folgendes:
Dies gibt ein Tupel von Orten an, an denen NA-Werte vorhanden sind.
Falls Ihre Daten Nan haben, versuchen Sie Folgendes:
quelle
Vergessen Sie nicht, auch nach inf-Werten zu suchen. Das einzige was bei mir geklappt hat:
Und noch besser, wenn Sie sklearn verwenden
Wenn number_features ein Array der number_features-Labels wäre, zum Beispiel:
quelle
Hier ist der Code für "Ersetzen von NaN durch Null und Unendlich durch große endliche Zahlen". mit numpy.nan_to_num .
Siehe auch die Antwort von fernando .
quelle
Ich hatte eine Nan im Etikettenobjekt. Also vergiss nicht, es zu überprüfen!
quelle