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.

È stato utile?

Soluzione

Con np.isnan(X) si ottiene un back maschera booleana con vero per le posizioni che contengono NaNs.

Con np.where(np.isnan(X)) si ottiene indietro una tupla con i, j coordinate di NaNs.

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)

di Fernando risposta .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top