get_dummies python内存错误

我对一个有400000行和300个变量的数据集有问题。我必须为一个包含3000多个不同项的分类变量获取虚拟变量。最后,我希望得到一个包含3300个变量或特征的数据集,这样我就可以训练一个随机森林模型

以下是我试图做的:

df=pd.concat([df,pd.get_dummies(df['itemID',前缀='itemID')],axis=1)

当我这样做的时候,我总是会得到一个内存错误。我可以拥有的变量数量有限制吗

如果我只对前1000行(共有374个不同的类别)这样做,效果就很好了

有人能解决我的问题吗?我用的电脑有8GB的内存

更新:从0.19.0版开始,get_dummies返回8位整数而不是64位浮点,这将在许多情况下修复此问题,并使下面的as_type解决方案变得不必要。参见:get_dummies——熊猫0.19.0

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

原始答案:这里有几种可能性可以尝试。这两种方法都将大大减少数据帧的内存占用,但以后仍可能遇到内存问题。这很难预测,你只能试试

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

df=pd.DataFrame({‘itemID’:np.random.randint(1,4100)})
pd.concat([df,pd.get_dummies(df[‘itemID’],前缀=’itemID’],axis=1.info())
itemID 100非空int32
itemID__1100非空浮点64
itemID__2100非空浮点64
itemID__3100非空浮点64
内存使用:3.5 KB

这是我们的底线。每个虚拟列占用800字节,因为示例数据有100行,并且get_dummies似乎默认为float64(8字节)。这似乎是一种不必要的低效方式来储存假人,因为你可以用一点来做,但可能有一些原因,我不知道

因此,第一次尝试,只需更改为一字节整数(这似乎不是get\u dummies的选项,因此必须使用astype(np.int8)进行转换

pd.concat([df,pd.get_dummies(df['itemID',前缀='itemID').astype(np.int8)],
axis=1.info()
itemID 100非空int32
itemID__1100非空int8
itemID__2100非空int8
itemID__3100非空int8
内存使用:1.5 KB

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

或者,您可以使用get\u dummiessparse选项

pd.concat([df,pd.get_dummies(df['itemID',prefix='itemID',sparse=True)],
axis=1.info()
itemID 100非空int32
itemID__1100非空浮点64
itemID__2100非空浮点64
itemID__3100非空浮点64
内存使用:2.0 KB

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

其中哪一个在实践中效果更好取决于您的数据,所以您只需要尝试一下(或者您甚至可以将它们组合起来)

发表评论