美文网首页
preprocessing数据预处理模块

preprocessing数据预处理模块

作者: 马尔代夫Maldives | 来源:发表于2022-03-08 20:26 被阅读0次

https://scikit-learn.org/stable/modules/preprocessing.html

基本预处理步骤:

1.明确有多少特征,哪些是连续型数值特征,哪些是类别特征。
2.检查有没有缺失值,对缺失值选择恰当方式进行弥补,使数据完整。
3.对连续型数值型特征进行标准化,使均值为0,方差为1。
4.对类别型的特征进行one-hot编码。
5.将需要转换成“类别型数据”的“”续型数据连进行二值化。
6.为防止过拟合或者其他原因,选择是否要将数据进行正则化(L1或L2)。
7.查看是否存在样本分布不均衡问题,有则解决。
8.在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。
9.根据实际问题分析是否需要对特征进行相应的函数转换(比如PCA降维)。

本文规定:待处理样本集X(二维矩阵),一列表示一个特征(axis=0),一行表示一个样本(axis=1)
包导入:

import numpy as np
from sklearn import decomposition

# 原始样本数据
X = np.array([[1,-1,2],
              [2,0,0],
              [0,1,-1]])

# 另一个原始样本数据
X_new = 

一、数据标准化

1、标准化(Standardization)或z-score 标准化

定义:将样本集的某一特征调整成均值为0方差为1的标准正态分布。
原因:方差过大的特征会压制方差小的特征,从而导致目标函数无法有效学习这些小方差的特征,标准化以后所有特征的方差都在相同的水平。
公式:x_std = (x - μ)/σ,μ和σ分别是原来某个特征数据序列的均值和标准差。

scale(X, *, axis=0, with_mean=True, with_std=True, copy=True)

功能:对数据集X的列或行分别进行标准化,并返回标准化后的矩阵。
X:数据集(或样本集),一般一列是一个特征,一行是一个样本,(n_samples, m_features)
axis=0:默认沿着列为每一列数据做标准化,axis=1沿着行做标准化;
with_mean:布尔型,True去均值,False不去均值;
with_std:布尔型,True方差标准化,False方差不标准化;
copy:布尔型,True不覆盖原数组,False覆盖原数组;

X_std = preprocessing.scale(X) #对二维矩阵每列进行标准化
print(X_std) #标准化后矩阵
print(np.mean(X_std,axis=0)) #验证每列均值 
print(np.std(X_std,axis=0)) #验证每列标准差
#输出
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]
[0. 0. 0.] #每列均值已经为0
[1. 1. 1.] #每列标准差已经为1

上述scale()函数只返回了标准化后的结果数据,没有保存对应的均值和标准差(方差开根号),实际中很多时候需要利用训练集的均值和标准差对测试集数据进行相同的标准化。preprocessing模块的StandardScaler()类提供了相应方法,他是一个标准化器,不仅可以对原数据进行标准化,还记录了对应的均值和标准差,并可以利用其对新数据做相同的标准化。

StandardScaler(*,copy=True, with_mean=True, with_std=True)

功能:生成一个标准化器,方便保存均值和标准差,并将其用于标准化其他数据。
参数功能与Scale()相同。

my_scaler = preprocessing.StandardScaler()
print(my_scaler)
#输出:
StandardScaler()

#利用标准化器的fit()方法计算X每列的均值(mean_)和标准差
my_scaler.fit(X) (scale_);
print('每列均值:',my_scaler.mean_)
print('每列标准差:',my_scaler.scale_)
#输出:
每列均值: [1.         0.         0.33333333]
每列标准差: [0.81649658 0.81649658 1.24721913]

#利用fit()方法得到的均值和标准差,通过transform()方法将X标准化,返回标准化后的矩阵
X_std = my_scaler.transform(X)
pirnt(X_std )
#输出:
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]

