python - scikit - sklearn regression score
Mensaje de error de Scikit NaN o infinito (2)
Los árboles de decisión de scikit-learn emiten su entrada a float32
para mayor eficiencia, pero sus valores no se adaptarán a ese tipo:
>>> np.float32(8.9932064170227995e+41)
inf
La solución es estandarizar antes de ajustar un modelo con sklearn.preprocessing.StandardScaler
. No olvides transform
antes de predecir. Puede usar sklearn.pipeline.Pipeline
para combinar estandarización y clasificación en un solo objeto:
rf = Pipeline([("scale", StandardScaler()),
("rf", RandomForestClassifier(n_estimators=100, n_jobs=-1, verbose=2))])
O bien, con la versión de desarrollo actual / próxima versión:
rf = make_pipeline(StandardScaler(),
RandomForestClassifier(n_estimators=100, n_jobs=-1, verbose=2))
(Admito que el mensaje de error podría mejorarse).
Estoy importando algunos datos de un archivo csv. El archivo tiene valores nan marcados con el texto ''NA''. Importe los datos con:
X = genfromtxt(data, delimiter='','', dtype=float, skip_header=1)
Yo uso este código para reemplazar a nan con una media de columna previamente calculada.
inds = np.where(np.isnan(X))
X[inds]=np.take(col_mean,inds[1])
Luego ejecuto un par de comprobaciones y obtengo matrices vacías:
np.where(np.isnan(X))
np.where(np.isinf(X))
Finalmente ejecuto un clasificador scikit:
RF = ensemble.RandomForestClassifier(n_estimators=100,n_jobs=-1,verbose=2)
RF.fit(X, y)
y recibe el siguiente error:
File "C:/Users/m&g/Anaconda/lib/site-packages/sklearn/ensemble/forest.py", line 257, in fit
check_ccontiguous=True)
File "C:/Users/m&g/Anaconda/lib/site-packages/sklearn/utils/validation.py", line 233, in check_arrays
_assert_all_finite(array)
File "C:/Users/m&g/Anaconda/lib/site-packages/sklearn/utils/validation.py", line 27, in _assert_all_finite
raise ValueError("Array contains NaN or infinity.")
ValueError: Array contains NaN or infinity.
¿Alguna idea de por qué me está diciendo que hay NaN o infinito? Leí esta publicación e intenté ejecutar:
RF.fit(X.astype(float), y.astype(float))
pero obtengo el mismo error.
Me encuentro con este problema también. Pero, por el contrario, mi problema es que hay algunos ''NaN'' en la matriz.
Aquí es cómo solucionarlo.
from sklearn.preprocessing import Imputer
X = Imputer().fit_transform(X)
RF.fit(X, y)
Referencia aquí: sklearn.preprocessing.Imputer