需要源码和PPT请点赞关注收藏后评论区留言私信~~~
scikit-learn提供的数据预处理相关的功能如下图
1. 数据标准化、平均去除和方差缩放
sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)
数据的标准化、方差和标准差求解示例
例4-41 数据的标准化、均值和标准差求解。P-128 Preprocessing模块还提供了一个实用程序类StandardScaler。 例4-42 数据的标准化计算
代码如下
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -2., 1.5],[ 2.2, 1.3, 0.5],[ 0.3, 1., -1.5]])
X_scaled = preprocessing.scale(X_train)
print('X_train:\n',X_train)
print('X_scaled:\n',X_scaled)
print('均值:',X_scaled.mean(axis=0))
print('单位方差:',X_scaled.std(axis=0))
2. 特征缩放
另一种标准化是特征缩放,使其介于给定的最小最大值之间,通常是0-1之间,或者使每个特征的最大绝对值被缩放当单位大小
1)一般特征值缩放 sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True) min_max_scaler=preprocessing.minmax_scale() X_train_minmax=min_max_scaler.fit_transform(X_train) min_max_scaler.transform(X_test)
数据的缩放示例
代码如下
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)
print('原数据:\n',X_train)
print('归一化:\n',X_train_minmax)
X_test = np.array([[-3., -1., 4.]])
X_test_minmax = min_max_scaler.transform(X_test)
print('测试数据:',X_test)
print('归一化的测试数据:\n',X_test_minmax)
print('',min_max_scaler.scale_)
print('',min_max_scaler.min_)
利用MaxAbsScaler将数据归一化
X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
max_Abs_scaler = preprocessing.MaxAbsScaler()
X_train_minmax = max_Abs_scaler.fit_transform(X_train)
print('原数据:\n',X_train)
print('归一化:\n',X_train_minmax)
X_test = np.array([[-3., -1., 4.]])
X_test_maxAbs = max_Abs_scaler.transform(X_test)
print('测试数据:',X_test)
print('归一化的测试数据:',X_test_maxAbs)
(2)缩放稀疏数据 将稀疏数据居中会破坏数据中的稀疏结构,但是缩放稀疏矩阵又是有意义的,特别是当特征处于不同的缩放比例
MaxAbsScaler和maxabs_scale适用于缩放稀疏数据
(3)带异常值的缩放数据 如果您的数据包含许多异常值,则使用数据的平均值和方差进行缩放可能不会很好地工作
在这种情况下 可以使用robust_scal和RobustScaler作为替代 它们对数据的中心和范围使用了更可靠的估计
3. 非线性变换
非线性变换有分位数转换和幂转换。分位数变换和幂变换都是基于特征的单调变换,从而保持每个特征值的秩。分位数变换将所有特征置于相同的期望分布中。幂变换是一类参数变换,其目的是将数据从任意分布映射到接近高斯分布的位置
(1)映射到均匀分布 QuantileTransformer()和QuantileTransform提供非参数转换,将数据映射到0~1的均匀分布
数据映射到值介于0和1之间的均匀分布
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
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]))
(2)映射到高斯分布
将数据映射到尽可能接近高斯分布,以稳定方差和最小化偏度。 使用Box-cox变换将对数正态分布绘制的样本映射到正态分布示例
使用Box-Cox将从对数正态分布绘制的样本映射到正态分布的示例
pt = preprocessing.PowerTransformer(method='box-cox', standardize=False)
X_lognormal = np.random.RandomState(616).lognormal(size=(3, 3))
print(X_lognormal)
T=pt.fit_transform(X_lognormal)
print(T)
使用QuantileTransformer方法进行数据映射
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
quantile_transformer = preprocessing.QuantileTransformer(output_distribution='normal', random_state=0)
X_trans = quantile_transformer.fit_transform(X)
quantile_transformer.quantiles_
4. 正则化
将单个样本缩放到单位范数(每个样本的范数为1)
如果计划使用点积或任何其他核的二次形式来量化任意一对样本的相似性,则此过程可能会很有用
Preprocessing.normalize(X,norm=‘l2’)
数据正态化示例
X = [[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]]
X_normalized = preprocessing.normalize(X, norm='l2')
X_normalized
5. 编码分类特征
将分类功能转换为整数代码,如将颜色【black,gray,white】颜色特性转换为整数编码
使用OrdinalEncoder将每个范畴特征转换为整数
Preprocessing.OrdinalEncoder()
数据编码示例
enc = preprocessing.OrdinalEncoder()
X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
enc.fit(X)
enc.transform([['female', 'from US', 'uses Safari']])
6.数据离散化与二值化
离散化提供了一种将连续特征划分为离散值的过程
(1)K-桶离散化 将特征离散化到K个桶中(KBinsDiscretizer)
数据的K-桶离散化示例
X = np.array([[ -3., 5., 15 ],[ 0., 6., 14 ],[ 6., 3., 11 ]])
est = preprocessing.KBinsDiscretizer(n_bins=[3, 2, 2], encode='ordinal').fit(X)
est.transform(X)
(2)特征二值化 对数字特征进行阈值化以获得布尔值的过程
数据的二值化示例
X = [[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]]
binarizer = preprocessing.Binarizer().fit(X)
Y1=binarizer.transform(X)
print(Y1)
# 可以调整阈值
binarizer = preprocessing.Binarizer(threshold=1.1)
Y2=binarizer.transform(X)
print(Y2)
使用OneHotEncoder进行分类特征编码示例
enc = preprocessing.OneHotEncoder()
X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
enc.fit(X)
R=enc.transform([['female', 'from US', 'uses Safari'],['male', 'from Europe', 'uses Safari']]).toarray()
display(R)
创作不易 觉得有帮助请点赞关注收藏~~~