将 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=True
option,因为数据有点大(否则会引发异常/错误)。
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
(行/列),而是采用Series
,MultiIndex
中的行和列(这就是您需要.stack()
方法的原因)。这个Series
和MultiIndex
必须是SparseSeries
,即使你的输入是SparseDataFrame
,.stack()
也会返回一个常规的Series
。所以,你需要在调用.to_coo()
之前使用.to_sparse()
方法。
.stack()
返回的Series
,即使不是SparseSeries
也只包含不为null的元素,所以它不应该比稀疏版本占用更多的内存(至少在np.nan
的时候类型是np.float
)。
一般来说,您需要更高效的CSR
或CCR
格式为您的稀疏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 数据帧