Estou usando o sklearn e estou tendo um problema com a propagação de afinidade. Eu construí uma matriz de entrada e continuo recebendo o seguinte erro.
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
eu corri
np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True
Eu tentei usar
mat[np.isfinite(mat) == True] = 0
para remover os valores infinitos, mas isso também não funcionou. O que posso fazer para me livrar dos valores infinitos na minha matriz, para poder usar o algoritmo de propagação de afinidade?
Estou usando anaconda e python 2.7.9.
python
python-2.7
scikit-learn
valueerror
Ethan Waldie
fonte
fonte
float64
, são finitos e nãonan
. A mensagem de erro está correta - esse é quase certamente o problema para quem se encontra aqui.Respostas:
Isso pode acontecer dentro do scikit e depende do que você está fazendo. Eu recomendo a leitura da documentação para as funções que você está usando. Você pode estar usando um que depende, por exemplo, de sua matriz ser positiva definida e não atender a esse critério.
EDIT : Como eu poderia perder isso:
está obviamente errado. Certo seria:
e
Você deseja verificar se algum elemento é NaN e não se o valor de retorno da
any
função é um número ...fonte
Recebi a mesma mensagem de erro ao usar o sklearn com pandas . Minha solução é redefinir o índice do meu dataframe
df
antes de executar qualquer código do sklearn:Encontrei esse problema várias vezes quando removi algumas entradas no meu
df
, comofonte
Esta é a minha função (com base no presente ) para limpar o conjunto de dados de
nan
,Inf
e células faltando (para conjuntos de dados enviesados):fonte
dropna
uma segunda vez ao soltar inf.As dimensões da minha matriz de entrada estavam inclinadas, pois minha entrada csv tinha espaços vazios.
fonte
dropna
pandas.pydata.org/pandas-docs/stable/generated/…Esta é a verificação em que falha:
O que diz
Portanto, verifique se você possui valores não NaN em sua entrada. E todos esses valores são realmente valores flutuantes. Nenhum dos valores deve ser Inf também.
fonte
Com esta versão do python 3:
Observando os detalhes do erro, encontrei as linhas de códigos que causam a falha:
Com isso, consegui extrair a maneira correta de testar o que estava acontecendo com meus dados usando o mesmo teste que falhou fornecido pela mensagem de erro:
np.isfinite(X)
Depois, com um loop rápido e sujo, pude descobrir que meus dados realmente contêm
nans
:Agora tudo o que tenho a fazer é remover os valores nesses índices.
fonte
Eu tive o erro depois de tentar selecionar um subconjunto de linhas:
Acontece que os
my_index
valores contidos não estavam contidosdf.index
, então a função reindex inseriu algumas novas linhas e as preencheunan
.fonte
Na maioria dos casos, livrar-se de valores infinitos e nulos resolve esse problema.
livrar-se de valores infinitos.
livre-se dos valores nulos da maneira que desejar, valor específico como 999, média ou crie sua própria função para atribuir valores ausentes
fonte
Eu tive o mesmo erro e, no meu caso, X e y eram quadros de dados, então tive que convertê-los em matrizes primeiro:
Editar: o X.as_matrix () originalmente sugerido está obsoleto
fonte
Eu recebi o mesmo erro. trabalhou com
df.fillna(-99999, inplace=True)
antes de fazer qualquer substituição, substituição etcfonte
nan
valores; você deveria encontrá-lo.No meu caso, o problema era que muitas funções do scikit retornam matrizes numpy, que são desprovidas de índice de pandas. Portanto, houve uma incompatibilidade de índice quando usei essas matrizes numpy para criar novos DataFrames e tentei misturá-los com os dados originais.
fonte
Remova todos os valores infinitos:
(e substitua por min ou max para essa coluna)
fonte
experimentar
Se a soma dos seus dados for infinito (maior que o valor máximo de flutuação que é 3,402823e + 38), você receberá esse erro.
veja a função _assert_all_finite em validation.py no código-fonte do scikit:
fonte