gpt4 book ai didi

python - get_dummies python内存错误

转载 作者:太空狗 更新时间:2023-10-29 17:25:51 28 4
gpt4 key购买 nike

我在处理包含 400,000 行和 300 个变量的数据集时遇到问题。我必须为包含 3,000 多个不同项目的分类变量获取虚拟变量。最后,我想得到一个包含 3,300 个变量或特征的数据集,以便我可以训练 RandomForest 模型。

这是我尝试做的:

 df = pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1)

当我这样做时,我总是会遇到内存错误。我可以拥有的变量数量是否有限制?

如果我只对前 1,000 行(有 374 个不同的类别)执行此操作,它就可以正常工作。

有人能解决我的问题吗?我使用的计算机有 8 GB 的内存。

最佳答案

更新:从0.19.0版本开始,get_dummies返回一个8位整数而不是64位 float ,这将在很多情况下解决这个问题并做出下面的as_type解决方案不必要。请参阅:get_dummies -- pandas 0.19.0

但在其他情况下,下面描述的 sparse 选项可能仍然有用。

原始答案:这里有几个尝试的可能性。两者都将大大减少数据帧的内存占用,但您以后仍可能遇到内存问题。这很难预测,您只需要尝试一下。

(请注意,我正在简化下面 info() 的输出)

df = pd.DataFrame({ 'itemID': np.random.randint(1,4,100) })

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1).info()

itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64

memory usage: 3.5 KB

这是我们的基准。每个虚拟列占用 800 字节,因为示例数据有 100 行,并且 get_dummies 似乎默认为 float64(8 字节)。这似乎是一种不必要的低效存储虚拟对象的方法,因为您可以尽可能少地使用它,但可能有一些我不知道的原因。

所以,第一次尝试,只需更改为一个字节的整数(这似乎不是 get_dummies 的选项,因此必须通过 astype(np .int8).

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_').astype(np.int8)], 
axis=1).info()

itemID 100 non-null int32
itemID__1 100 non-null int8
itemID__2 100 non-null int8
itemID__3 100 non-null int8

memory usage: 1.5 KB

现在每个虚拟列占用内存的 1/8 和以前一样。

或者,您可以使用 get_dummiessparse 选项。

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_',sparse=True)], 
axis=1).info()

itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64

memory usage: 2.0 KB

相当可观的节省。 info() 输出在某种程度上隐藏了节省发生的方式,但您可以查看内存使用值以了解总节省。

其中哪些在实践中效果更好取决于您的数据,因此您只需要分别尝试一下(或者您甚至可以将它们结合起来)。

关于python - get_dummies python内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31321892/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com