【问题标题】:Convert pandas sparse dataframe to sparse numpy matrix for sklearn use?将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?
【发布时间】:2016-09-19 09:59:37
【问题描述】:

我有一些数据,大约 4 亿行,一些特征是分类的。我应用pandas.get_dummies 进行one-hot 编码,我必须使用sparse=Trueoption,因为数据有点大(否则会引发异常/错误)。

result = result.drop(["time", "Ds"], 1)
result_encoded = pd.get_dummies(result, columns=["id1", "id2", "id3", "id4"], sparse=True)

然后,我得到一个包含 9000 个特征的稀疏数据帧(result_encoded)。之后,我想对数据进行岭回归。起初,我尝试将dataframe.value 输入sklearn,

train_data = result_encoded.drop(['count'].values)

但引发了错误:“数组太大”。 然后,我只是将稀疏数据帧输入 sklearn,再次显示类似的错误消息。

train_data = result_encoded.drop(['count'])

我是否需要考虑不同的方法或数据准备,以便 sklearn 可以直接使用?

【问题讨论】:

  • (转贴旧评论)您可以编写一段简短、可运行的代码,而不是用文字描述您的数据。如果您这样做是为了让人们可以复制、粘贴和运行您的问题中的代码,而不会出现未定义的变量和其他问题,那么 a) 您将使您想要的输出非常清晰 b) 您更有可能得到好的答案。 Here's an example.
  • 查看pandas 文档以了解稀疏帧。我相信有一种方法,可能是实验性的,可以产生一个 scipy 稀疏矩阵。我已经回答了一些关于此的问题,但手头没有链接。
  • 我会考虑改用 scikit 的 OneHotEncoder。生成的稀疏矩阵可以直接与 scikits 预测器一起使用。

标签: python numpy dataframe scikit-learn


【解决方案1】:

您应该可以通过以下方式在 pandas [1] 中使用实验性的.to_coo() 方法:

result_encoded, idx_rows, idx_cols = result_encoded.stack().to_sparse().to_coo()
result_encoded = result_encoded.tocsr()

此方法不是采用DataFrame(行/列),而是采用SeriesMultiIndex 中的行和列(这就是您需要.stack() 方法的原因)。这个SeriesMultiIndex 必须是SparseSeries,即使你的输入是SparseDataFrame.stack() 也会返回一个常规的Series。所以,你需要在调用.to_coo()之前使用.to_sparse()方法。

.stack()返回的Series,即使不是SparseSeries也只包含不为null的元素,所以它不应该比稀疏版本占用更多的内存(至少在np.nan的时候类型是np.float)。

一般来说,您需要更高效的CSRCCR 格式为您的稀疏scipy 数组,而不是更简单的COO,因此您可以使用.tocsr() 方法对其进行转换。

  1. http://pandas.pydata.org/pandas-docs/stable/sparse.html#interaction-with-scipy-sparse

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 2013-12-25
    • 2016-08-03
    • 2020-04-07
    • 2023-04-10
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多