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