2013-09-03 9 views
8

Otrzymuję komunikat o błędzie "Tablica zawiera NaN lub nieskończoność". Sprawdziłem, czy moje dane nie zostały pominięte, zarówno pociągu, jak i testu na brakujące wartości.Błąd z Sci-Kit Dowiedz się SGD Algo - "Tablica zawiera NaN lub nieskończoność"

Możliwe, że mam błędną interpretację tego, co oznacza "tablica zawiera NaN lub nieskończoność".

import numpy as np 
from sklearn import linear_model 
from numpy import genfromtxt, savetxt 

def main(): 
    #create the training & test sets, skipping the header row with [1:] 
    dataset = genfromtxt(open('C:\\Users\\Owner\\training.csv','r'), delimiter=',')[0:50]  
    target = [x[0] for x in dataset] 
    train = [x[1:50] for x in dataset] 
    test = genfromtxt(open('C:\\Users\\Owner\\test.csv','r'), delimiter=',')[0:50] 

    #create and train the SGD 
    sgd = linear_model.SGDClassifier() 
    sgd.fit(train, target) 
    predictions = [x[1] for x in sgd.predict(test)] 

    savetxt('C:\\Users\\Owner\\Desktop\\preds.csv', predictions, delimiter=',', fmt='%f') 

if __name__=="__main__": 
    main() 

Myślałem, że typ danych może wyrzucać algo dla pętli (są to zmiennoprzecinkowe).

Wiem, że SGD może obsługiwać zmiennoprzecinkowe, więc nie jestem pewien, czy to ustawienie wymaga ode mnie zadeklarowania typu danych.

Takie jak jedną z następujących czynności:

>>> dt = np.dtype('i4') # 32-bit signed integer 
>>> dt = np.dtype('f8') # 64-bit floating-point number 
>>> dt = np.dtype('c16') # 128-bit complex floating-point number 
>>> dt = np.dtype('a25') # 25-character string 

Poniżej znajduje się pełny komunikat błędu:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-62-af5537e7802b> in <module>() 
    19 
    20 if __name__=="__main__": 
---> 21  main() 

<ipython-input-62-af5537e7802b> in main() 
    13  #create and train the SGD 
    14  sgd = linear_model.SGDClassifier() 
---> 15  sgd.fit(train, target) 
    16  predictions = [x[1] for x in sgd.predict(test)] 
    17 

C:\Anaconda\lib\site-packages\sklearn\linear_model\stochastic_gradient.pyc in fi 
t(self, X, y, coef_init, intercept_init, class_weight, sample_weight) 
    518       coef_init=coef_init, intercept_init=intercept_i 
nit, 
    519       class_weight=class_weight, 
--> 520       sample_weight=sample_weight) 
    521 
    522 

C:\Anaconda\lib\site-packages\sklearn\linear_model\stochastic_gradient.pyc in _f 
it(self, X, y, alpha, C, loss, learning_rate, coef_init, intercept_init, class_w 
eight, sample_weight) 
    397    self.class_weight = class_weight 
    398 
--> 399   X = atleast2d_or_csr(X, dtype=np.float64, order="C") 
    400   n_samples, n_features = X.shape 
    401 

C:\Anaconda\lib\site-packages\sklearn\utils\validation.pyc in atleast2d_or_csr(X 
, dtype, order, copy) 
    114  """ 
    115  return _atleast2d_or_sparse(X, dtype, order, copy, sparse.csr_matrix 
, 
--> 116         "tocsr") 
    117 
    118 

C:\Anaconda\lib\site-packages\sklearn\utils\validation.pyc in _atleast2d_or_spar 
se(X, dtype, order, copy, sparse_class, convmethod) 
    94   _assert_all_finite(X.data) 
    95  else: 
---> 96   X = array2d(X, dtype=dtype, order=order, copy=copy) 
    97   _assert_all_finite(X) 
    98  return X 

C:\Anaconda\lib\site-packages\sklearn\utils\validation.pyc in array2d(X, dtype, 
order, copy) 
    79       'is required. Use X.toarray() to convert to dens 
e.') 
    80  X_2d = np.asarray(np.atleast_2d(X), dtype=dtype, order=order) 
---> 81  _assert_all_finite(X_2d) 
    82  if X is X_2d and copy: 
    83   X_2d = safe_copy(X_2d) 

C:\Anaconda\lib\site-packages\sklearn\utils\validation.pyc in _assert_all_finite 
(X) 
    16  if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.s 
um()) 
    17    and not np.isfinite(X).all()): 
---> 18   raise ValueError("Array contains NaN or infinity.") 
    19 
    20 

ValueError: Array contains NaN or infinity. 

Wszelkie myśli będą mile widziane.

+5

Czy możesz zamieścić pełny komunikat o błędzie i "wydrukować dataset.dtype"? Masz również komentarz mówiący, że "pomijasz wiersz nagłówka z' [1:] '", ale nie wydajesz się tego robić .... – Dougal

+1

Wygląda mi na to, że @Dougal ma dobrą sugestię o ładowaniu nagłówka. Możesz spróbować sprawdzić, czy twój zestaw danych został poprawnie załadowany za pomocą 'assert not np.any (np.isnan (dataset) | np.isinf (dataset))'. – lmjohns3

+0

czy wypróbowałeś numpy.nan_to_num (ndarray), ta funkcja powoduje, że nans ma wartość zero, a nieskończoność dużych liczb, o ile wiem, (przydatne, jeśli wiesz, jaki wynik powinieneś uzyskać na zero i bardzo wysokich liczbach, inaczej nie bardzo) – usethedeathstar

Odpowiedz

0

W raportach o błędach masz gdzieś w swoich danych np.nan lub np.inf lub -np.inf. Ponieważ czytasz z pliku tekstowego i mówisz, że twoje dane nie zawierają brakujących wartości, jest to prawdopodobnie spowodowane przez nagłówki kolumn lub jakąś inną wartość w pliku, której nie można automatycznie zinterpretować.

Dokumentacja genfromtxt pokazuje, że domyślna dtype dla tablic odczytu w to float, co oznacza, że ​​wszystkie wartości, które czytają musi przejść równowartość float(x).

Jeśli nie jesteś pewien, czy to jest przyczyną błędu można usunąć numery nie skończone z numpy tablicy następująco:

dataset[ ~np.isfinite(dataset) ] = 0 # Set non-finite (nan, inf, -inf) to zero 

Jeśli to eliminuje błąd, możesz być pewny, że masz nieprawidłowe wartości w twojej zmiennej, gdzieś. Aby znaleźć gdzie można użyć następujących:

np.where(~np.isfinite(dataset)) 

ta zwróci listę indeksów, gdzie nieprawidłowe wartości są np

>>> import numpy as np 

>>> dataset = np.array([[0,1,1],[np.nan,0,0],[1,2,np.inf]]) 
>>> dataset 
array([[ 0., 1., 1.], 
     [ nan, 0., 0.], 
     [ 1., 2., inf]]) 

>>> np.where(~np.isfinite(dataset)) 
(array([1, 2]), array([0, 2]))