将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

Posted

技术标签:

【中文标题】将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?【英文标题】:Convert pandas sparse dataframe to sparse numpy matrix for sklearn use? 【发布时间】: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 稀疏矩阵。我已经回答了一些关于此的问题,但手头没有链接。 ***.com/a/34185851/901925 我会考虑改用 scikit 的 OneHotEncoder。生成的稀疏矩阵可以直接与 scikits 预测器一起使用。 Pandas sparse dataFrame to sparse matrix, without generating a dense matrix in memory的可能重复 【参考方案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() 方法对其进行转换。

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

【讨论】:

以上是关于将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将稀疏的 pandas 数据帧转换为 2d numpy 数组

将 CountVectorizer 和 TfidfTransformer 稀疏矩阵转换为单独的 Pandas 数据帧行

以内存有效的方式将大型 csv 读入稀疏的 pandas 数据帧

如何将 numpy.matrix 或数组转换为 scipy 稀疏矩阵

将numpy对象数组转换为稀疏矩阵

如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?