使用 scipy 稀疏矩阵和 numpy 数组训练“sklearn”ML 模型

Poe*_*dit 3 python numpy concatenation scipy scikit-learn

只是为了更多地解释有关我的用例的一些事情,A它是一个具有 tf-idf 值的稀疏矩阵,并且B是一个具有我的数据的一些附加功能的数组。

我已经分为训练集和测试集,因此AB我的示例中仅涉及训练集。我(想)在这段代码之后对测试集执行相同的操作。

我想连接这些矩阵/数组,因为我想将它们传递给sklearnML 模型来训练它,但我不认为我可以单独传递它们。

所以我尝试这样做:

C = np.concatenate((A, B.T), axis=1)
Run Code Online (Sandbox Code Playgroud)

其中 A 是 a <class 'scipy.sparse.csr.csr_matrix'>,B 是 a <class 'numpy.ndarray'>

但是,当我尝试执行此操作时,出现以下错误:

ValueError: zero-dimensional arrays cannot be concatenated
Run Code Online (Sandbox Code Playgroud)

另外,我认为“np.concatenate”带有稀疏矩阵的 numpy 数组的想法在我的情况下不是很好,因为

  1. 将稀疏数组转换A为密集数组基本上是不可能的,因为它太大了
  2. 如果我将全密集数组转换为稀疏数组,我将丢失(或实际上不是?)信息B

sklearn将由行连接的稀疏数组和全稠密数组传递给 ML 模型的最佳方法是什么?

Moh*_*san 6

  1. 您可以使用hstackscipy. hstack将两个矩阵转换为 scipy coo_matrix,合并它们并默认返回一个 coo_matrix 。

  2. 将密集数组转换为稀疏数组时不会丢失任何信息。稀疏矩阵只是紧凑的数据存储格式。另外,除非为参数指定一个值,dtype否则hstack所有内容都是向上转型的。因此,也不存在数据丢失的可能性。

此外,如果您计划使用 sklearn 中的逻辑回归,稀疏矩阵必须采用csr格式才能使fit方法发挥作用。

以下代码应该适用于您的用例

from scipy.sparse import hstack

X = hstack((A, B), format='csr')
Run Code Online (Sandbox Code Playgroud)