【机器学习课程】第二章数据准备 2.数据质量分析

想像力比知识更重要。——爱因斯坦

第二章 数据准备 2.数据质量分析

2.1为什么要进行数据质量分析

数据获取后,在建模训练之前需要进行一系统的数据分析工作。因为在收集过程中,人工收集、人工录入、数据存储等各个环节的人工干预都可能会导致数据出现错误。错误的数据会直接影响模型的质量。

试想一下,假如模型正在拟合训练人口统计学数据,身高数据都是厘米为单位,突然有一条数据记录以米为单位。模型并不能直接发现哪些数据不该学习,导致模型出错,增大误差。

因此,需要对数据进行质量检查,数据质量检查的工作主要包括:重复值检查、缺失值检查、异常值检查。

2.2数据质量分析工具

数据质量分析工作,有大量的数据统计检查工作,需要借助python编程语言。python语言是一门解释型,动态,强类型编程语言。它既能进行面向过程编程,也能进行面向对象编程。pyhon有一些常用的数学计算库、统计分析库、数据可视化库供开发人员使用。

库名介绍
NumPy支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。通常与SciPy(Scientific Python)和Matplotlib(绘图库)一起使用,这种组合广泛用于替代Matlab,是一个流行的技术平台
pandas一款开放源码的BSD许可的Python库。基于NumPy创建,为Python编程语言提供了高性能的、易于使用的数据结构和数据分析工具。pandas应用领域广泛,包括金融,经济,统计,分析等学术和商业领域。
Matplotlib第一个Python可视化库,有许多别的程序库都是建立在其基础上或者直接调用该库,可以很方便的得到数据的大致信息,功能非常强大,也非常复杂
Seaborn利用了matplotlib,用简洁的代码来制作好看的图表,跟matplotlib最大的区别为默认绘图风格和色彩搭配都具有现代美感
scikit-learnPython机器学习标准库,又称sklearn,在众多机器学习模块中比较优秀,汇集了各种监督学习、非监督学习、半监督学习的方法,提供现成的功能来实现诸如线性回归、分类器、SVM、k-均值和神经网络等多种算法,并包含一些可直接用于训练和测试的样本数据集。除scikit-learn以外,Python中其他类似的机器学习库还有Orange3、XGBoost、NuPIC、Milk
TensorFlow由Google团队开发的神经网络模块,一个采用数据流图来进行数值计算的开源软件库,可绘制计算结构图,为一系列可人机交互的计算操作,编辑好的Python文件将被转换成更高效的C++,并在后端进行计算。其他比较常用的深度学习库还有Caffe、Theano、Keras

2.3 重复值检查

在数据人工录入及多个数据文件合并过程中,非常容易出现重复记录。
重复记录一般直接删除,仅保留一条。

为了便于复现,下面的案例使用的是手动创建的数据。

import pandas as pd
# 创建了一个二维列表
data = [[1,2,3],[4,5,6],[7,8,9],[1,2,3],[4,555,666],[5,555,666]]

# 将列表转换为pandas可以直接处理的dataframe格式
df =pd.DataFrame(data)

#修改列名
df.columns=['ID','属性a','属性b']
print(df)

#检查是否有重复记录,即所有字段完全相同。返回值为bool类型,False 表示未重复,True表示该记录重复。
df.duplicated()
# 全部字段重复是重复数据
''' Out:

0    False
1    False
2    False
3     True
4    False
5    False
dtype: bool
'''

对dataframe数据进行重复数据记录检查和重复数据记录删除。

# 删除重复数据 不在原数据上进行更新,返回一个去重的datafram,索引编号会存在缺失。
df_new = df.drop_duplicates()
# 全部字段重复是重复数据
print(df)
print(df_new)

''' Out:

  ID  属性a  属性b
0   1    2    3
1   4    5    6
2   7    8    9
3   1    2    3
4   4  555  666
5   5  555  666
   ID  属性a  属性b
0   1    2    3
1   4    5    6
2   7    8    9
4   4  555  666
5   5  555  666
'''

对dataframe数据中,特定字段进行重复数据检查和重复数据记录删除。

#对特定的列进行重复检查
df.duplicated(['属性a', '属性b'])
# 属性a和属性b字段重复,就是重复数据
df.drop_duplicates(['属性a', '属性b'])

2.4缺失值检查

缺失值主要是指数据集中部分记录存在部分字段的信息缺失,有的时候也叫空值检查。
数据缺失,很可能在数据收集时存在困难,未获取到相关字段,或遗漏录入字段。

import pandas as pd
# 创建了一个二维列表
data2 = [[1,2,3],[4,5,],[7,None,9],['',2,9]]

# 将列表转换为pandas可以直接处理的dataframe格式
df2 =pd.DataFrame(data2)

#修改列名
df2.columns=['ID','属性a','属性b']
print(df2)

检查空值,获得空值所在列,获得包含多少空值。

# 判断dataframe中的每个数据,是否未空,返回False True
df2.isnull()

# 检查每列是否存在缺失值
df2.isnull().any() 
# 检查某一列是否存在缺失值
df2['属性a'].isnull().any() 

# 统计某一列空值数量
df2['ID'].isnull().any().sum()

#统计各字段的缺失值个数
df2.isnull().apply(pd.value_counts)

