【火炉炼AI】机器学习001-数据预处理技术(均值移除,范围缩放,归一化,二值化,独热编码)

【火炉炼AI】机器学习001-数据预处理技术(均值移除,范围缩放,归一化,二值化,独热编码)

(【本文所使用的Python库和版本号】: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

数据预处理的必要性:在真实世界中,经常需要处理大量的原始数据,这些原始数据是机器学习算法无法理解的,所以为了让机器学习算法理解原始数据,需要对数据进行预处理。

最常用的数据预处理技术:


1. 均值移除(Mean removal)

把每个特征的平均值移除,以保证特征均值为0(即标准化处理),这样做可以消除特征彼此间的偏差。

###########对数据集进行Normalization#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始数据矩阵 shape=(3,4)

data_standardized=preprocessing.scale(data)

print(data_standardized.shape)
print('Mean={}'.format(data_standardized.mean(axis=0)))
print('Mean2={}'.format(np.mean(data_standardized,axis=0)))
print('standardized: ')
print(data_standardized)
print('STD={}'.format(np.std(data_standardized,axis=0)))

-------------------------------------输---------出--------------------------------

(3, 4)
Mean=[ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17]
Mean2=[ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17]
standardized:
[[ 1.33630621 -1.40451644 1.29110641 -0.86687558]
[-1.06904497 0.84543708 -0.14577008 1.40111286]
[-0.26726124 0.55907936 -1.14533633 -0.53423728]]
STD=[1. 1. 1. 1.]

--------------------------------------------完-------------------------------------

########################小**********结###############################

1, 值移除之后的矩阵每一列的均值约为0,而std为1。这样做的目的是确保每一个特征列的数值都在类似的数据范围之间,防止某一个特征列数据天然的数值太大而一家独大。

2, 可以直接调用preprocessing模块中成熟的scale方法来对一个numpy 矩阵进行均值移除。

3, 求一个numpy矩阵的平均值(或std,min,max等)至少有两种方法,如代码中第9行和第10行所示。

#################################################################


2. 范围缩放(Scaling)

必要性:数据点中每个特征列的数值范围可能变化很大,因此,有时需要将特征列的数值范围缩放到合理的大小。

###########对数据集进行范围缩放#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始数据矩阵 shape=(3,4)

data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1)) # 缩放到(0,1)之间
data_scaled=data_scaler.fit_transform(data)

print('scaled matrix: *********************************')
print(data_scaled)

-------------------------------------输---------出--------------------------------

scaled matrix: *********************************
[[1. 0. 1. 0. ]
[0. 1. 0.41025641 1. ]
[0.33333333 0.87272727 0. 0.14666667]]

--------------------------------------------完-------------------------------------

########################小**********结###############################

1. 值移除之后的矩阵每一列的均值约为0,而std为1。这样做的目的是确保每一个特征列的数值都在类似的数据范围之间,防止某一个特征列数据天然的数值太大而一家独大。

2. 可以直接调用preprocessing模块中成熟的scale方法来对一个numpy 矩阵进行均值移除。

3. 求一个numpy矩阵的平均值(或std,min,max等)至少有两种方法,如代码中第9行和第10行所示

#################################################################


3. 归一化(Normalization)

用于需要对特征向量的值进行调整时,以保证每个特征向量的值都缩放到相同的数值范围。机器学习中最常用的归一化形式就是将特征向量调整为L1范数,使特征向量的数值之和为1.

###########对数据集进行Normalization#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始数据矩阵 shape=(3,4)

data_L1_normalized=preprocessing.normalize(data,norm='l1')
print('L1 normalized matrix: *********************************')
print(data_L1_normalized)
print('sum of matrix: {}'.format(np.sum(data_L1_normalized)))

data_L2_normalized=preprocessing.normalize(data) # 默认:l2
print('L2 normalized matrix: *********************************')
print(data_L2_normalized)
print('sum of matrix: {}'.format(np.sum(data_L2_normalized)))

-------------------------------------输---------出--------------------------------

L1 normalized matrix: *********************************
[[ 0.25210084 -0.12605042 0.16806723 -0.45378151]
[ 0. 0.625 -0.046875 0.328125 ]
[ 0.0952381 0.31428571 -0.18095238 -0.40952381]]
sum of matrix: 0.5656337535014005
L2 normalized matrix: *********************************
[[ 0.45017448 -0.22508724 0.30011632 -0.81031406]
[ 0. 0.88345221 -0.06625892 0.46381241]
[ 0.17152381 0.56602858 -0.32589524 -0.73755239]]
sum of matrix: 0.6699999596689536

