“这是我参与更文挑战的第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的内容见下表,其中“性别”列中为“男”和“女”两个文本类型的数据。
接着用get_dummies()函数对文本类型的数据进行处理,代码如下。get_dummies()函数的第1个参数为表格名称,第2个参数为需要处理的列的名称。
df = pd.get_dummies(df,columns=['性别'])
获得的新df的内容见下表。可以看到,原来的“性别”列变为“性别_女”和“性别_男”两列,这两列中的数字1表示符合列名,数字0表示不符合列名。例如,第2行的客户为女性,所以在“性别_女”列中的数字是1,在“性别_男”列中的数字是0。
虽然现在已经将文本类型的数据转换成了数字,但是“性别_女”和“性别_男”这两列存在多重共线性,即知道其中一列的内容,就能知道另一列的内容,用公式来表达就是:性别_男=1-性别_女。
多重共线性会带来一系列问题,用drop()函数删去其中一列,代码如下。
df =df.drop(columns='性别_女')
再用rename()函数更改列名,代码如下:
df = df.rename(columns={'性别_男':'性别'})
此时df的内容见下表,至此便完成了非数值类型数据的哑变量处理。
2 稍复杂的示例:房屋朝向的数值转换
import pandas as pd
df = pd.DataFrame({'房屋编号':[1,2,3,4,5],'朝向':['东','南','西','北']})
获得的df的内容见下表。
用get_dummies()函数构造哑变量,代码如下。
df = pd.get_dummies(df,columns=['朝向'])
结果见下表。
同样存在多重共线性,因此需要从新构造出来的4个哑变量中删去1个,假设删去“朝向_西”列,代码如下。
df = df.drop(columns='朝向_西')
此时df的内容见下表。
这样便通过哑变量处理将分类变量转化为数值变量,为后续构建模型打好了基础。构造哑变量容易产生高维数据,因此,哑变量常和下一章会讲到的PCA(主成分分析)一起使用,即构造哑变量产生高维数据后采用PCA进行降维。