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

时间:2016-05-22 14:13:36

标签: python numpy dataframe scikit-learn

我有一些数据,大约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 个答案:

答案 0 :(得分:2)

您应该能够以下列方式在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_sparse()之前使用.to_coo()方法。

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

一般情况下,您希望为稀疏的scipy数组提供更高效的CSRCCR格式,而不是更简单的COO,因此您可以将其转换为.tocsr()方法。

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