Python Sci工具包学习SGD Algo时出错-“;数组包含NaN或无穷大“;
我在声明“数组包含NaN或无穷大”时出错。我已经检查了我的数据(包括训练/测试)是否有缺失值,并且没有缺失任何内容 我可能对“数组包含NaN或无穷大”的含义有错误的解释 我认为数据类型可能会抛出algo循环(它们是浮点) 我知道SGD可以处理浮点,所以我不确定这个设置是否需要我声明数据类型 例如以下情况之一:Python Sci工具包学习SGD Algo时出错-“;数组包含NaN或无穷大“;,python,numpy,machine-learning,scikit-learn,nan,Python,Numpy,Machine Learning,Scikit Learn,Nan,我在声明“数组包含NaN或无穷大”时出错。我已经检查了我的数据(包括训练/测试)是否有缺失值,并且没有缺失任何内容 我可能对“数组包含NaN或无穷大”的含义有错误的解释 我认为数据类型可能会抛出algo循环(它们是浮点) 我知道SGD可以处理浮点,所以我不确定这个设置是否需要我声明数据类型 例如以下情况之一: >>> dt = np.dtype('i4') # 32-bit signed integer >>> dt = np.dtype('f8')
>>> 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
np.where(~np.isfinite(dataset))
以下是完整的错误消息:
---------------------------------------------------------------------------
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.
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
19
20如果名称=“\uuuuu main\uuuuuuuu”:
--->21主要内容()
大体上
13#创建和培训SGD
14 sgd=线性_模型.SGDClassifier()
--->15 sgd.fit(列车、目标)
16预测=[x[1]对于新元中的x。预测(测试)]
17
C:\Anaconda\lib\site packages\sklearn\linear\u model\random\u gradient.pyc在fi中
t(自身、X、y、系数、截距、类别权重、样本权重)
518 coef_init=coef_init,intercept_init=intercept_i
尼特,
519级重量=级重量,
-->520样品重量=样品重量)
521
522
C:\Anaconda\lib\site packages\sklearn\linear\u model\randomic\u gradient.pyc in\u f
它(self,X,y,alpha,C,loss,learning\u rate,coef\u init,intercept\u init,class\u w
八,样品(单位重量)
397自身等级重量=等级重量
398
-->399 X=至少2d或csr(X,dtype=np.float64,order=“C”)
400个n_样本,n_特征=X.shape
401
C:\Anaconda\lib\site packages\sklearn\utils\validation.pyc至少位于2D\U或\U csr(X)中
,数据类型,订单,副本)
114 """
115返回\u至少2d\u或\u稀疏(X,数据类型,顺序,复制,稀疏.csr\u矩阵
,
-->116“tocsr”)
117
118
C:\Anaconda\lib\site packages\sklearn\utils\validation.pyc在\u atleast2d\u或\u spar中
se(X,数据类型,顺序,复制,稀疏类,convmethod)
94(X.data)断言(X.data)
95其他:
--->96 X=array2d(X,dtype=dtype,order=order,copy=copy)
97-断言所有有限(X)
98返回X
array2d中的C:\Anaconda\lib\site packages\sklearn\utils\validation.pyc(X,dtype,
订单(复印件)
79'是必需的。请使用X.toarray()转换为DEN
e、 ")
80 X_2d=np.asarray(np
--->81-断言所有有限(X\u 2d)
82如果X是X_2d并复制:
83 X_2d=安全拷贝(X_2d)
C:\Anaconda\lib\site packages\sklearn\utils\validation.pyc in\u assert\u all\u finite
(十)
16如果(np.typecodes['AllFloat']中的X.dtype.char而非np.isfinite(X.s
嗯()
17而不是np.isfinite(X.all()):
--->18 raise VALUERROR(“数组包含NaN或无穷大”)
19
20
ValueError:数组包含NaN或无穷大。
如果您有任何想法,我们将不胜感激。由于错误报告,您的数据中的某个位置存在
np.nan
或np.inf
或-np.inf
。由于您正在读取文本文件,并且您说您的数据不包含缺少的值,这可能是由于列标题或文件中的其他值导致的无法自动解释
genfromtxt
的文档显示,读入数组的默认dtype
为float
,这意味着您读取的所有值都必须通过与float(x)
等效的值
如果不确定这是否是导致错误的原因,可以按如下方式从numpy数组中删除非有限数:
dataset[ ~np.isfinite(dataset) ] = 0 # Set non-finite (nan, inf, -inf) to zero
如果这消除了错误,则可以确保变量中的某个位置存在无效值。要找到可以使用以下内容的位置:
>>> 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
np.where(~np.isfinite(dataset))
这将返回无效值所在的索引列表,例如
>>> 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]))
您是否可以发布错误的完整回溯,并打印dataset.dtype?另外,您有一条评论说您正在“跳过标题行,使用
[1://code>“,但您似乎没有这样做……在我看来,@Dougal对加载标题有一个很好的建议。您可以尝试使用assert not np.any(np.isnan(dataset)| np.isinf(dataset))
测试您的数据集是否正确加载。您是否尝试了numpy.nan_to_num(ndarray)。据我所知,该函数使nans变为零,使无穷大,(如果您知道在零和非常高的数字上应该得到什么结果,那么这很有用,否则就不是真的了)@lmjohns3:ornp.all(np.isfinite(dataset))
,这就是scikit learn在输入验证中所做的有效操作。如果您只有一个零,您会得到这个错误吗?