【问题标题】:Train `sklearn` ML model with scipy sparse matrix and numpy array使用 scipy 稀疏矩阵和 numpy 数组训练 sklearn ML 模型
【发布时间】:2019-12-13 05:04:24
【问题描述】:

为了进一步解释我的用例,A 是一个带有 tf-idf 值的稀疏矩阵,B 是一个包含我数据的一些附加特征的数组。

我已经拆分为训练集和测试集,所以在我的示例中,AB 仅与训练集有关。我(想)在这段代码之后对测试集做同样的事情。

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

所以我尝试这样做:

C = np.concatenate((A, B.T), axis=1)

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

但是,当我尝试这样做时,我收到以下错误:

ValueError: zero-dimensional arrays cannot be concatenated

另外,我认为`np.concatenate` a numpy array with a sparse matrix 的想法对我来说不是很好,因为

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

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

【问题讨论】:

  • 你希望结果是一个数组吗?您可以使用A.A 将稀疏矩阵转换为数组
  • @user3483203,嗯,我明白你的意思了。我的稀疏矩阵太大,无法将其转换为数组。理想情况下,我希望输出一个“混合”数组,其中一部分是稀疏矩阵,另一部分是数组。
  • numpy 不可能做到这一点。您的最终用例是什么?
  • @user3483203,基本上稀疏矩阵是 tf-idf 数据,数组是一些附加特征。我想要一个最终的串联数组,以便我可以将它传递给 ML 模型(例如随机森林)并对其进行训练等。我认为您不能在 sklearn?

标签: python numpy scikit-learn scipy concatenation


【解决方案1】:
  1. 您可以使用来自 scipy 的 hstackhstack 会将两个矩阵都转换为 scipy coo_matrix,合并它们并默认返回一个 coo_matrix。

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

进一步,如果您打算使用 sklearn 中的逻辑回归,稀疏矩阵必须采用 csr 格式,fit 方法才能工作。

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

from scipy.sparse import hstack

X = hstack((A, B), format='csr')

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 2013-09-24
    • 2012-12-20
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2014-10-15
    • 2016-08-26
    • 2018-02-17
    相关资源
    最近更新 更多