sklearn中的数据预处理

一般来说,当我们拿到原始数据的时候,需要进行一些数据预处理,使得数据更符合模型的需求。

我这里用的sklearn版本是0.19.0,别的版本可能略有不同。

4.3 Preprocessing data 数据预处理

4.3.1 标准化

数据集的标准化对scikit-learn中的大多数机器学习算法来说是常见的要求。
下面举例(官网例子),将数据缩放为0均值和单位方差。并将缩放规则记录下来,并作用在测试集上。

# -*- coding: utf-8 -*-

from sklearn import preprocessing
import numpy as np

# sklearn官网的4.3.1
# 概率模型(树形模型)不需要进行归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。如,决策树和随机森林。
# 而像Adaboost,SVM,LR,Knn,KMeans之类的最优化问题就需要进行归一化。
X_train = np.array([[1., -1.,  2.],
                    [2.,  0.,  0.],
                    [0.,  1., -1.]])
# with_mean=True, with_std=True这两个参数可以设置是否将数据标准化到0均值,是否是单位方差(1)
X_scaled = preprocessing.scale(X_train)
# 缩放数据
print(X_scaled)
# 缩放后的数据具有0均值
print(X_scaled.mean(axis=0))
# 缩放后的数据具有标准方差
print(X_scaled.std(axis=0))
# 记录下来这个变换规则,方便在测试集上可以进行同样的变换。
scaler = preprocessing.StandardScaler().fit(X_train)
print(scaler)
print(scaler.mean_)
print(scaler.scale_)
print(scaler.transform(X_train))
# 将相同的变换作用在测试集上
X_test = [[-1., 1., 0.]]
print(scaler.transform(X_test))

将数据集缩放在指定的范围内,并将同样的缩放规则作用在测试集上。

# -*- coding: utf-8 -*-

from sklearn import preprocessing
import numpy as np

X_train = np.array([[1., -1.,  2.],
                    [2.,  0.,  0.],
                    [0.,  1., -1.]])
# 将数据缩放到你想要的范围之内
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
X_train_minmax = min_max_scaler.fit_transform(X_train)
print(X_train_minmax)
# 将同样的缩放使用在测试集
X_test = np.array([[-3., -1.,  4.]])
X_test_minmax = min_max_scaler.transform(X_test)
print(X_test_minmax)
print(min_max_scaler.scale_)
print(min_max_scaler.min_)

X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
# 这个估计值对每个特征进行单独的缩放和转换,使训练集中每个特征的最大绝对值为1.0。
# 它不会移动/中心数据,因此不会破坏任何稀疏性。
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
print(X_train_maxabs)
X_test = np.array([[ -3., -1.,  4.]])
X_test_maxabs = max_abs_scaler.transform(X_test)
print(X_test_maxabs)
print(max_abs_scaler.scale_)

4.3.2 非线性转换
# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
import numpy as np


iris = load_iris()
X, y = iris.data, iris.target
# 这里可以关注一下,人为划分训练集和测试集,还不如直接调用这个train_test_split更方便
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
quantile_transformer = preprocessing.QuantileTransformer(random_state=0)
X_train_trans = quantile_transformer.fit_transform(X_train)
X_test_trans = quantile_transformer.transform(X_test)
print(np.percentile(X_train[:, 0], [0, 25, 50, 75, 100]))
print(np.percentile(X_train_trans[:, 0], [0, 25, 50, 75, 100]))
print(np.percentile(X_test[:, 0], [0, 25, 50, 75, 100]))
print(np.percentile(X_test_trans[:, 0], [0, 25, 50, 75, 100]))

4.3.3 归一化

归一化 是 缩放单个样本以具有单位范数 的过程。

# -*- coding: utf-8 -*-

from sklearn import preprocessing

X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
     [ 0.,  1., -1.]]
X_normalized = preprocessing.normalize(X, norm='l2')
print(X_normalized)
normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
print(normalizer)
print(normalizer.transform(X))
print(normalizer.transform([[-1.,  1., 0.]]))
4.3.4 二值化

特征二值化是将数值特征用阈值过滤得到布尔值的过程。大于阈值为1,小于阈值为0.

# -*- coding: utf-8 -*-

from sklearn import preprocessing
# 将特征转换成二值化

X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
     [ 0.,  1., -1.]]

binarizer = preprocessing.Binarizer().fit(X)  # fit does nothing
print(binarizer)
print(binarizer.transform(X))

binarizer = preprocessing.Binarizer(threshold=1.1)
print(binarizer.transform(X))

4.3.5 分类特征编码

在机器学习中,特征经常不是数值型的而是分类型的。比如,性别,男性女性表示为0和1.比如国家,中国,美国,英国,法国,日本,瑞士,表示为0,1,2,3,4,5这些分类其实是并列的,当时当我们在用某个数值来表示的时候模型会认为我们的数值是有大小的,但是我们并不希望这样。

# -*- coding: utf-8 -*-

from sklearn import preprocessing
# one-of-K或one-hot编码

enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
print(enc.transform([[0, 1, 3]]).toarray())

enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4])
# 注意到第二、三个特征是不全的
# features
enc.fit([[1, 2, 3], [0, 2, 0]])
print(enc.transform([[1, 0, 0]]).toarray())

4.3.6 缺失值补全

这个是我之前没有想到的,sklearn中还有一些简单的缺失值补全的功能。有缺失值的数据,算法是不能直接用的,所以在这之前必须进行缺失值补全。

# -*- coding: utf-8 -*-

import numpy as np
from sklearn.preprocessing import Imputer

# 缺失值所在的行/列中的平均值、中位数或者众数来填充
# axis=0表示列1表示行
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])

X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))

# 同时也支持稀疏矩阵
# 缺失值被编码为0
import scipy.sparse as sp
X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit(X)

X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
print(imp.transform(X_test))

4.3.7 生成多项式特征

这一部分其实也是挺有用的,也是我之前并没有注意到的,就是说当我们的特征数量比较少的时候,我们可以进行一些多项式的运算扩充几个属性。

# -*- coding: utf-8 -*-

import numpy as np
from sklearn.preprocessing import PolynomialFeatures

# 通过增加一些输入数据的非线性特征来增加模型的复杂度通常是有效的

X = np.arange(6).reshape(3, 2)
print(X)

poly = PolynomialFeatures(2)
print(poly.fit_transform(X))
# X 的特征已经从 (X_1, X_2) 转换为 (1, X_1, X_2, X_1^2, X_1*X_2, X_2^2)。
# ---------------------------------------------------------------------------------------------

X = np.arange(9).reshape(3, 3)
print(X)

poly = PolynomialFeatures(degree=3, interaction_only=True)
print(poly.fit_transform(X))
# 特征从(X_1, X_2, X_3) 转换为 (1, X_1, X_2, X_3, X_1*X_2, X_1*X_3, X_28X_3, X_1*X_2*X_3) 。
# ------------------------------------------------------------------------------------

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

推荐阅读更多精彩内容