返回介绍

4.1 数据清洗

发布于 2024-01-28 21:41:24 字数 4310 浏览 0 评论 0 收藏 0

数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值等。

4.1.1 缺失值处理

处理缺失值的方法可分为3类:删除记录、数据插补和不处理。其中常用的数据插补方法见表4-1。

表4-1 常用的插补方法

如果通过简单的删除小部分记录达到既定的目标,那么删除含有缺失值的记录的方法是最有效的。然而,这种方法却有很大的局限性。它是以减少历史数据来换取数据的完备,会造成资源的大量浪费,将丢弃了大量隐藏在这些记录中的信息。尤其在数据集本来就包含很少记录的情况下,删除少量记录可能会严重影响到分析结果的客观性和正确性。一些模型可以将缺失值视作一种特殊的取值,允许直接在含有缺失值的数据上进行建模。

本节重点介绍拉格朗日插值法和牛顿插值法。其他的插值方法还有Hermite插值、分段插值、样条插值法等。

(1)拉格朗日插值法

根据数学知识可知,对于平面上已知的n个点(无两点在一条直线上)可以找到一个n-1次多项式y=a0+a1x+a2x2+…+an-1xn-1,使此多项式曲线过这n个点。

1)求已知的过n个点的n-1次多项式:

y=a0+a1x+a2x2+…+an-1xn-1 (4-1)

将n个点的坐标(x1,y1),(x2,y2)…(xn,yn)代入多项式函数,得

解出拉格朗日插值多项式为:

2)将缺失的函数值对应的点x代入插值多项式得到缺失值的近似值L(x)。

拉格朗日插值公式结构紧凑,在理论分析中很方便,但是当插值节点增减时,插值多项式就会随之变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值法。

(2)牛顿插值法

1)求已知的n个点对(x1,y1),(x2,y2)…(xn,yn)的所有阶差商公式

2)联立以上差商公式建立如下插值多项式f(x)

其中:

P(x)是牛顿插值逼近函数,R(x)是误差函数。

3)将缺失的函数值对应的点x代入插值多项式得到缺失值的近似值f(x)。

牛顿插值法也是多项式插值,但采用了另一种构造插值多项式的方法,与拉格朗日插值相比,具有承袭性和易于变动节点的特点。从本质上来说,两者给出的结果是一样的(相同次数、相同系数的多项式),只不过表示的形式不同。因此,在Python的Scipy库中,只提供了拉格朗日插值法的函数(因为实现上比较容易),如果需要牛顿插值法,则需要自行编写函数。

下面结合具体案例介绍拉格朗日插值实现方法。

餐饮系统中的销量数据可能会出现缺失值,如表4-2为某餐厅一段时间的销量表,其中2015年2月14日的数据缺失,用拉格朗日插值对缺失值进行插补的Python程序实现如代码清单4-1所示。

表4-2 某餐厅一段时间的销量数据

数据详见:demo/data/catering_sale.xls

代码清单4-1 用拉格朗日法进行插补

#拉格朗日插值代码
import pandas as pd #导入数据分析库Pandas
from scipy.interpolate import lagrange #导入拉格朗日插值函数
inputfile = '../data/catering_sale.xls' #销量数据路径
outputfile = '../tmp/sales.xls' #输出数据路径
data = pd.read_excel(inputfile) #读入数据
data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None #过滤异常值,将
    其变为空值
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
  y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数
  y = y[y.notnull()] #剔除空值
  return lagrange(y.index, list(y))(n) #插值并返回插值结果
#逐个元素判断是否需要插值
for i in data.columns:
  for j in range(len(data)):
    if (data[i].isnull())[j]: #如果为空即插值。
      data[i][j] = ployinterp_column(data[i], j)
data.to_excel(outputfile) #输出结果,写入文件

代码详见:demo/code/lagrange_newton_interp.m

应用拉格朗日插值法算对表4-2中的缺失值进行插补,使用缺失值前后各5个未缺失的数据参与建模,得插值结果如下所示。

在进行插值之前会对数据进行异常值检测,发现2015/2/21日的数据是异常的(数据大于5000),所以也把此日期数据定义为空缺值,进行补数。利用拉格朗日插值对这2015/2/21和2015/2/14的数据进行插补,结果是4275.255和4156.86,这两天都是周末,而周末的销售额一般要比周一到周五要多,所以插值结果比较符合实际情况。

4.1.2 异常值处理

在数据预处理时,异常值是否剔除,需视具体情况而定,因为有些异常值可能蕴含着有用的信息。异常值处理常用方法见表4-3。

表4-3 异常值处理常用方法

将含有异常值的记录直接删除的方法简单易行,但缺点也很明显,在观测值很少的情况下,这种删除会造成样本量不足,可能会改变变量的原有分布,从而造成分析结果的不准确。视为缺失值处理的好处是可以利用现有变量的信息,对异常值(缺失值)进行填补。

在很多情况下,要先分析异常值出现的可能原因,再判断异常值是否应该舍弃,如果是正确的数据,可以直接在具有异常值的数据集上进行挖掘建模。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文