详解pandas编码函数pd.factorize()

概述:本文以kaggle比赛Microsoft Malware Prediction数据为例,如需数据请自行前往:

https://www.kaggle.com/c/microsoft-malware-prediction

所谓编码,自然是将一种符号编成一种数字码-----即数字变量。例如熟知的pd.get_dummies()就是讲一种字符型或者其他类型编程成一串数字向量,也就是所谓的one-hot编码。

本文想讲的另一种编码方式。pd.factorize()。factorize英文意思:分解,分解为因数,因式分解的意思。有没有想到 factorization machine~~

在这里,pd.factorize()做的也是“因式分解”,把常见的字符型变量分解为数字。

1.为什么需要pd.factorize()?哑变量变换(get_dummies)不好吗?

个人理解:当一个feature有10几种甚至几百种取值可能的时候,使用get_summies是一件很恐怖的事情。因为:
例如feature1取值有[“a”,“b”,…“z”]26中可能的话,那么显然用哑变量就会把这一个feature变为26列。显然增加了数据的稀疏性,并且没有意义(视情况而定)。这时候或许就可以用pd.factorize()了。他会把他们分解为0-25种数字。同时1列字符串经过变换后仍是一列。就不会使得数据集看上去很臃肿了。
下面来看个实例吧。

2.kaggle数据实例展示

我们现在有一批微软公司一些设备的数据:
在这里插入图片描述
具体数据什么意思不用在意,我们只需要关注我画红框的两列数据,这是引擎与app的版本号。显然需要编码,不然哪个模型能看得懂这个?
拿EngineVersion为例:
怎么编码呢?来个onehot如何?
在这里插入图片描述
我擦,上面一看这一列有25种取值呢?这就遇到了上面说的情况,onehot编码会把这一列变成25列,实在不是一种好主意。试试pd.factorize?

aaa = pd.factorize(train['EngineVersion'])
aaa

在这里插入图片描述
在这里插入图片描述
可以看到转换后,那些设备号变成了0-24的数字呢~这就对了。同时注意转换后是一个元组:
从上图也能看出来:这个元组包含两个array,分别是我们想要的数字,以及原来的index,那些设备号,所以我们真正使用应该这样用:

aaa = pd.factorize(train['EngineVersion'])
train["EngineVersion"] = aaa[0]

3.factorize真的有这么好用吗?

我想这个答案存在争议,或者说是肯定有应用场合,但目前我觉得它有如下的缺陷:
即它把字符串映射成的数字的规则是先看见的小,后看见的大。意思就是这一列的第一行,必定为0,第二行如果和第一行的取值不同,就为1,否则就是0.以此类推。也就是说它忽略了字符串代表的含义。在我们这里,设备号应该是越大越先进。而它就没有表现出来。所以在这里我认为用map映射编码更好:
即把设备号小的映射为小数字,大的为大数字,依次排序。
当然我这里也没有认真去拍,意思知道就可以了~~

mapdict = {
	'1.1.15100.1':23, 
	'1.1.14600.4':10,
 	'1.1.15200.1':3, 
 	'1.1.15300.6':4,
       '1.1.13504.0':5, '1.1.14800.3':6, '1.1.15000.2':7, '1.1.14104.0':8,
       '1.1.13804.0':8, '1.1.14306.0':8, '1.1.15000.1':8, '1.1.13407.0':8,
       '1.1.14405.2':8, '1.1.14901.4':8, '1.1.14700.3':8, '1.1.14202.0':8,
       '1.1.13303.0':8, '1.1.13701.0':8, '1.1.13000.0':8, '1.1.15300.5':8,
       '1.1.14500.5':8, '1.1.14700.5':8, '1.1.14003.0':8, '1.1.13601.0':8,
       '1.1.13903.0':8
    
}
bbb = train.EngineVersion.map(mapdict)
bbb.head()

在这里插入图片描述
ok~~overover

  • 67
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值