Estoy usando sklearn y tengo un problema con la propagación de afinidad. He construido una matriz de entrada y sigo recibiendo el siguiente error.
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
he corrido
np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True
Intenté usar
mat[np.isfinite(mat) == True] = 0
para eliminar los valores infinitos, pero esto tampoco funcionó. ¿Qué puedo hacer para deshacerme de los valores infinitos en mi matriz, de modo que pueda usar el algoritmo de propagación por afinidad?
Estoy usando anaconda y python 2.7.9.
python
python-2.7
scikit-learn
valueerror
Ethan Waldie
fuente
fuente
float64
ellos sea finito y nonan
. El mensaje de error es adecuado: es casi seguro que este sea el problema para cualquiera que se encuentre aquí.Respuestas:
Esto puede suceder dentro de scikit y depende de lo que estés haciendo. Recomiendo leer la documentación de las funciones que está utilizando. Es posible que esté utilizando uno que dependa, por ejemplo, de que su matriz sea positiva definida y no cumpla con ese criterio.
EDITAR : ¿Cómo podría perderme eso?
obviamente está mal. Correcto sería:
y
Desea verificar si alguno de los elementos es NaN, y no si el valor de retorno de la
any
función es un número ...fuente
Recibí el mismo mensaje de error al usar sklearn con pandas . Mi solución es restablecer el índice de mi marco de datos
df
antes de ejecutar cualquier código sklearn:Encontré este problema muchas veces cuando eliminé algunas entradas en mi
df
, comofuente
Este es mi función (sobre la base de este ) para limpiar el conjunto de datos de
nan
,Inf
y las células que falta (para conjuntos de datos sesgados):fuente
dropna
luego una segunda vez al soltar inf.Las dimensiones de mi matriz de entrada estaban sesgadas, ya que mi csv de entrada tenía espacios vacíos.
fuente
dropna
pandas.pydata.org/pandas-docs/stable/generated/…Esta es la verificación en la que falla:
Que dice
Así que asegúrese de tener valores que no sean NaN en su entrada. Y todos esos valores son en realidad valores flotantes. Ninguno de los valores debe ser Inf tampoco.
fuente
Con esta versión de python 3:
Mirando los detalles del error, encontré las líneas de códigos que causan la falla:
A partir de esto, pude extraer la forma correcta de probar lo que estaba sucediendo con mis datos utilizando la misma prueba que falla dada por el mensaje de error:
np.isfinite(X)
Luego, con un ciclo rápido y sucio, pude encontrar que mis datos realmente contienen
nans
:Ahora todo lo que tengo que hacer es eliminar los valores en estos índices.
fuente
Tuve el error después de intentar seleccionar un subconjunto de filas:
Resulta que
my_index
contenía valores que no estaban contenidosdf.index
, por lo que la función reindexar insertó algunas filas nuevas y las llenónan
.fuente
En la mayoría de los casos, deshacerse de valores infinitos y nulos resuelve este problema.
deshacerse de los valores infinitos.
deshacerse de los valores nulos de la forma que desee, un valor específico como 999, media, o crear su propia función para imputar los valores faltantes
fuente
Tuve el mismo error, y en mi caso, X e y eran marcos de datos, así que primero tuve que convertirlos en matrices:
Editar: El X.as_matrix sugerido originalmente () es Desaprobados
fuente
Tengo el mismo error. funcionó
df.fillna(-99999, inplace=True)
antes de hacer cualquier reemplazo, sustitución, etc.fuente
nan
valores; deberías encontrarlo.En mi caso, el problema fue que muchas funciones scikit devuelven matrices numpy, que carecen de índice de pandas. Entonces, hubo una falta de coincidencia de índice cuando usé esas matrices numpy para construir nuevos DataFrames y luego intenté mezclarlos con los datos originales.
fuente
Eliminar todos los valores infinitos:
(y reemplace con mínimo o máximo para esa columna)
fuente
tratar
Si la suma de sus datos es infinita (mayor que el valor flotante máximo que es 3.402823e + 38) obtendrá ese error.
vea la función _assert_all_finite en validation.py desde el código fuente de scikit:
fuente