sklearn机器学习sklearn

sklearn中的数据预处理

2019-03-22  本文已影响2人  曦宝

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

我这里用的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) 。
# ------------------------------------------------------------------------------------

上一篇下一篇

猜你喜欢

热点阅读