概述:本文以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?