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



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

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 可以直接使用它?

你应该能够通过以下方式在熊猫 [1] 中使用实验性.to_coo()方法:

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

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

.stack()返回的Series,即使它不是SparseSeries也只包含非空的元素,因此它不应该比稀疏版本占用更多的内存(至少在类型为np.floatnp.nan)。

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

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

相关内容

  • 没有找到相关文章

最新更新