特征工程之数据预处理 | 更文挑战

214 阅读3分钟

“这是我参与更文挑战的第30天,活动详情查看: 更文挑战

非数值类型数据处理

机器学习建模时处理的都是数值类型的数据,然而实际工作中获取的数据往往会包含非数值类型的数据,其中最常见的就是文本类型的数据,例如,性别中的“男”和“女”,处理时可以用查找、替换的思路,分别转换为数字1和0。但如果类别有很多,又该如何处理呢?

1 Get_dummies哑变量处理

哑变量也叫虚拟变量,通常取值为0或1,上面提到的将性别中的“男”和“女”分别转换成数字1和0就是哑变量最经典的应用。

在Python中,通常利用pandas库中的get_dummies()函数进行哑变量处理,它不仅可以处理“男”和“女”这种只有两个分类的简单问题,还可以处理含有多个分类的问题。下面通过两个示例演示get_dummies()函数的基本用法。

简单的示例:“男”和“女”的数值转换

import pandas as pd
df = pd.DataFrame({'客户编号':[1,2,3],'性别':['男','女','男']})

获得的df的内容见下表,其中“性别”列中为“男”和“女”两个文本类型的数据。

image.png

接着用get_dummies()函数对文本类型的数据进行处理,代码如下。get_dummies()函数的第1个参数为表格名称,第2个参数为需要处理的列的名称。

df = pd.get_dummies(df,columns=['性别'])

获得的新df的内容见下表。可以看到,原来的“性别”列变为“性别_女”和“性别_男”两列,这两列中的数字1表示符合列名,数字0表示不符合列名。例如,第2行的客户为女性,所以在“性别_女”列中的数字是1,在“性别_男”列中的数字是0。

image.png

虽然现在已经将文本类型的数据转换成了数字,但是“性别_女”和“性别_男”这两列存在多重共线性,即知道其中一列的内容,就能知道另一列的内容,用公式来表达就是:性别_男=1-性别_女。

多重共线性会带来一系列问题,用drop()函数删去其中一列,代码如下。

df =df.drop(columns='性别_女')

再用rename()函数更改列名,代码如下:

df = df.rename(columns={'性别_男':'性别'})

此时df的内容见下表,至此便完成了非数值类型数据的哑变量处理。

image.png

2 稍复杂的示例:房屋朝向的数值转换

import pandas as pd
df = pd.DataFrame({'房屋编号':[1,2,3,4,5],'朝向':['东','南','西','北']})

获得的df的内容见下表。 image.png

用get_dummies()函数构造哑变量,代码如下。

df = pd.get_dummies(df,columns=['朝向'])

结果见下表。

image.png

同样存在多重共线性,因此需要从新构造出来的4个哑变量中删去1个,假设删去“朝向_西”列,代码如下。

df = df.drop(columns='朝向_西')

此时df的内容见下表。

image.png

这样便通过哑变量处理将分类变量转化为数值变量,为后续构建模型打好了基础。构造哑变量容易产生高维数据,因此,哑变量常和下一章会讲到的PCA(主成分分析)一起使用,即构造哑变量产生高维数据后采用PCA进行降维。