# 将由X计算得到的均值和标准差用于标准化X_new矩阵
X_new_std = my_scaler.transform(X_new)
print(X_new_std)
#输出:
[[-2.44948974  2.44948974  2.13808994]
 [ 2.44948974  1.22474487 -0.26726124]
 [-1.22474487 -3.67423461  0.53452248]
 [ 1.22474487  1.22474487  2.13808994]]

#注意:fit()和transform()方法有先后顺序。
该类同时也提供了一个方法将fit()和transform()结合在一起,即fit_transform()
X_std = my_scaler.fit_transform(X)
print(X_std)
#输出:
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]

# 将变换后的数据反变换回来
X_rebuild = my_scaler.inverse_transform(X_std)
print(X_rebuild)
[[ 1.00000000e+00 -1.00000000e+00  2.00000000e+00]
 [ 2.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 1.11022302e-16  1.00000000e+00 -1.00000000e+00]]

说明:本文以scale()和StandardScaler()进行代码举例,后续方法不再具体举例。可参考其他网页或官网例子。

2、数据区间转换

minmax_scale(X,feature_range=(0, 1), axis=0, copy=True)
将数据在缩放在固定区间,默认缩放到区间 [0, 1]

MinMaxScaler(feature_range=(0, 1),copy=True)
将数据在缩放在固定区间的类,默认缩放到区间 [0, 1],对于方差非常小的属性可以增强其稳定性,维持稀疏矩阵中为0的条目
属性:
min_:ndarray,缩放后的最小值偏移量
scale_:ndarray,缩放比例
data_min_:ndarray,数据最小值
data_max_:ndarray,数据最大值
data_range_:ndarray,数据最大最小范围的长度

3、最大绝对值数据区间转换

maxabs_scale(X,axis=0, copy=True)
数据的缩放比例为绝对值最大值,并保留正负号,即在区间 [-1.0, 1.0] 内。唯一可用于稀疏数据 scipy.sparse的标准化

MaxAbsScaler(copy=True)
数据的缩放比例为绝对值最大值,并保留正负号,即在区间 [-1.0, 1.0] 内。可以用于稀疏数据scipy.sparse
属性:
scale_:ndarray,缩放比例
max_abs_:ndarray,绝对值最大值
n_samples_seen_:int,已处理的样本个数

4、IQR标准化数据数据区间转换

robust_scale(X,axis=0, with_centering=True, with_scaling=True,copy=True)
通过 Interquartile Range (IQR) 标准化数据,即四分之一和四分之三分位点之间

RobustScaler(with_centering=True,with_scaling=True, copy=True)
通过 Interquartile Range (IQR) 标准化数据,即四分之一和四分之三分位点之间
属性:
center_:ndarray,中心点
scale_:ndarray,缩放比例

5、核数据标准化

KernelCenterer()
生成 kernel 矩阵,用于将 svm kernel 的数据标准化(参考资料不全)。

说明:

以上几个标准化类基本都含有以下几类方法:
fit(X[,y]):根据数据 X 值,计算相关中间参数并存储在类对象中
transform(X[,y, copy]):根据fit()计算得到的参数对X(也可以是其他数组)进行相应处理并返回结果X_t
fit_transform(X[, y]):将前面两个独立方法合并在一起,并返回结果X_t
partial_fit(X[,y]):累加性的计算缩放比例
inverse_transform(X_t[,copy]):将变换后的结果X_t恢复到原数据,理论上结果就是X。
get_params([deep]):获取参数
set_params(params)**:设置参数

二、数据正则化

normalize(X,norm='l2', axis=1, copy=True)
将数据正则化到区间 [0, 1],norm 可取值 'l1'、'l2'、'max'。可用于稀疏数据 scipy.sparse
Normalizer(norm='l2', copy=True)
数据正则化类。可用于稀疏数据 scipy.sparse
方法:fit(X[,y])、transform(X[, y,copy])、fit_transform(X[,y])、get_params([deep])、set_params(**params)

三、数据二值化

