机器学习小组知识点24:数据预处理之数据清理(Data-Cleaning)

来源:互联网 发布:数据库误删除没备份 编辑:程序博客网 时间:2024/05/20 07:50

数据清理的处理内容分为

  • 格式标准化
  • 异常数据清楚
  • 错误纠正
  • 重复数据的清楚

空缺值处理

  • 数据并不总是完整的。
    例如:数据库表中,很多条记录的对应字段没有相应值,比如销售表中的顾客收入;更深层次的向淘宝、美团中的顾客记录等都会出现数据的不完整性,后者也是当今工业界甚至学术界研究的热点。感兴趣的同学自行google低秩矩阵填充。
  • 引起空缺值的原因:
    设备异常
    与其他已有数据不一致而删除
    因为误解而没有被输入的数据
    在输入时,有些数据因为得不到重视而没有被输入,但是老板相当重视!这个时候你就惨了!
    对数据的改变没有进行日志记载
    对应淘宝、美团问题都是客观不可改变的原因
  • 空缺值要经过推断而补上

如何处理空缺值

  • 忽略元组: 当一个记录中有多个属性值空缺,特别是关键信息丢失时候,已不能反应真实情况,效果很差
  • 去掉属性: 缺失严重时,已经没有挖掘意义
  • 人工填写空缺值: 工作量大,可行性差
  • 默认值: 比如有unknown 或者是 +
  • 使用属性的平均值填充空缺值
  • 使用同类样本的平均值
  • 预测最可能的值填充空缺值:使用贝叶斯公式或判定树这样的基于推断的方法

噪声数据

噪声: 一个测量变量中的随机错误或偏差

  • 引起不正确属性值的原因
    数据收集工具的问题(iphone摄像头不好:曝光)
    数据输入错误(iphone图像处理软件不好)
    数据传输错误(用iphone中的微信等软件传输照片都会失真)
    技术限制(毛主席的照片也没有我现在iphone里面任何一张照片清晰)
    命名规则的不一致
  • 其他数据清理的数据问题
    重复记录
    不完整的数据
    不一致的数据

如何处理噪声数据

  • 分箱
    首先对数据进行排序,然后将他们分到等深的箱中
    然后按照箱内平均值平滑、箱中值平滑、箱边界平滑
  • 聚类
    检测并去除孤立点
  • 计算机和人工检查结合
    计算机检查可疑数据,然后对他们进行人工判断(SPSS和SAS古老的工具),现在肯定是python和R语言的天下
  • 回归
    通过让数据适应回归函数来平滑数据(差值多项式用武之地)
数据平滑的分箱方法
  • 假设价格这个属性排序后的数据为:4,8,15,21,21,24,25,28,34
  • 划分为等深箱:
    箱1: 4,8,15
    箱2:21,21,24
    箱3:25,28,34
  • 用箱平均值平滑
    箱1: 9,9,9
    箱2:22,22,22
    箱3:29,29,29
    同志们,像不像分片的平均化?我们在分类的时候经常这样干对不对?
  • 用箱边界平滑
    箱1: 4,4,15
    箱2:21,21,24
    箱3:25,25,34
  • 箱中值平滑
    无需多说,机器视觉课上对于图像的椒盐噪音,中指滤波算子就是个很好的箱中指平滑
聚类

通过聚类分析查找孤立点,消除噪音
效果图:
三个孤立点

回归
  • 通过回归函数来构造数据变化的趋势,这样可以用一个变量来预测另一个变量
    线性回归
    线性回归
  • 多项式回归
    Python的Scipy库中只提供了拉格朗日插值法的函数
#-*- coding: utf-8 -*-# 插值时存在问题,不同的位置选取的数据点不一样,并且保证最后的数据是正确的# 目前没有考虑连续脏数据的情况#拉格朗日插值代码import pandas as pd #导入数据分析库Pandasfrom 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,插值不要超过20def ployinterp_column(s, n, k=5):  y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数,y是长度为10的列表  y = y[y.notnull()] #剔除空值  return lagrange(y.index, list(y))(n) #插值并返回插值多项式,代入n得到插值结果#逐个元素判断是否需要插值k = 2for i in data.columns:  for j in range(len(data)):    if (data[i].isnull())[j]: #如果为空即插值。        if (j >= k) and (j < len(data) - k):            y = data[i][list(range(j-k, j)) + list(range(j+1, j+1+k))] #取数,y是长度为10的列表        elif j < k :            y = data[i][list(range(0, j)) + list(range(j+1, 2 * k + 1))]        elif j >= len(data) - k:            y = data[i][list(range(len(data) - 1 - 2 * k, j)) + list(range(j+1, len(data)))]        y = y[y.notnull()] #剔除空值        data[i][j] = lagrange(y.index, list(y))(j) #插值并返回插值多项式,代入j得到插值结果data.to_excel(outputfile) #输出结果,写入文件 

这个就是大家常见的牛顿插值,拉格朗日插值,切比雪夫多项式等等
高大上点儿的可以让熊神跟大家介绍下上海交大李敬来研究员做的高斯逼近以及TV逼近

参考文献

1.Python数据分析与挖掘实战–读书笔记
2. 龚卫华博士-数据挖掘之预处理技术课件

0 0