假设 A 考了 80 分,B 也考了 80 分,但前者是百分制,后者 500 分是满分,如果我们把从这两个渠道收集上来的数据进行集成、挖掘,就算使用效率再高的算法,结果也不是正确的。因为这两个渠道的分数代表的含义完全不同。
在数据变换前,我们需要先对字段进行筛选,然后对数据进行探索和相关性分析,接着是选择算法模型(这里暂时不需要进行模型计算),然后针对算法模型对数据的需求进行数据变换,从而完成数据挖掘前的准备工作。
数据变换是数据准备的重要环节,它通过数据平滑、数据聚集、数据概化及规范化等方式将数据转换成适用于数据挖掘的形式。
数据平滑:去除数据中的噪声,将连续数据离散化。这里可以采用分箱、聚类和回归的方式。
数据聚集:对数据进行汇总,在 SQL 中有一些聚集函数可以供我们操作(max(), min())。
数据概化:将数据由较低的概念抽象成为较高的概念,减少数据复杂度,即用更高的概念替代更低的概念。比如说上海、杭州、深圳、北京可以概化为中国。
数据规范化:使属性数据按比例缩放,这样就将原来的数值映射到一个新的特定区域中。常用的方法有最小—最大规范化、Z—score 规范化、按小数定标规范化等。
属性构造:构造出新的属性并添加到属性集中。这里会用到特征工程的知识,因为通过属性与属性的连接构造新的属性,其实就是特征工程。比如说,数据表中统计每个人的英语、语文和数学成绩,你可以构造一个“总和”这个属性,来作为新属性。
数据规范化的方法
1.min-max规范化
Min-max 规范化方法是将原始数据变换到 [0,1] 的空间中。用公式表示就是:
新数值 =(原数值 - 极小值)/(极大值 - 极小值)
2.Z-Score 规范化
新数值 =(原数值 - 均值)/ 标准差
假设 A 所在的班级平均分为 80,标准差为 10。B 所在的班级平均分为 400,标准差为100。那么 A 的新数值 =(80-80)/10=0,B 的新数值 =(80-400)/100=-3.2。
Z-Score 的优点是算法简单,不受数据量级影响,结果易于比较。不足在于,它需要数据整体的平均值和方差,而且结果没有实际意义,只是用于比较。
3.小数定标规范化
小数定标规范化就是通过移动小数点的位置来进行规范化。小数点移动多少位取决于属性A 的取值中的最大绝对值。
比如属性 A 的取值范围是 -999 到 88,那么最大绝对值为 999,小数点就会移动 3 位,即新数值 = 原数值 /1000。那么 A 的取值范围就被规范化为 -0.999 到 0.088。
Python的scikit-learn库使用
1.min-max规划化
from sklearn import preprocessing
import numpy as np
x = np.array([[0., -3., 1.],
[3., 1., 2.],
[0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
minmax_x = min_max_scaler.fit_transform(x)
print(minmax_x)
2.Z_Score规范化
y = np.array([[0., -3., 1.],
[3., 1., 2.],
[0., 1., -1.]])
scaled_x = preprocessing.scale(y)
print(scaled_x)
每行每列的值减去平均值,除以方差
3.小数定标规范化
z = np.array([[0., -3., 1.],
[3., 1., 2.],
[0., 1., -1.]])
j = np.ceil(np.log10(np.max(abs(z))))
scaled_x = x/(10**j)
print(scaled_x)