Python 什么';在scikit中使用稀疏矩阵的正确方法是什么?
我试图使用稀疏矩阵来完成分类任务。当我将训练集传递给scikit中的逻辑回归函数时,它返回以下错误:Python 什么';在scikit中使用稀疏矩阵的正确方法是什么?,python,scikit-learn,sparse-matrix,logistic-regression,Python,Scikit Learn,Sparse Matrix,Logistic Regression,我试图使用稀疏矩阵来完成分类任务。当我将训练集传递给scikit中的逻辑回归函数时,它返回以下错误: ValueError: Array contains NaN or infinity. 我作为参数传递给逻辑回归的矩阵类型是scipy.sparse.csr.csr\u矩阵 这就是我如何从带有NAN的numpy数组创建稀疏矩阵的方法: X=sparse.csr_matrix(X_hat) 我做错了什么?我在train\u test\u split中得到了相同的错误,根据文档,这些函数应该接受
ValueError: Array contains NaN or infinity.
我作为参数传递给逻辑回归的矩阵类型是scipy.sparse.csr.csr\u矩阵
这就是我如何从带有NAN的numpy数组创建稀疏矩阵的方法:
X=sparse.csr_matrix(X_hat)
我做错了什么?我在train\u test\u split
中得到了相同的错误,根据文档,这些函数应该接受稀疏矩阵作为参数
我使用的是scikit learn的0.14版
更新:
这是完整的回溯
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-65-acdaac419166> in <module>()
1
----> 2 model2.fit(X_train, y_train)
C:\Anaconda\lib\site-packages\sklearn\svm\base.pyc in fit(self, X, y)
666 " one.")
667
--> 668 X = atleast2d_or_csr(X, dtype=np.float64, order="C")
669
670 self.class_weight_ = compute_class_weight(self.class_weight,
C:\Anaconda\lib\site-packages\sklearn\utils\validation.pyc in atleast2d_or_csr(X, dtype, order, copy, force_all_finite)
132 """
133 return _atleast2d_or_sparse(X, dtype, order, copy, sparse.csr_matrix,
--> 134 "tocsr", force_all_finite)
135
136
C:\Anaconda\lib\site-packages\sklearn\utils\validation.pyc in _atleast2d_or_sparse(X, dtype, order, copy, sparse_class, convmethod, force_all_finite)
105 X = sparse_class(X, dtype=dtype)
106 if force_all_finite:
--> 107 _assert_all_finite(X.data)
108 X.data = np.array(X.data, copy=False, order=order)
109 else:
C:\Anaconda\lib\site-packages\sklearn\utils\validation.pyc in _assert_all_finite(X)
25 if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum())
26 and not np.isfinite(X).all()):
---> 27 raise ValueError("Array contains NaN or infinity.")
28
29
ValueError: Array contains NaN or infinity.
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1.
---->2型号2.装配(X_系列、y_系列)
C:\Anaconda\lib\site packages\sklearn\svm\base.pyc in fit(self,X,y)
666“一”
667
-->668 X=至少2d\u或\u csr(X,dtype=np.float64,order=“C”)
669
670自重=计算自重(自重,
C:\Anaconda\lib\site packages\sklearn\utils\validation.pyc至少在2d\u或\u csr中(X、dtype、order、copy、force\u all\u finite)
132 """
133返回_至少2d_或_稀疏(X,dtype,order,copy,sparse.csr_矩阵,
-->134“tocsr”,力(所有有限)
135
136
C:\Anaconda\lib\site packages\sklearn\utils\validation.pyc在_-atleast2d\u或_-sparse中(X,dtype,order,copy,sparse\u类,convmethod,force\u all\u-finite)
105 X=稀疏类(X,dtype=dtype)
106如果力是有限的:
-->107(X.data)断言(X.data)
108 X.data=np.array(X.data,copy=False,order=order)
109其他:
C:\Anaconda\lib\site packages\sklearn\utils\validation.pyc in\u assert\u all\u finite(X)
25如果(np.typecode['AllFloat']中的X.dtype.char而不是np.isfinite(X.sum())
26而不是np.isfinite(X.all()):
--->27 raise VALUERROR(“数组包含NaN或无穷大”)
28
29
ValueError:数组包含NaN或无穷大。
诀窍是不要使用nan
s作为数据或占位符…你可以看到X_hat=numpy.nan_to_num(X_hat)
是否适用于你的目的。如果不适用,你将不得不进行积极的工作,以适当的其他方式替换nan。我不明白的是为什么逻辑回归(以及PCA和其他功能)如果在文档中指定了稀疏矩阵,则不适用于稀疏矩阵。不适用于稀疏矩阵是因为您的数据包含nan
s,而不是因为矩阵稀疏,请参见ValueError
消息。确切地说,将其替换为您的真实数值(反映良好:))选择。稀疏矩阵只是一个大多数值为0的矩阵,并且只有非零值存储在内存中。对于NaN:scikit学习中的任何算法(除了用于删除缺失值的插补器)都不能以有意义的方式处理NaN。这就是它们产生错误的原因。