大数据分析与应用实战:统计机器学习之数据导向编程
上QQ阅读APP看书,第一时间看更新

1.3.6 因子

一般而言,属性的衡量尺度分成名目尺度(nominal scale)、顺序尺度(ordinal scale)、区间尺度(interval scale)与比例尺度(ratio scale)。名目尺度数据表示群或类别,仅能进行是否相等的运算,如身份证号码、眼色、邮政编码等。顺序尺度数据顺序有别,大小比较的排序是有意义的,如排名、年级,或者是以高大、中等或矮小来表示高度的衡量值。区间尺度数据可自定义任意零点,零以下还有负值,以加减计算差值或距离有意义,如日期、摄氏度或华氏温度。比例尺度数据有自然零点,或称绝对零点,没有负值,乘除运算产生的比率有意义,如开氏(Kelvin)温度、长度、耗时、次数等。

名目尺度属性又称为类别变量(此后属性、特征、变量与变项会交替使用),顺序尺度又称为有序的类别变量,在R语言中两者都称为因子(factor),是R语言非常重要的一个类别,它决定数据如何被分析与可视化,例如,分类问题建模时因变量必须为因子类别,又可视化时因子变量会按照其频率分布(frequency distribution)产生直方图与圆饼图等。下例中函数factor()将字符串向量中的类别值对应到[1,2,…,k]的整数值向量,其中k为名目变量中独特值的个数,统计术语称为水平数(number of levels),名目变量的各个独特值即为各水平(level)。因此,字符串向量与整数值的因子向量间有一对应关系,默认的对应关系中字符串与整数值分别按照字母顺序与大小升幂排列。以前面五位患者其糖尿病类型的字符串向量diabetes为例,转换为因子向量的做法如下:

对于有序的类别变量,可在factor()函数中设定ordered的参数值为TRUE,形成R语言有序因子(ordered factor)对象。但此处患者康复状况的类别值字母顺序为Excellent, Improved与Poor,所以须用levels参数强制设定两者的对应关系如下(1=Poor,2=Improved,3=Excellent),表达数值越高,复原状况越好。总结来说,因子变量的模式(mode)是数值的,但外表看来像字符串,如此贴心的设计是R语言特有的,Python语言需要自行编码(参见1.4.3节Python语言类别变量编码)。

前述因子的编码方式,是所谓的标签编码(label encoding)。另一种常用的编码方式单热编码(onehot encoding)虚拟编码(dummy encoding)相似,将原本单一的类别变量编码成多个互相独立的二元类别变量(independent binary categories)。此处以套件{vcd}中的关节炎Arthritis数据集为例,使用单热编码套件{onehot}先建立模型对象encoder,其类别值为onehot,再使用predict()泛型函数对Treatment与Sex两字段进行单热编码,最后再与未做单热编码的三个字段整合为数据集arthritisOh。因为Treatment与Sex均为两水平的因子变量,整合后的表格共有7个(3未单热编码+2水平单热编码+2水平单热编码)变量。此处{onehot}套件单热编码过程与R语言机器学习建模过程相同,也是1.6.2节中Python语言模型拟合过程的精简版,请参考该节内容及后面的建模案例。

总结来说,R语言的前身S语言是数据分析语言与统计运算(statistical computing)环境的先驱,大多数的情况下它们会将数据表中的字符串变量自动编码成因子变量,例如,read.csv()函数也可以通过stringsAsFactors参数的设定,自动完成标签编码,方便后续的统计计算。然而Python语言并非如此,许多Python套件并无这种自动转换的功能,数据导入Python后,通常须先进行类别变量编码的动作。想同时使用R语言和Python语言的数据分析工作者请注意这种差异,以免导致无谓的错误。1.4节介绍完Python语言数据对象后,我们会举例说明Python类别变量编码的工作流程。