数据分析实战45讲笔记(13) 数据转换

   如果一个人在百分制的考试中得了95分,你肯定会认为他学习成绩很好,如果得了65分,就会觉得他成绩不好。如果得了80分呢?你会觉得他成绩中等,因为在班级里这属于大部分人的情况。是因为我们从小到大的考试成绩基本上都会满足正态分布的情况。正态分布也叫作常态分布,就是正常的状态下,呈现的分布情况。
       在正态分布中,大部分人的成绩会集中在中间的区域,少部分人处于两头的位置。正态分布的另一个好处就是,如果你知道了自己的成绩,和整体的正态分布情况,就可以知道自己的成绩在全班中的位置。
       

让不同渠道的数据统一到一个目标数据库里,就用到了数据变换。在数据变换前,我们需要先对字段进行筛选,然后对数据进行探索和相关性分析,接着是选择算法模型(这里暂时不需要进行模型计算),然后针对算法模型对数据的需求进行数据变换,从而完成数据挖掘前的准备工作。

数据变换是数据准备的重要环节,它通过数据平滑、数据聚集、数据概化和规范化等方式将数据转换成适用于数据挖掘的形式。

数据变换常用方法:

1>数据平滑:去除数据中的噪声,将连续数据离散化。这里可以采用分箱、聚类和回归的方式进行数据平滑

2>数据聚集:对数据进行汇总,在SQL中有一些聚集函数可以供我们操作,比如Max()反馈某个字段的数值最大值,Sum()返回某个字段的数值总和;

3>数据概化:将数据由较低的概念抽象成为较高的概念,减少数据复杂度,即用更高的概念替代更低的概念。比如说上海、杭州、深圳、北京可以概化为中国。

4>数据规范化:使属性数据按比例缩放,这样就将原来的数值映射到一个新的特定区域中。常用的方法有最小—最大规范化、Z—score 规范化、按小数定标规范化等,我会在后面给你讲到这些方法的使用;

5>属性构造:构造出新的属性并添加到属性集中。这里会用到特征工程的知识,因为通过属性与属性的连接构造新的属性,其实就是特征工程。比如说,数据表中统计每个人的英语、语文和数学成绩,你可以构造一个“总和”这个属性,来作为新属性。这样“总和”这个属性就可以用到后续的数据挖掘计算中。

数据规范化的几种方法:

1>Min-max 规范化:Min-max标准化方法是将原始数据变换到[0,1]的空间中。用公式表示就是:新数值=(原数值-极小值)/(极大值-极小值)。

2>Z-Score 规范化:

假设A与B的考试成绩都为80分,A的考卷满分是100分(及格60分),B的考卷满分是500分(及格300分)。虽然两个人都考了80分,但是A的80分与B的80分代表完全不同的含义。Z-Score用相同的标准来比较A与B的成绩。、

定义:新数值=(原数值-均值)/ 标准差。

假设A所在的班级平均分为80,标准差为10。B所在的班级平均分为400,标准差为100。那么A的新数值=(80-80)/10=0,B的新数值=(80-400)/100=-3.2。那么在Z-Score标准下,A的成绩会比B的成绩好。Z-Score的优点是算法简单,不受数据量级影响,结果易于比较。不足在于,它需要数据整体的平均值和方差,而且结果没有实际意义,只是用于比较。

3>小数定标规范化:就是通过移动小数点的位置来进行规范化。小数点移动多少位取决于属性A的取值中的最大绝对值。

    比如属性A的取值范围是-999到88,那么最大绝对值为999,小数点就会移动3位,即新数值=原数值/1000。那么A的取值范围就被规范化为-0.999到0.088。

Python的Scikit-Learn库使用

SciKit-Learn不仅可以用于数据变换,它还提供了分类、聚类、预测等数据挖掘算法的API封装。

1.Min-max 规范化

让原始数据投射到指定的空间[min, max],在SciKit-Learn里有个函数MinMaxScaler是专门做这个的,它允许我们给定一个最大值与最小值,然后将原数据投射到[min, max]中。默认情况下[min,max]是[0,1],也就是把原始数据投放到[0,1]范围内。

from sklearn import preprocessing
import numpy as np 
#初始化数据,每行代表一个样本,每列表示一个特征
x=np.array([[0.,-3.,1.],
            [3.,1.,2.],
            [0.,1.,-1.]])
#将数据进行[0,1]规范化
min_max_scaler=preprocessing.MinMaxScaler()
minmax_x=min_max_scaler.fit_transform(x)
print(minmax_x)
#结果
[[0.         0.         0.66666667]
 [1.         1.         1.        ]
 [0.         1.         0.        ]]

2>Z-Score规范化:在SciKit-Learn库中使用preprocessing.scale()函数,可以直接将给定数据进行Z-Score规范化。

import numpy as np
#初始化数据
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
scaled_x=preprocessing.scale(x)
print(scaled_x)
[[-0.70710678 -1.41421356  0.26726124]
 [ 1.41421356  0.70710678  1.06904497]
 [-0.70710678  0.70710678 -1.33630621]]

这个结果实际上就是将每行每列的值减去了平均值,再除以方差的结果。我们看到Z-Score规范化将数据集进行了规范化,数值都符合均值为0,方差为1的正态分布。

3>小数定标规范化:我们需要用NumPy库来计算小数点的位数.

from sklearn import preprocessing
import numpy as np
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
j=np.ceil(np.log10(np.max(abs(x))))
scaled_x=x/(10**j)
print(scaled_x)
#结果
[[ 0.  -0.3  0.1]
 [ 0.3  0.1  0.2]
 [ 0.   0.1 -0.1]]

在数据变换中,重点是如何将数值进行规范化,有三种常用的规范方法,分别是Min-Max规范化、Z-Score规范化、小数定标规范化。其中Z-Score规范化可以直接将数据转化为正态分布的情况,当然不是所有自然界的数据都需要正态分布,我们也可以根据实际的情况进行设计,比如取对数log,或者神经网络里采用的激励函数等。

练习:

假设属性income的最小值和最大值分别是5000元和58000元。利用Min-Max规范化的方法将属性的值映射到0至1的范围内,那么属性income的16000元将被转化为多少?

from sklearn import preprocessing
import numpy as np
x=np.array([[5000.],[16000.],[58000.]])
min_max_scaler=preprocessing.MinMaxScaler()
minmax_x=min_max_scaler.fit_transform(x)
print(minmax_x)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值