数据预处理包括有数据清洗,数据集成,数据转换,数据规约等过程。
数据预处理的目的是提高数据的质量,同时让数据更好的适应特定的挖掘技术或工具。
一般的数据挖掘过程中,数据预处理工作量占到了整个过程的60-70%。
数据清洗主要是删除原始数据集中的无关数据,重复数据,平滑噪声数据,还要筛选掉与挖掘主体无关的数据,处理缺失值,异常值等。
1. 缺失值处理
三种方法:删除含有缺失值的样本或属性,数据插补,不处理。
删除含有缺失值的样本或属性应该要慎用,特别是样本量很少,或属性很少的情况下,删除可能会丢掉一些重要信息。
image.png
比较常用的是均值/中位数/众数插补,固定值插补,最近邻插补法。用pandas中的fillna就可以处理。
还有比如拉格朗日插值法:
from scipy.interpolate import lagrange #导入拉格朗日插值函数
data=pd.read_excel(r"E:\PyProjects\DataSet\PyMining\Data\chapter4\demo\data\catering_sale.xls")
data[u'销量'][(data['销量'] < 400) | (data['销量'] > 5000)] = None #过滤异常值,将其变为空值
data.isnull().sum()
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
# 使用缺失值前后各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)
2. 异常值处理
异常值并不能一删了之,有些异常值可能含有重要信息。
image.png
参考资料:
《Python数据分析和挖掘实战》张良均等