参考文献:《Python数据分析与挖掘实战》
数据清洗
数据清洗:删除数据集中无关数据,重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值和异常值。
- 缺失值处理:删除记录、数据插补。
插补方法 | 方法描述 |
---|---|
均值/中位数/众数插补 | 按照属性值的类型取值 |
使用固定值 | 用常量替换 |
最近临插补 | 用缺失样本最接近的样本的属性值 |
回归方法 | 建立拟合模型预测缺失的属性值 |
插值法 | 根据已有数据建立插值函数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) 简单函数变化:将不具有正态分布的数据变换成具有正态分布的数据。在时间序列分析中,简单的对数变换或者差分运算可以将非平稳序列转换为平稳序列。使用对数变换还可以对数据进行压缩。
(2) 规范化:也称归一化,消除指标之间的量纲和取值范围差异的影响进行标准化处理,将数据按比例缩放,使其在一个特定范围,便于综合分析。
最大-最小规范化:
零-均值规范化:
小数定标规范化:
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) 小波变换:在时域和频域具有表征信号局部特征的能力,通过伸缩和平移
数据规约
意义:降低无效、错误数据对建模的影响,提高建模的准确性。少量且具有代表性的数据将大幅度缩减挖掘所需的时间。降低储存数据的成本。
方法 | 描述 |
---|---|
合并属性 | 旧属性合并为新属性 |
逐步向前选择 | 从空属性集开始添加当前最优属性,直到无法选出最优属性或满足阈值约束 |
逐步向后选择 | 从全属性集开始删除最差属性,直到无法选出最差属性或满足阈值约束 |
决策树归纳 | 利用决策树归纳法学习初始数据,删除没有在决策树上的属性 |
主成分分析 | 用较少的变量解释原始数据中大部分的变量 |
数值规约
- 直方图
- 聚类
- 抽样
- 参数回归