这里,我想总结一下在The Analytics Edge课程作业里面的两种特殊线性回归的问题:类别属性的处理以及时间序列数据。

处理无序的类别属性(unordered factors)

回忆已经学到过的可以直接处理无序的类别属性的模型,大概只有决策树了。其实在博文matrix factorization里面已经讲过,针对推荐系统的问题,我们的输入是第几号观众,也是一个类别属性。当时的解决思路就是:binary vector encoding。

类似的,在这里,为了能让线性模型能处理类别数据,我们定义一个类别为"reference level", 针对剩下的每一个类别给数据加一个属性。这样的话有$n$个类别的属性就被$n-1$个新的level属性所提替代。这个"reference level"一般选择个数最多的那个类别,这样该类别的新属性值全部为0。那些其它的类别的属性值只有在自己的类别属性上的时候才为1,其余均为0。这样一来,类别属性的问题就解决了。

举例来说,假设某个属性颜色有“红”,“黄”,“蓝”三种类别。如果“红色”最多,那么我们就把红色看成reference, 然后针对剩下的两种类别,将颜色属性换成“黄色”,“蓝色”两个属性。这样属性就变成了:

类别/属性 黄色 蓝色
0 0
1 0
0 1

由于R语言里面默认按字母序选择reference level,所以我们要重新设置:

#change reference level
pisaTrain$raceeth = relevel(pisaTrain$raceeth, "White")

当处理数据的时候,R自动识别出类别属性,然后添加新的属性进行处理。

处理时间序列数据

有的时候,我们会用到这样的数据:观察的数据都是按照时间顺序连续记录下来的,这种数据称之为时间序列。它与一般的数据有什么不同呢?一般的数据都是1号记录,2号记录这样“无序地”组合,但是时间序列得数据有着时间前后的关系,这是一个非常重要的信息,在我们进行线性回归的时候很重要。与一般的数据不同的是,我们在进行回归分析的时候可以使用以前的数据来预测现在的数据。

具体来说,比如我们有数据$X$是一个时间序列,其中有一个属性$x$。假设现在要预测时刻$t$的$x$的属性值,一般的回归分析就直接在已有的属性上进拟合。但是,这里我们有一个时间的关系,后一个时刻的属性值可能与前一个时刻的属性值有着很大的关系。所以我们可以用前面时刻的属性值来预测后面的属性值。

具体做法就是在数据上添加一个属性,称之为$z$,该属性表示每个观察数据前一时刻的属性值。这在R语言里面也很容易实现,使用"zoo"包就可以了:

z = lag(zoo(X$x), -1, na.pad=TRUE)
#combine the new atrribute
X$z = coredata(z)

参数na.pad=TRUE表示补上最前面的数据的缺值。这是因为我们整体将数据往后移动了一个时间单位,所以最远的那个时间点将没有$z$的数值。

在添加完新的属性之后,我们就可以用常规的线性回归对数据进行分析处理了。