【发布时间】:2016-02-01 03:45:00
【问题描述】:
拥有超过 100 万行和 30 列的数据,其中一列是 user_id(超过 1500 个不同的用户)。 我想要对该专栏进行一次热编码并在 ML 算法(xgboost、FFM、scikit)中使用数据。但由于行数庞大且唯一用户值矩阵约为 100 万 X 1500,因此需要以稀疏格式执行此操作(否则数据会杀死所有 RAM)。
对我来说,通过 pandas DataFrame 处理数据很方便,现在它也支持稀疏格式:
df = pd.get_dummies(df, columns=['user_id', 'type'], sparse=True)
工作速度非常快,并且在 RAM 中的大小很小。但是为了使用 scikit 算法和 xgboost,有必要将数据帧转换为稀疏矩阵。
有没有办法做到这一点,而不是遍历列并将它们堆叠在一个 scipy 稀疏矩阵中? 我尝试了 df.as_matrix() 和 df.values,但首先将所有数据转换为密集的 MemoryError :(
附: 与为 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 加载后)。有什么想法吗?
【问题讨论】:
标签: pandas machine-learning scipy scikit-learn data-analysis