当前位置:   article > 正文

python——机器学习:sklearn数据预处理preprocessing标准化、归一化和纠偏_python的preprocesing

python的preprocesing

前言

        前段时间参加了一个数据建模比赛,机器学习部分主要是应用python的sklearn库,现整理一下自己当时的复习内容。
        整个数据建模的第一部分也是最主要的部分是数据预处理。其常规顺序(不一定全需要做)为:处理离群值、处理缺失值、标准化或归一化、纠偏、连续特征离散化、类别特征编码、特征增强和对不平衡数据集的处理(仅针对分类问题)。本篇是数据预处理中的数据标准化或归一化和纠偏部分。

准备一份数据

练习使用方便起见,使用sklearn的datasets模块中的红酒数据。

import sklearn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 用于在notebook直接显示图片
%matplotlib inline

from sklearn import datasets
# 加载数据
data = datasets.load_wine()
# 提取自变量和响应变量
X, y = data.data, data.target
print(X.shape, y.shape)
#输出:(178, 13) (178,)

# 查看前两条自变量
X[:2]
#输出:
#array([[1.423e+01, 1.710e+00, 2.430e+00, 1.560e+01, 1.270e+02, 2.800e+00,
#        3.060e+00, 2.800e-01, 2.290e+00, 5.640e+00, 1.040e+00, 3.920e+00,
#        1.065e+03],
#       [1.320e+01, 1.780e+00, 2.140e+00, #1.120e+01, 1.000e+02, 2.650e+00,
#        2.760e+00, 2.600e-01, 1.280e+00, #4.380e+00, 1.050e+00, 3.400e+00,
#        1.050e+03]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

数据预处理:数据标准化、归一化和纠偏

1. 标准化 StandardScaler

最基本的处理方式。公式为:
z = (x - u) / s
其中,u为均值,s为标准差。

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
## 个人觉得统一使用先fit,再transform的方式比直接使用fit_transform()实用。方便在实际建模时,以同样的方式处理训练集和预测集的数据
ss.fit(X)
X_ss = ss.transform(X)
  • 1
  • 2
  • 3
  • 4
  • 5

通过画图对比一下处理前后的结果

X_df = pd.DataFrame(X)
X_ss_df = pd.DataFrame(X_ss)
# 画出处理前的变量分布直方图(只画了前四个)
plt.figure(figsize=(10,3))
for i in range(1,5):
    plt.subplot(1,4,i)
    plt.hist(X_df[i-1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

原数据

# 画出标准化处理后的变量分布直方图(只画了前四个)
plt.figure(figsize=(10,3))
for i in range(1,5):
    plt.subplot(1,4,i)
    plt.hist(X_ss_df[i-1])
  • 1
  • 2
  • 3
  • 4
  • 5

标准化处理后

2. RobustScaler标准化

会消除一些异常值的影响,实际使用中效果比较好。
公式为:
z = (x - m) / IQR
其中,m为中位数,IQR为四分位距,即第三四分位数和第一四分位数之差。

from sklearn.preprocessing import RobustScaler
rs = RobustScaler()
rs.fit(X)
X_rs = rs.transform(X)
# 查看处理后的分布
X_rs_df = pd.DataFrame(X_rs)
plt.figure(figsize=(10,3))
for i in range(1,5):
    plt.subplot(1,4,i)
    plt.hist(X_rs_df[i-1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

RobustScaler处理

3. 归一化 MinMaxScaler、MaxAbsScaler

注意区别标准化和归一化。归一化是把自变量转换到[0,1]或[-1,1]之间。
最小最大值标准化 MinMaxScaler 把自变量转换到[0,1]之间。
公式为:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

from sklearn.preprocessing import MinMaxScaler,MaxAbsScaler
ms = MinMaxScaler()
ms.fit(X)
X_ms = ms.transform(X)
# 查看处理后结果
X_ms_df = pd.DataFrame(X_ms)
plt.figure(figsize=(10,3))
for i in range(1,5):
    plt.subplot(1,4,i)
    plt.hist(X_ms_df[i-1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

归一化
类似的,绝对值最大标准化MaxAbsScaler,将数据转换到[-1,1]之间。
公式为:
X_std = X / X.max(axis=0)

4. 有偏分布数据转换为正态分布 PowerTransformer

当用hist画图后,发现自变量或响应变量变量分布很集中时,可以视需求进行正态分布的转换。

from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='box-cox',standardize=False)
## 参数:method:
# 'yeo-johnson' : works with positive and negative values(对需转换的值为正数、负数时均适用)
# 'box-cox' : only works with strictly positive values(只适用于需转换的值为正数的情况)
## 参数:standardize:
# True时转化成均值为0,方差为1的标准正态
pt.fit(X)
X_pt = pt.transform(X)
# 查看处理后的分布
X_pt_df = pd.DataFrame(X_pt)
plt.figure(figsize=(10,3))
for i in range(1,5):
    plt.subplot(1,4,i)
    plt.hist(X_pt_df[i-1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

PowerTransformer
可以明显看出,第二个变量由长尾分布转为了正态分布。

5. 自定义特征转换函数 FunctionTransformer

例如进行log转换。
np.log1p = log(x+1), 是一种常用的纠偏方法。

ft_lg = FunctionTransformer(np.log1p) 
ft_lg.fit(X) 
X_ft = ft_lg.transform(X)
# 查看处理后的分布
X_ft_df = pd.DataFrame(X_ft)
  • 1
  • 2
  • 3
  • 4
  • 5

log1p

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/148161
推荐阅读
相关标签
  

闽ICP备14008679号