2013-09-03 19 views
8

Tôi nhận được thông báo lỗi "Mảng chứa NaN hoặc vô hạn". Tôi đã kiểm tra dữ liệu của tôi cả đào tạo/kiểm tra cho các giá trị bị thiếu và không có gì thiếu.Lỗi với Sci-Kit Tìm hiểu SGD Algo - "Mảng chứa NaN hoặc vô cùng"

Có thể tôi hiểu sai về "Mảng chứa NaN hoặc vô hạn" có nghĩa là gì.

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() 

Tôi nghĩ rằng kiểu dữ liệu có thể đang ném bản ngã cho vòng lặp (chúng là dấu phẩy động).

Tôi biết rằng SGD có thể xử lý dấu phẩy động vì vậy tôi không chắc liệu thiết lập này có yêu cầu tôi khai báo kiểu dữ liệu hay không.

Chẳng hạn như một trong các cách sau:

>>> 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 

Dưới đây là toàn lỗi thông điệp:

--------------------------------------------------------------------------- 
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. 

Bất kỳ suy nghĩ sẽ được đánh giá.

+5

Bạn có thể đăng toàn bộ dấu vết của lỗi và 'print dataset.dtype' không? Ngoài ra, bạn có một bình luận nói rằng bạn đang "bỏ qua hàng tiêu đề với' [1:] '", nhưng bạn dường như không làm như vậy .... – Dougal

+1

Trông với tôi như @Dougal có một gợi ý tốt về tải tiêu đề. Bạn có thể thử kiểm tra xem liệu tập dữ liệu của bạn có được tải đúng với 'assert không np.any (np.isnan (dataset) | np.isinf (dataset))' hay không. – lmjohns3

+0

Bạn đã thử numpy.nan_to_num (ndarray) hàm này làm cho số không và số vô cùng lớn đến mức tôi biết, (hữu ích nếu bạn biết kết quả bạn sẽ nhận được trên số không và rất cao, nếu không thì không thực sự) – usethedeathstar

Trả lời

0

Khi báo cáo lỗi, bạn có np.nan hoặc np.inf hoặc -np.inf ở đâu đó trong dữ liệu của mình. Vì bạn đang đọc từ tệp văn bản và bạn cho biết dữ liệu của bạn không chứa giá trị bị thiếu, điều này có thể do tiêu đề cột hoặc một số giá trị khác trong tệp không thể được diễn giải tự động.

Các tài liệu cho genfromtxt cho thấy mặc định dtype cho mảng đọc-in là float, có nghĩa là tất cả các giá trị mà bạn đọc phải vượt qua tương đương với float(x).

Nếu bạn không chắc chắn nếu điều này gây ra lỗi bạn có thể xóa số phi hữu hạn từ một mảng NumPy như sau:

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

Nếu đó loại bỏ các lỗi, bạn có thể chắc chắn rằng bạn có giá trị không hợp lệ trong biến của bạn, ở đâu đó. Để tìm nơi bạn có thể sử dụng như sau:

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

này sẽ trả về một danh sách các chỉ số mà các giá trị hợp lệ là, ví dụ

>>> 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])) 
Các vấn đề liên quan