binarize(X,threshold=0.0, copy=True)
将数据转化为 0 和 1,其中小于等于 threshold 为 0,可用于稀疏数据 scipy.sparse
Binarizer(threshold=0.0,copy=True)
二值化处理的类,可用于稀疏数据 scipy.sparse
方法:fit(X[,y])、transform(X[, y,copy])、fit_transform(X[,y])、get_params([deep])、set_params(**params),其中fit 函数不会做任何操作

四、类别数据编码

数据的某些特征是文本,特征是无序的,比如国籍,但数字是有序的,所以不能直接用数字编码。

OneHotEncoder(n_values='auto',categorical_features='all', dtype='float', sparse=True,handle_unknown='error')
将具有多个类别的特征转换为多维二元特征,所有二元特征互斥,当某个二元特征为 1 时,表示取某个类别
参数:
n_values:处理的类别个数,可以为‘auto’,int或者 int数组
categorical_features:被当作类别来处理的特征,可以为“all”或者下标数组指定或者mask数组指定
属性:
active_features_:ndarray,实际处理的类别数
feature_indices_:ndarray,第 i个原特征在转换后的特征中的下标在 feature_indices_[i] 和 feature_indices_[i+1]之间
n_values_:ndarray,每维的类别数
方法:fit(X[, y])、transform(X[, y,copy])、fit_transform(X[,y])、get_params([deep])、set_params(**params)

LabelBinarizer(neg_label=0, pos_label=1,sparse_output=False)
和 OneHotEncoder 类似,将类别特征转换为多维二元特征,并将每个特征扩展成用一维表示
属性:
classes:ndarry,所有类别的值
y_type_:str
multilabel_:bool
sparse_input_:bool
indicator_matrix_:str
方法:fit(X[,y])、transform(X[, y,copy])、fit_transform(X[,y])、inverse_transform(y)、get_params([deep])、set_params(**params)

label_binarize(y,classes, neg_label=0, pos_label=1, sparse_output=False)
LabelBinarizer 类对应的处理函数

LabelEncoder
将类别特征标记为 0 到 n_classes - 1 的数
方法:fit(X[,y])、transform(X[, y,copy])、fit_transform(X[,y])、inverse_transform(y)、get_params([deep])、set_params(**params)

MultiLabelBinarizer(classes=None,sparse_output=False)
和 LabelBinarizer 类似

五、数据缺失处理

Imputer(missing_values='NaN',strategy='mean', axis=0, verbose=0, copy=True)
参数:
missing_values:int 或者“NaN”,对np.nan的值用 "NaN"
strategy:"mean"、"median"、"most_frequent"
属性:
statistics_:ndarray,当axis==0时,取每列填补时用的值
方法:fit(X[,y])、transform(X[, y,copy])、fit_transform(X[,y])、get_params([deep])、set_params(**params)

六、生成多项式数据

可以将数据多项式结合生成多维特征,比如 [a,b] 的二次多项式特征为 [1, a, b, a^2, ab, b^2]

PolynomialFeatures(degree=2,interaction_only=False, include_bias=True)
参数:
degree:int,多项式次数
interaction_only:boolean,是否只产生交叉相乘的特征
include_bias:boolean,是否包含偏移列,即全为1 的列
属性:
powers_:ndarray,二维数组。powers_[i,j] 表示第 i 维输出中包含的第 j 维输入的次数
n_input_features_:int,输入维数
n_output_features_:int,输出维数
方法:fit(X[,y])、transform(X[, y,copy])、fit_transform(X[,y])、get_params([deep])、set_params(**params)

七、增加伪特征

add_dummy_feature(X,value=1.0)
在 X 的第一列插入值为 value 的列

八、自定义数据转换

可以使用自定义的 python函数来转换数据

FunctionTransformer(func=None,validate=True, accept_sparse=False, pass_y=False)
方法:fit(X[,y])、transform(X[, y,copy])、fit_transform(X[,y])、get_params([deep])、set_params(**params)

相关文章

网友评论

      本文标题:preprocessing数据预处理模块

      本文链接:https://www.haomeiwen.com/subject/lcqarrtx.html