巨大的稀疏数据帧到scipy稀疏矩阵,无需密集变换



具有超过100万行和30列的数据,其中一列为user_id(超过1500个不同的用户)。我想要一个热编码这个专栏,并在ML算法(xgboost,FFM,scikit)中使用数据。但由于巨大的行数和唯一的用户值矩阵将为约100万X 1500,因此需要以稀疏格式进行此操作(否则数据会杀死所有RAM)。

对我来说,通过熊猫DataFrame处理数据的方便方法,现在它也支持稀疏格式:

df = pd.get_dummies(df, columns=['user_id', 'type'], sparse=True)

工作速度很快,内存大小也很小。但对于scikit算法和xgboost,有必要将数据帧转换为稀疏矩阵。

有没有什么方法可以做到这一点,而不是迭代列并将它们堆叠在一个scipy稀疏矩阵中?我尝试了df.as_matrix()和df.values,但所有第一次将数据转换为密集的内存错误:(

p.S。与获取xgboost 的DMatrix相同

更新:

所以我发布了下一个解决方案(感谢优化建议):

 def sparse_df_to_saprse_matrix (sparse_df):
    index_list = sparse_df.index.values.tolist()
    matrix_columns = []
    sparse_matrix = None
    for column in sparse_df.columns:
        sps_series = sparse_df[column]
        sps_series.index = pd.MultiIndex.from_product([index_list, [column]])
        curr_sps_column, rows, cols = sps_series.to_coo()
        if sparse_matrix != None:
            sparse_matrix = sparse.hstack([sparse_matrix, curr_sps_column])
        else:
            sparse_matrix = curr_sps_column
        matrix_columns.extend(cols)
    return sparse_matrix, index_list, matrix_columns

下面的代码允许获得稀疏数据帧:

one_hot_df = pd.get_dummies(df, columns=['user_id', 'type'], sparse=True)
full_sparse_df = one_hot_df.to_sparse(fill_value=0)

我创建了稀疏矩阵110万行x 1150列。但在创建过程中,它仍然使用了大量的RAM(我的12Gb边缘大约有10Gb)。

不知道为什么,因为生成的稀疏矩阵只使用300 Mb(从HDD加载后)。有什么想法吗?

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

one_hot_df = pd.get_dummies(df, columns=['user_id', 'type'], sparse=True)
one_hot_df, idx_rows, idx_cols = one_hot_df.stack().to_sparse().to_coo()

此方法不采用DataFrame(行/列),而是采用MultiIndex中具有行和列的Series(这就是为什么需要.stack()方法)。这个带有MultiIndexSeries需要是SparseSeries,即使您的输入是SparseDataFrame.stack()也会返回一个常规的Series。因此,在调用.to_coo()之前,需要使用.to_sparse()方法。

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

  1. http://pandas.pydata.org/pandas-docs/stable/sparse.html#interaction-带有scipy稀疏

我几个月前的回答有帮助吗?

Pandas稀疏数据帧到稀疏矩阵,在内存中不生成密集矩阵

它被接受了,但我没有得到任何进一步的反馈。

我熟悉scipysparse格式及其输入,但对pandassparse了解不多。

相关内容

  • 没有找到相关文章

最新更新