sklearn(一):数据预处理

1 数值型特征处理

1.1 均值移除(mean removal)

对不同样本的同一特征值进行处理,最终均值为0,标准差为1
import numpy as np
from sklearn import preprocessing

# each column is a sample, and features stack vertically
# i.e, here are 4 examples, each one has 3 features.
data = np.array([[3, -1.5, 2, -5.4],
                [0, 4, -0.3, 2.1],
                [1, 3.3, -1.9, -4.3]])

# mean removal
data_standardized = preprocessing.scale(data, axis=1)
print(data_standardized)
print("\nMean = ", data_standardized.mean(axis=1))
print("Std deviation", data_standardized.std(axis=1))

结果为:

[[ 1.05366545 -0.31079341  0.75045237 -1.49332442]
 [-0.8340361   1.46675314 -1.00659529  0.37387825]
 [ 0.51284962  1.31254733 -0.49546489 -1.32993207]]

Mean =  [ -5.55111512e-17  -1.11022302e-16   0.00000000e+00]
Std deviation [ 1.  1.  1.]

1.2 范围缩放(scale)

对不同样本的同一特征值,减去其最大值,除以(最大值-最小值), 最终原最大值为1,原最小值为0

# scaling
data_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_scaler.fit_transform(data)
print(data_scaled)  

结果为:

[[ 1.          0.          1.          0.        ]
 [ 0.          1.          0.41025641  1.        ]
 [ 0.33333333  0.87272727  0.          0.14666667]]

1.3 归一化(normalization)

归一化可以保持数据的正负、比例大小不变,同时可以收缩都范数为1的范围内。

data_normalized_l1 = preprocessing.normalize(data, norm='l1', axis=1)
data_normalized_l2 = preprocessing.normalize(data, norm='l2', axis=1)
print("L1 norm")
print(data_normalized_l1)
print("\n L2 norm")
print(data_normalized_l2)

结果为:

L1 norm
[[ 0.25210084 -0.12605042  0.16806723 -0.45378151]
 [ 0.          0.625      -0.046875    0.328125  ]
 [ 0.0952381   0.31428571 -0.18095238 -0.40952381]]

 L2 norm
[[ 0.45017448 -0.22508724  0.30011632 -0.81031406]
 [ 0.          0.88345221 -0.06625892  0.46381241]
 [ 0.17152381  0.56602858 -0.32589524 -0.73755239]]

1.4 二值化(binarization)

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

data_binarized = preprocessing.Binarizer(threshold=0.4).transform(data)
print("\nBinarized data:")
print(data_binarized)

结果:

Binarized data:
[[ 1.  0.  1.  0.]
 [ 0.  1.  0.  1.]
 [ 1.  1.  0.  0.]]

当然numpy本身就支持condition index(我自己瞎编的词),也可以直接使用下面的代码,效果相同。

(data<0.4).astype(np.int32)

2 非数值型数据编码

2.1 普通编码

将字符串按照(0~n-1)进行编码

label_encoder = preprocessing.LabelEncoder()
input_classes = ['audi', 'ford', 'toyota', 'ford', 'bwm']
label_encoder.fit(input_classes)
print("\nClass mapping:")
for i, item in enumerate(label_encoder.classes_):
    print(item, "-->", i)

编码器:

Class mapping:
audi --> 0
bwm --> 1
ford --> 2
toyota --> 3

对新数据进行编码:

labels = ['toyota', 'ford', 'audi']
encoded_labels = label_encoder.fit_transform(labels)
print("Labels: ", labels)
print("Encoded Labels: ", encoded_labels)

编码结果为:

Labels:  ['toyota', 'ford', 'audi']
Encoded Labels:  [2 1 0]

解码使用inverse_transform即可

encoded_labels = [2, 1, 0, 3, 1]
decoded_labels = label_encoder.inverse_transform(encoded_labels)
print("Encoded Labels: ", encoded_labels)
print("Decoded Labels: ", decoded_labels)

解码结果为:

Encoded Labels:  [2, 1, 0, 3, 1]
Decoded Labels:  ['ford' 'bwm' 'audi' 'toyota' 'bwm']

2.2 独热编码(one hot)

独热编码用于将非structure data进行编码,确保编码后的数据在常见的欧式空间中距离不变。独热编码的详细介绍可以参照这里。这里需要注意,one-hot是按照列进行编码的

data = np.array([[0, 2, 1, 12],
                 [1, 3, 5, 3],
                 [2, 3, 2, 12],
                 [1, 2, 4, 3]])
encoder = preprocessing.OneHotEncoder()
encoder.fit(data)
encoder_vector = encoder.transform([[2, 3, 5, 3]]).toarray()
print(encoder_vector)

结果为:

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

推荐阅读更多精彩内容