如果原始数据不服从高斯分布,在预测时表现可能不好。在实践中,我们经常进行标准化(z-score 特征减去均值/标准差)。
1.1 标准正态分布(均值为0,方差为1) Scale函数的使用 对列进行z-score
from sklearn import preprocessing
import numpy as np
#1、数据标准化
X = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
X_scaled = preprocessing.scale(X)
X_scaled
"""
输出标准化的结果:
array([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
"""
X_scaled.mean(axis=0) #用于计算均值和标准偏差的轴。如果为0,独立规范每个特征,否则(如果为1)标准化每个样品。
"""
输出归一化后的均值:
array([ 0., 0., 0.])
"""
X_scaled.std(axis=0)
"""
输出标准化后的标准差:
array([ 1., 1., 1.])
"""
1.2 预处理模块StandardScaler
其实现Transformer API以计算训练集上的平均值和标准偏差,以便以后能够在测试集上重新应用相同的变换。
#StandardScaler()的参数
"""
StandardScaler() 的参数with_mean 默认为True 表示使用密集矩阵,使用稀疏矩阵则会报错 ,with_mean= False 适用于稀疏矩阵
with_std 默认为True 如果为True,则将数据缩放为单位方差(单位标准偏差)
copy 默认为True 如果为False,避免产生一个副本,并执行inplace缩放。 如果数据不是NumPy数组或scipy.sparse CSR矩阵,则仍可能返回副本
"""
scaler = preprocessing.StandardScaler().fit(X)
scaler
"""
输出:
StandardScaler(copy=True, with_mean=True, with_std=True)
"""
#StandardScaler()的属性
scaler.mean_
"""
输出X(原数据)每列的均值:
array([ 1. , 0. , 0.33333333])
"""
scaler.scale_
"""
输出X(原数据)每列的标准差(标准偏差):
array([ 0.81649658, 0.81649658, 1.24721913])
"""
scaler.var_
"""
输出X(原数据)每列的方差:
array([ 0.66666667, 0.66666667, 1.55555556])
"""
#StandardScaler()的方法
scaler.transform(X)
"""
输出X(原数据)标准化(z-score):
rray([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
"""
# StandardScaler().fit(X) 输入数据用于计算以后缩放的平均值和标准差
# StandardScaler().fit_transform(X)输入数据,然后转换它
scaler.get_params() #获取此估计量的参数
"""
输出:
{'copy': True, 'with_mean': True, 'with_std': True}
"""
scaler.inverse_transform(scaler.transform(X))#将标准化后的数据转换成原来的数据
"""
输出:
array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
"""
#scaler.partial_fit(X) 在X缩放以后 在线计算平均值和std
#scaler.set_params(with_mean=False)设置此估计量的参数
"""
#训练集数据 例如缩放到[0-1]
"""
MinMaxScaler 参数feature_range=(0, 1)数据集的分布范围, copy=True 副本
计算公式如下:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
"""
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
X_train_minmax
"""
输出训练集:
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
"""
#测试集数据
X_test = np.array([[ -3., -1., 4.]])
X_test_minmax = min_max_scaler.transform(X_test)
X_test_minmax
"""
输出测试集:
array([[-1.5 , 0. , 1.66666667]])
"""
"""
MaxAbsScaler 通过其最大绝对值来缩放每个特征,范围在[-1,1]。它用于已经以零或稀疏数据为中心的数据,应用于稀疏CSR或CSC矩阵。
X_std = X/每列的最大绝对值
"""
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
X_train_maxabs
"""
输出训练集:
array([[ 0.5, -1. , 1. ],
[ 1. , 0. , 0. ],
[ 0. , 1. , -0.5]])
"""
max_abs_scaler.scale_
"""
输出训练集的缩放数据:
array([ 2., 1., 2.])
"""
X_test = np.array([[ -3., -1., 4.]])
X_test_maxabs = max_abs_scaler.transform(X_test)
X_test_maxabs
"""
输出测试集:
array([[-1.5, -1. , 2. ]])
"""
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
X_normalized = preprocessing.normalize(X, norm='l2')
X_normalized
"""
输出l2归一化:
array([[ 0.40824829, -0.40824829, 0.81649658],
[ 1. , 0. , 0. ],
[ 0. , 0.70710678, -0.70710678]])
"""
预处理模块还提供了一个实用类Normalizer,它使用Transformer API实现相同的操作(其中fit方法无用,因为该操作独立处理样本)。transform(X[, y, copy])将X的每个非零行缩放为单位范数。单独归一化样本为单位标准,具有至少一个非零分量的每个样本(即数据矩阵的每一行)独立于其他样本被重新缩放,使得其范数(l1或l2)等于1。
normalizer = preprocessing.Normalizer(norm='l1').fit(X) # fit 无用
normalizer.transform(X)
"""
输出:
array([[ 0.25, -0.25, 0.5 ],
[ 1. , 0. , 0. ],
[ 0. , 0.5 , -0.5 ]])
"""
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
binarizer = preprocessing.Binarizer().fit(X) # fit does nothing
binarizer
"""
输出:
Binarizer(copy=True, threshold=0.0)
"""
binarizer.transform(X)
"""
输出:
array([[ 1., 0., 1.],
[ 1., 0., 0.],
[ 0., 1., 0.]])
"""
#可以调整二值化器的阈值
binarizer = preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
"""
输出:
array([[ 0., 0., 1.],
[ 1., 0., 0.],
[ 0., 0., 0.]])
"""
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
"""
输出:
OneHotEncoder(categorical_features='all', dtype=,
handle_unknown='error', n_values='auto', sparse=True)
"""
enc.transform([[0, 1, 3]]).toarray()
"""
输出:
array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
"""
"""
默认情况下,每个要素可以自动从数据集中推断出多少值。可以使用参数n_values显式地指定它。
在我们的数据集中有两个性别,三个可能的大陆和四个网络浏览器。然后我们拟合估计器,并变换数据点。
结果:前两个数字编码性别,三个数字的大陆和四个数字的为网络浏览器。
"""
#注意,如果存在训练数据可能缺少分类特征的可能性,则必须显式地设置n_value。例如,
enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4])
#请注意,第2个和第3个特征缺少分类值 第一个特征不缺少(有0,1)
enc.fit([[1, 2, 3], [0, 2, 0]])
"""
输出:
OneHotEncoder(categorical_features='all', dtype=,
handle_unknown='error', n_values=[2, 3, 4], sparse=True)
"""
enc.transform([[1, 0, 0]]).toarray()
"""
输出:
array([[ 0., 1., 1., 0., 0., 1., 0., 0., 0.]])
"""
#以下代码段演示了如何使用包含缺少值的列(轴0)的平均值替换编码为np.nan的缺失值:
import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0) # missing_values:integer/“NaN”, strategy:mean/median/most_frequent
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
"""
输出:
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
"""
X = [[np.nan, 2], [6, np.nan], [7, 6]]
imp.transform(X)
"""
输出:
array([[ 4. , 2. ],
[ 6. , 3.66666667],
[ 7. , 6. ]])
"""
#Imputer类还支持稀疏矩阵:
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)
"""
Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)
"""
X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
imp.transform(X_test)
"""
输出:
array([[ 4. , 2. ],
[ 6. , 3.66666667],
[ 7. , 6. ]])
"""
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(6).reshape(3, 2)
X
"""
输出:
array([[0, 1],
[2, 3],
[4, 5]])
"""
poly = PolynomialFeatures(2)
poly.fit_transform(X)
"""
输出:
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
从X(X_1, X_2) 到X(1, X_1, X_2, X_1^2, X_1X_2, X_2^2).
"""
#在某些情况下,只需要特征之间的交互项,并且可以通过设置获得
X = np.arange(9).reshape(3, 3)
X
"""
输出:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
"""
poly = PolynomialFeatures(degree=3, interaction_only=True)
poly.fit_transform(X)
"""
输出:
array([[ 1., 0., 1., 2., 0., 0., 2., 0.],
[ 1., 3., 4., 5., 12., 15., 20., 60.],
[ 1., 6., 7., 8., 42., 48., 56., 336.]])
从(X_1, X_2, X_3) 到 (1, X_1, X_2, X_3, X_1X_2, X_1X_3, X_2X_3, X_1X_2X_3).
"""
from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(np.log1p)
X = np.array([[0, 1], [2, 3]])
transformer.transform(X)
"""
输出:
array([[ 0. , 0.69314718],
[ 1.09861229, 1.38629436]])
"""