对空值进行操作

1.删除空值所在记录

该方法可能会导致数据量骤降,根据样本规模情况、数据质量要求情况,进行使用。

2.进行空值填充

① 方法一:使用特定值填充
使用缺失值字段的平均值、中位数、众数等统计量填充。

② 方法二:使用算法预测填充
将缺失值字段作为因变量,将没有缺失值字段作为自变量,使用决策树、随机森林、KNN、回归等预测算法进行缺失值的预测,用预测结果进行填充。

③ 方法三:将缺失值单独作为一个分组,指定值进行填充
从业务上选择一个单独的值进行填充,使缺失值区别于其他值而作为一个分组,从而不影响算法计算。

空值记录删除方法

#删除含有缺失值的记录
'''
dropna(axis=0,how=any,subset=None)
该方法包含3个参数,
* axis=1是,删除所在列,默认为axis=0
* how=any,只有包含空值,就删除,how=all 时,表示所有值都同时为空删除。
* subset默认值所有属性,可以指定特定的几个数据,例如:subset=['a','b']
'''
df2.dropna()

空值记录填充方法

DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

#缺失值统一填充为1
df.fillna(value=1)

#缺失值根据字典规则进行填充,A列填充为2 ,B列填充为3
df.fillna(value={'A':2,'B':3})

#向前填充,注意此处默认参数axis=0,所以空值是填充上一行的数据,而不是前一列。
df.fillna(method='ffill')

2.5异常值检查

异常值的产生一般是由疏忽、失误或突然发生的不该发生的原因造成,如读错、记错、仪器示值突然跳动、突然震动、操作失误等。

在检查异常值之前,应当对数据有一个初步的了解,进行初步的观察。

import pandas as pd
# 创建了一个二维列表
data = [[1,2,3],[4,5,6],[7,8,9],[1,2,3],[4,555,666],[5,555,666]]

# 将列表转换为pandas可以直接处理的dataframe格式
df2 =pd.DataFrame(data)

#修改列名
df2.columns=['ID','属性a','属性b']


print(df2.info()) #数据信息简介
print(df2.describe()) #数据统计信息描述

'''
Out:
             ID         属性a         属性b
count  6.000000    6.000000    6.000000
mean   3.666667  187.833333  225.500000
std    2.338090  284.414779  341.217086
min    1.000000    2.000000    3.000000
25%    1.750000    2.750000    3.750000
50%    4.000000    6.500000    7.500000
75%    4.750000  418.250000  501.750000
max    7.000000  555.000000  666.000000

'''

print(df2.index)  #查看索引
print(df2.values)  #查看数据值
print(df2.columns)  #查看每一列的列表头内容
print(df2.dtypes)  #查看数据类型
print(df2.size)  #查看数据大小
print(df2.shape)  #查看数据几行几列
数据取值异常

根据数据特征的最大值、最小值、平均值等信息,可以评估数据的大致区间。如果数据异常大或小,可以观察出。

利用箱型图的四分位距(IQR)对异常值进行检测

假设数据服从正态分布,一组数据中若与平均值的偏差超过两倍标准差的数据成为异常值,称为四分位距准则(IQR)。

import numpy as np
array = (51, 2618.2, 2608.4, 2651.9, 3442.1, 3393.1, 3136.1, 3744.1, 
         6607.4, 4060.3, 3614.7, 3295.5, 2332.1, 2699.3, 3036.8, 
         865, 3014.3, 2742.8, 2173.5)      
# 利用箱型图的四分位距(IQR)对异常值进行检测
Percentile = np.percentile(array, [0, 25, 50, 75, 100])  # 计算百分位数
IQR = Percentile[3] - Percentile[1]  # 计算箱型图四分位距
UpLimit = Percentile[3]+IQR*1.5  # 计算临界值上界
arrayownLimit = Percentile[1]-IQR*1.5  # 计算临界值下界
# 判断异常值,大于上界或小于下界的值即为异常值
abnormal = [i for i in array if i >UpLimit or i < arrayownLimit] 
print('箱型图的四分位距(IQR)检测出的array中异常值为:\n', abnormal)
print('箱型图的四分位距(IQR)检测出的异常值比例为:\n', len(abnormal)/len(array))
利用3sigma原则对异常值进行检测

与平均值的偏差超过3倍标准差的数据成为高度异常的异常值,称为3sigma原则。
数据类型异常,


# 利用3sigma原则对异常值进行检测
array_mean = np.array(array).mean()  # 计算平均值
array_sarray = np.array(array).std()  # 计算标准差
array_cha = array - array_mean  # 计算元素与平均值之差
# 返回异常值所在位置
ind = [i for i in range(len(array_cha)) if np.abs(array_cha[i])>array_sarray]
abnormal = [array[i] for i in ind]  # 返回异常值
print('3sigma原则检测出的array中异常值为:\n', abnormal)
print('3sigma原则检测出的异常值比例为:\n', len(abnormal)/len(array))

2.6一致性检查

针对大规模数据的处理过程中,可能会出现时间跨度大,设备更新迭代,人员变更的情况。可能导致多个数据文件的格式类型不一致,数值单位不统一,收集时间间隔不同,不同字段的命名相同,相同字段命名不同等问题。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值