python - 在 Python 中从大型数据帧创建稀疏矩阵
问题描述
我试图在回归中使用稀疏矩阵,因为在添加虚拟变量后有超过 40,000 个变量。为了做到这一点,我相信我需要为模型提供一个稀疏矩阵。但是,无法使用此处找到的代码将我的 pandas 数据框转换为矩阵:
这是因为数据集太大,我遇到了内存错误。这是我如何通过运行以下命令来复制问题的示例:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0,40000,size=(1000000, 4)), columns=list('ABCD'))
df = pd.get_dummies(df,columns=['D'],sparse=True,drop_first=True)
df = df.values
我最终希望能够将数据框(49,000 列的 300 万条记录)转换为矩阵,因为我怀疑我可以创建一个稀疏矩阵并将其用于我的回归。这在较小的子集上效果很好,但我最终需要测试整个数据集。上面的示例立即产生“MemoryError”,所以我怀疑这是 Python 的一些限制,但我希望有一个解决方法。
解决方案
你可以这样做:
import numpy as np
import pandas as pd
import scipy.sparse
N = 40000
M = 1000000
df = pd.DataFrame(np.random.randint(0, N, size=(M, 4)), columns=list('ABCD'))
v = df['D'].values
sp = scipy.sparse.coo_matrix((np.ones_like(v), (np.arange(len(v)), v)), shape=[len(v), N])
print(sp.shape)
# (1000000, 40000)
print(sp.getnnz())
# 1000000
推荐阅读
- oracle - 侦听器显示带有域名的服务
- algorithm - 我无法访问此 pine 脚本警报,这是什么问题,第 11 行:输入“行尾没有行继续”时出现语法错误
- javascript - 更改 Material Ui 日期选择器的背景颜色
- javascript - 使用 javascript 在每次点击时重置从下拉菜单生成的图像
- antd - Ant Design - 水平菜单上的右箭头
- iptables - 限制转发流量中特定端口的 IP 连接
- c - MISRA 是否检查数组索引是否超出范围?
- javascript - Select2 - 多选自动完成 - 以编程方式填充字段
- node.js - 通过 pm2 以编程方式 (API) 将参数传递给脚本
- sql - 如何使用条件语句插入 oracle 表?