ValueError: Input contiene NaN, infinito o un valore troppo grande per DTYPE ( 'float32')
-
16-10-2019 - |
Domanda
Ho ValueError quando la previsione dei dati di test utilizzando un modello foresta casuale.
Il mio codice:
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)
L'errore:
ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
Come faccio a trovare i valori cattivi nel set di dati di prova? Inoltre, non voglio far cadere questi record, posso semplicemente sostituirli con la mediana media o?
Grazie.
Soluzione
Con np.isnan(X)
si ottiene un back maschera booleana con vero per le posizioni che contengono NaN
s.
Con np.where(np.isnan(X))
si ottiene indietro una tupla con i, j coordinate di NaN
s.
Infine, con np.nan_to_num(X)
si "sostituisce nan con zero e inf con numeri finiti".
In alternativa, è possibile utilizzare:
- sklearn.impute.SimpleImputer / imputazione mediana media dei dispersi valori, o
-
pd.DataFrame(X).fillna()
panda, se avete bisogno di qualcosa di diverso riempimento con zeri.
Altri suggerimenti
Supponendo X_test
è un dataframe panda, è possibile utilizzare DataFrame.fillna
per sostituire i valori NaN con la media:
X_test.fillna(X_test.mean())
Per chiunque accadendo in questo, di modificare in realtà l'originale:
X_test.fillna(X_train.mean(), inplace=True)
Per sovrascrivere l'originale:
X_test = X_test.fillna(X_train.mean())
Per verificare se siete in una copia vs vista:
X_test._is_view
Non dimenticate
col_mask=df.isnull().any(axis=0)
che restituisce una maschera booleano che indica valori np.nan.
row_mask=df.isnull().any(axis=1)
che restituiscono le righe in cui apparve np.nan. Poi con una semplice indicizzazione è possibile bandiera tutti i punti che sono np.nan.
df.loc[row_mask,col_mask]
Ho affrontato problema simile e ho visto che le maniglie NumPy Nan e Inf in modo diverso.
Incase se si dispone di dati Inf, provate questo:
np.where(x.values >= np.finfo(np.float64).max)
Where x is my pandas Dataframe
Questo darà una tupla di posizione dei luoghi in cui i valori di NA sono presenti.
Incase se i dati ha Nan, provate questo:
np.isnan(x.values.any())
Non dimenticare di verificare la presenza di valori inf pure. L'unica cosa che ha funzionato per me:
df[df==np.inf]=np.nan
df.fillna(df.mean(), inplace=True)
E ancora meglio se si utilizza 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
Quando number_features sarebbe una matrice delle etichette number_features, ad esempio:
number_features = ['median_income', 'gdp']
Ecco il codice per come "Sostituisci NaN con zero e infinito con grandi numeri finiti." utilizzando numpy.nan_to_num .
df[:] = np.nan_to_num(df)