【数据挖掘】数据预处理

参考文献:《Python数据分析与挖掘实战》

数据清洗

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

  1. 缺失值处理:删除记录、数据插补。
插补方法 方法描述
均值/中位数/众数插补 按照属性值的类型取值
使用固定值 用常量替换
最近临插补 用缺失样本最接近的样本的属性值
回归方法 建立拟合模型预测缺失的属性值
插值法 根据已有数据建立插值函数f(x)计算f(xi)

拉格朗日插值法:

inputfile = '../data/catering_sale.xls'
outputfile = '../data/sales.xls'
data = pd.read_excel(inputfile)
data[(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None
def ployinterp_column(index, df, k=5):
    y = df[list(range(index - k, index)) + list(range(index + 1, index + 1 + k))]
    y = y[y.notnull()]
    return lagrange(y.index, list(y))(index)
df = data[data[u'销量'].isnull()]
index_list = df[u'销量'].index
for index in index_list:
    data[[u'销量']][index] = ployinterp_column(index, data[u'销量'])
data.to_excel(outputfile)
  1. 异常值处理:删除异常记录,视为缺失值,用均值修正

数据集成

将多个数据源合并在一个一致的数据存储的过程(冗余属性识别、实体识别)

数据变换

对数据进行规范化处理,转化为适当的形式
(1) 简单函数变化:将不具有正态分布的数据变换成具有正态分布的数据。在时间序列分析中,简单的对数变换或者差分运算可以将非平稳序列转换为平稳序列。使用对数变换还可以对数据进行压缩。
(2) 规范化:也称归一化,消除指标之间的量纲和取值范围差异的影响进行标准化处理,将数据按比例缩放,使其在一个特定范围,便于综合分析。
最大-最小规范化: x = x m i n m a x m i n x^*=\frac{x-min}{max-min}
零-均值规范化: x = x x ˉ σ x^*=\frac{x-\bar{x}}{\sigma}
小数定标规范化: x = x 1 0 k x^*=\frac{x}{10^k}

datafile = '../data/normalization_data.xls'
data = pd.read_excel(datafile, header=None)
print((data - data.min()) / (data.max() - data.min())) #最大-最小
print((data - data.mean()) / data.std()) # 零-均值
print(data / 10**np.ceil(np.log10(data.abs().max()))) #小数定标

(3) 连续属性离散化
等宽法:将属性的值域划分为等宽的区间。
等频法:将相同数量的记录放在一个区间。
聚类法:将连续属性进行聚类,对聚类得到的簇进行处理,需要指定簇的个数,得到区间数。

datafile = '../data/discretization_data.xls'
data = pd.read_excel(datafile)
data = data[u'肝气郁结证型系数'].copy()
k = 4
# 等宽切分
d1 = pd.cut(data, k, labels=range(k))

# 等频切分
w = [1.0 * i / k for i in range(k + 1)]
# percentiles表示特定百分位数,同四分位数
w = data.describe(percentiles=w)[4:4 + k + 1]
w[0] = w[0] * (1 - 1e-10)
d2 = pd.cut(data, w, labels=range(k))

# 使用Kmeans聚类
kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data.values.reshape(len(data), 1))
# 输出聚类中心,并且排序
c = DataFrame(kmodel.cluster_centers_).sort_values(0)
# 相邻两项求中点,作为边界点
w = DataFrame.rolling(c, 2).mean().iloc[1:]
# 加上首末边界点
w = [0] + list(w[0]) + [data.max()]
d3 = pd.cut(data, w, labels=range(k))
def cluster_plot(d, k):
	plt.figure(figsize=(8, 3))
    for j in range(0, k):
    	plt.plot(data[d == j], [j for i in d[d == j]], 'o')
    plt.ylim(-0.5, k - 0.5)
    return plt
cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

(4) 属性构造:从已有属性集中构造出新属性,加入到现有的属性集合中。

inputfile = "../data/electricity_data.xls"
outputfile = "../tmp/electricity_data.xls"
data = pd.read_excel(inputfile)
data[u"线损率"] = (data[u"供入电量"] - data[u"供出电量"]) / data[u"供入电量"]
data.to_excel(outputfile, index=False)

(5) 小波变换:在时域和频域具有表征信号局部特征的能力,通过伸缩和平移

数据规约

意义:降低无效、错误数据对建模的影响,提高建模的准确性。少量且具有代表性的数据将大幅度缩减挖掘所需的时间。降低储存数据的成本。

方法 描述
合并属性 旧属性合并为新属性
逐步向前选择 从空属性集开始添加当前最优属性,直到无法选出最优属性或满足阈值约束
逐步向后选择 从全属性集开始删除最差属性,直到无法选出最差属性或满足阈值约束
决策树归纳 利用决策树归纳法学习初始数据,删除没有在决策树上的属性
主成分分析 用较少的变量解释原始数据中大部分的变量

数值规约

  1. 直方图
  2. 聚类
  3. 抽样
  4. 参数回归
发布了12 篇原创文章 · 获赞 24 · 访问量 1580

猜你喜欢

转载自blog.csdn.net/xd963625627/article/details/104698616