我对一个有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 dummies的sparse选项
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()输出在某种程度上隐藏了节省的方式,但您可以查看内存使用量的值来查看总节省量
其中哪一个在实践中效果更好取决于您的数据,所以您只需要尝试一下(或者您甚至可以将它们组合起来)