7
respostas

Input contains NaN, infinity or a value too large for dtype('float64'). o que significa?

O que significa o erro abaixo?

from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score

modelo1 = LinearSVC()
modelo1.fit(treino_x, treino_y)
previsoes = modelo1.predict(teste_x)

acuracia = accuracy_score(teste_y, previsoes) * 100
print("A acurácia foi %.2f%%" % acuracia)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-80-a3a46a96767b> in <module>()
      3 
      4 modelo1 = LinearSVC()
----> 5 modelo1.fit(treino_x, treino_y)
      6 previsoes = modelo1.predict(teste_x)
      7 

3 frames
/usr/local/lib/python3.7/dist-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan, msg_dtype)
     58                     msg_err.format
     59                     (type_err,
---> 60                      msg_dtype if msg_dtype is not None else X.dtype)
     61             )
     62     # for object dtype data, we only check for NaNs (GH-13254)

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
7 respostas

Oii Antonio, tudo bem?

Esse erro diz que sua entrada contém alguma informação que não é número(NaN), é infinito ou um valor muito grande que o float não suporta, você pode tentar substituir esses valores por outros, por exemplo 0 ou a média dos valores, depende do que você acha que vai impactar menos sua análise!

Então você pode substituir esses valores NaN pela média que tem no seu dataframe, assim (considerando df como o nome do dataframe):

df.fillna(df.mean())

Ou pode usar o método nan_to_num que substitui os valores NaN por 0 e os infinitos por valores finitos. Nesse caso, df é seu dataframe com os valores NaN/infinitos e df1 é o novo dataframe com esses valores corrigidos.

df1 = np.nan_to_num(df)

Ps: pra esse método não esqueça de importar a biblioteca Numpy, se não tiver importado ainda.

Como eu falei anteriormente, não é a escolha mais inteligente substituir os valores NaN por 0 sem uma análise prévia, esses valores podem afetar muito seu resultado final.

Espero você testar e me trazer um retorno de como ficou, se por acaso não der certo, vamos tentar novamente resolver esse erro e/ou futuros que apareçam :D

Bons estudos ^^

Grato! existe algum código que ele me faça um lista de todos os dados de entrada nessa condição?

Oii de novo, como você está hoje?

Você pode fazer o uso dos seguintes comandos:

np.where(np.isnan(df))

O isnan vai fazer com que todos os NaNs se tornem True e o where vai localizar onde eles estão, e ai depois você pode usar o comando nan_to_num() ou o fillna() que falei anteriormente!

Se precisar de mais alguma coisa é só me chamar, ok?

Bons estudos ^^

Sthefanie, estou trabalhando com um conjunto de dados de 2385 linhas e 7 colunas,


idveiculo    dia    m?s    diadasemana    hora    Velocidade    Longitude    Latitude    Eventos
0    1    13    4    3    0.45399    19    -49.0767    -5.3779    3
1    1    13    4    3    0.45421    37    -49.0769    -5.3792    3
2    1    13    4    3    0.45459    44    -49.0778    -5.3827    3
3    1    13    4    3    0.45539    35    -49.0793    -5.3895    3
4    1    13    4    3    0.45546    40    -49.0793    -5.3899    3

quando pedi para separar os dados de treino e teste, fiz assim:


treino_x = x[:21000]
treino_x.shape
(21000, 7)
[ ]
treino_y = y[:21000]
treino_y.shape
(21000, 1)
[ ]

Pergunto: Fazendo dessa forma mas não sei se os dados foram agrupados de forma aleatória ou se agrupados de acordo com a sequência que aparecem na tabela, os dados são escolhidos de forma aleatória? Se não, como faço para que os grupos de teste e treino possuam dados aleatórios?

xxxxxx

sdsadsf

Oii Antonio, como você está?

Desculpa pela demora, as vezes perguntas dentro de outras perguntas no fórum passam despercebidas, pra que seja mais rápido a resposta recomendo abrir outro tópico :D

Mas vamos lá! No sklearn nós já temos uma função que faz essa divisão de treino e teste, a train_test_split, e você pode fazer dessa forma aqui:

from sklearn.model_selection import train_test_split 
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7)

Nesse caso coloquei o tamanho de treino para 70% dos dados, então o teste será feito com 30%, mas caso queira colocar o valor de teste como parâmetro ali também, pode usar test_size=0.3. Com esse modo, seu conjunto será aleatório e a cada vez que você rode ele vai dar um resultado diferente, o que normalmente fazemos também é definir um valor para o random_state, que é um parâmetro que passamos também para que seu experimento seja replicado outras vezes, até em outra máquina, e esse valor pode ser qualquer inteiro, por exemplo 42.

Caso ainda tenha mais alguma dúvida, pode entrar em contado de novo, ok?

Bons estudos ^^

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software