--------------------------------------------完-------------------------------------

########################小**********结###############################

1,Normaliztion之后所有的特征向量的值都缩放到同一个数值范围,可以确保数据点没有因为特征的基本性质而产生的较大差异,即确保所有数据点都处于同一个数据量,提高不同特征数据的可比性。

2,注意和均值移除的区别:均值移除是对每一个特征列都缩放到类似的数值范围,每一个特征列的均值为0,而Normalization是将全局所有数值都缩放到同一个数值范围。

#################################################################


4. 二值化(Binarization)

二值化用于将数值特征向量转换为布尔类型向量。

###########对数据集进行Binarization#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始数据矩阵 shape=(3,4)

data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)
print('binarized matrix: *********************************')
print(data_binarized)

-------------------------------------输---------出--------------------------------

binarized matrix: *********************************
[[1. 0. 1. 0.]
[0. 1. 0. 1.]
[0. 1. 0. 0.]]

--------------------------------------------完-------------------------------------

########################小**********结###############################

1,二值化之后的数据点都是0或者1,所以叫做二值化。

2,计算方法是,将所有大于threshold的数据都改为1,小于等于threshold的都设为0。

3,经常用于出现某种特征(比如设为1),或者没有出现某种特征(设为0)的应用场合。

#################################################################


5. 独热编码(One-Hot Encoding)

通常,需要处理的数值都是稀疏地,散乱地分布在空间中,但我们并不需要存储这些大数值,这时就需要使用独热编码,独热编码实际上是一种收紧特征向量的工具。

###########对数据集进行独热编码#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[0,2,1,12],
               [1,3,5,3],
               [2,3,2,12],
               [1,2,4,3]]) # 原始数据矩阵 shape=(4,4)

encoder=preprocessing.OneHotEncoder()
encoder.fit(data)
encoded_vector=encoder.transform([[2,3,5,3]]).toarray()
print('one-hot encoded matrix: *********************************')
print(encoded_vector.shape)
print(encoded_vector)

-------------------------------------输---------出--------------------------------

one-hot encoded matrix: *********************************
(1, 11)
[[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]

--------------------------------------------完-------------------------------------

########################小**********结###############################

1,独热编码可以缩小特征向量的维度,将稀疏的,散乱的数据集(比如代码块中的data,shape=(4,4))收缩为11维致密矩阵(如输出结果,shape=(1,11))。

2,编码方式为:根据原始数据集data构建编码器encoder,用编码器来对新数据进行编码。比如,第0列有三个不同值(0,1,2),故而有三个维度,即0=100,1=010,2=001;同理,第1列有两个不同值(2,3),故而只有两个维度,即2=10,3=01;同理,第2列有四个不同值(1,5,2,4),故而有四个维度,即1=1000,2=0100,4=0010,5=0001同理,第3列有两个不同值(3,12),故而只有两个维度,即3=10,12=01。所以在面对新数据[[2,3,5,3]]时,第0列的2就对应于001,第二列的3对应于01,第三列的5对应于0001,第四列的3对应于10,连接起来后就是输出的这个(1,11)矩阵,即为读了编码后的致密矩阵。

3,如果面对的新数据不存在上面的编码器中,比如[[2,3,5,4]]时,4不存在于第3列(只有两个离散值3和12),则输出为00,连接起来后是[[0. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0.]],注意倒数第二个数字变成了0

#################################################################


注:本部分代码已经全部上传到(我的github)上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正...
    LPP27149阅读 384评论 0 3
  • 今天写了5篇文章,我感觉整个人都要崩溃了!上交两篇猫叔布置的作业,一篇创意群文章,一篇理财群感悟,当然还有这篇晨读...
    杨成yc阅读 170评论 7 21
  • 看完七月与安生,我竟然哭了!尤其是最后七月死的时候,或许我们每个人在年少的时候都期待活着安生的样子,有着自己的...
    刘雨婕阅读 217评论 0 0
  • 一直答应自己要改变,可到目前为止,好像除了内心,行为上并没有多大变化。还是会顾虑太多,还是会应允自己不喜欢的事,还...
    初夏清欢阅读 219评论 0 0