
3.2 异常值
异常值对模型有非常重要的影响,因为其会极大地改变模型的拟合和预测。因此,处理异常值是为了能够拟合一个更加真实的模型。为了更加清晰地理解异常值的含义,这里举一个简单的例子,用于说明缺失值是如何影响模型的,使用到的数据集是R自带的cars数据集。
首先生成一个带有异常值的数据集,然后进行绘图,选取cars数据集的前30条数据,然后随机添加一些数据作为异常数据,如图3.3所示。


图3.3 异常值的回归模型
这里首先选取了cars数据集的前30条数据,然后添加了4个异常点,绘制散点图,最后拟合一条线性曲线。观察图3.3可以发现,拟合的线性模型因为异常值的存在,曲线的角度偏向上方。接下来绘制没有添加异常值的散点图,如图3.4所示。

观察图3.3和图3.4,比较去除异常值之后两者斜率的变化,之前训练的模型斜率比较大,这是因为模型受到了异常值的影响。异常值的识别方法有很多,下面对异常值进行简单的介绍。

图3.4 无异常值的回归模型
1.单变量的 异常值识别
异常值的识别有很多方法,最常见的一种是使用三倍标准差原则。三倍标准差原则指的是,如果数据服从正态分布,那么数据中在均值的三倍标准差之外的数据则可能是异常值。但是,数据不一定满足正态分布,因此这个判断标准不一定合适。另一个判断标准是,均值+1.5IQR至均值-1.5IQR这个范围之外的数据为异常值,IQR指的是四分位数间距,具体为75分位数与25分位数之间的距离。这里生成一个向量,取值1~100,然后添加一个异常值200 。使用boxplot_stats( )函数识别异常值,并使用boxplot( )函数绘制箱线图。如图3.5所示,游离在箱线之外的是异常值。


图3.5 箱线图
从输出结果可以看到,其已经识别出200为异常值。
2.多变量的模 型方法
使用某单一的标准来划分异常值,可能会带来一些问题。对于回归问题,可以使用cook距离来分析异常值,cook距离是针对回归模型计算的度量,其表示数据对预测结果的影响。cook距离的公式如下:

式中,Ŷj是第j条数据的预测,包含这个模型中的所有数据;Ŷj(i)是第j条数据的预测,这个时候模型中不包含第i条数据;MSE是模型的均方误差;p是回归模型中的系数个数。
这里用到的数据集是R自带的mycars数据集,首先使用lm( )构建回归模型,因变量为mpg。构建好模型之后,使用cooks.distance( )计算模型的cook距离。

一般而言,cook距离大于平均值的4倍,可能被归类为异常值,如图3.6所示。


图3.6 cook距离图
现在找出那些有问题的行。

结合原始数据集的分布情况,可以发现,第一条数据的qsec在数据集中是最大值。第二条数据的cyl太小了。
另外,car包中的outlierTest可以从模型中直接给出异常值结果:

结果指出,Ford Pantera L这一行为异常值。