「Python 数据处理基础」数据特征处理标准化和归一化应用

2021年6月20日 6点热度 0条评论 来源: Mr数据杨

文章目录

内容介绍

数据标准化 :是使数据落入同一范围,是一种常用的数据预处理操作。目的是处理不同比例和维度的数据,以便可以将其缩放到相同的数据间隔和范围,从而减少比例,特征和分布差异对模型的影响。除了用于模型计算之外,标准化数据还具有直接计算和生成复合指标的含义,这是对指标进行加权的必要步骤。

标准化&归一化

数据标准化

同样我们都需要对原始数据进行处理,少不了的就是 standardization (或者叫做 Z-score normalization),要求 均值 μ=0标准差 σ=1

数据归一化

另一种方法叫做 Min-Max scaling (或者叫做 "normalization"也就是我们常说的0-1归一化)。处理后的所有特征的值都会被压缩到 0到1区间上.这样做还可以抑制离群值对结果的影响。

红酒数据集进行标准化&归一化

import pandas as pd
import numpy as np

df = pd.read_excel('data/wine_data.xlsx') #葡萄酒数据集
df.head()

# 选取指定字段
# 在数据中,Alcohol和Malic acid 衡量的标准应该是不同的,特征之间数值差异较大
df[['Class label', 'Alcohol', 'Malic acid']]

# 标准化和归一化实现
from sklearn import preprocessing

std_scale = preprocessing.StandardScaler().fit(df[['Alcohol', 'Malic acid']])
df_std = std_scale.transform(df[['Alcohol', 'Malic acid']])

minmax_scale = preprocessing.MinMaxScaler().fit(df[['Alcohol', 'Malic acid']])
df_minmax = minmax_scale.transform(df[['Alcohol', 'Malic acid']])

print('标准化后:Alcohol={:.2f}, Malic acid={:.2f}'.format(df_std[:,0].mean(), df_std[:,1].mean()))
print('\n标准化后的标准差:Alcohol={:.2f}, Malic acid={:.2f}'.format(df_std[:,0].std(), df_std[:,1].std()))

>>> 标准化后:Alcohol=-0.00, Malic acid=-0.00
>>> 标准化后的标准差:Alcohol=1.00, Malic acid=1.00

print('归一化后的最小值:Alcohol={:.2f}, Malic acid={:.2f}'
      .format(df_minmax[:,0].min(), df_minmax[:,1].min()))
print('\n归一化后的最大值:Alcohol={:.2f}, Malic acid={:.2f}'
      .format(df_minmax[:,0].max(), df_minmax[:,1].max()))

>>> 归一化后的最小值:Alcohol=0.00, Malic acid=0.00
>>> 归一化后的最大值:Alcohol=1.00, Malic acid=1.00

# 数据可视化
from matplotlib import pyplot as plt

def plot():
    plt.figure(figsize=(8,6))
    # 绿色表示原始数据
    plt.scatter(df['Alcohol'], df['Malic acid'], color='green', label='input scale', alpha=0.5)
    # 红色表示标准化后数据
    plt.scatter(df_std[:,0], df_std[:,1], color='red', label='Standardized [$N (\mu=0, \; \sigma=1)$]', alpha=0.3)
    # 蓝色表示归一化后数据
    plt.scatter(df_minmax[:,0], df_minmax[:,1], color='blue', label='min-max scaled [min=0, max=1]', alpha=0.3)

    plt.title('Alcohol and Malic Acid content of the wine dataset')
    plt.xlabel('Alcohol')
    plt.ylabel('Malic Acid')
    plt.legend(loc='upper left')
    plt.grid()
    plt.tight_layout()

plot()
plt.show()


# 我们将原始的和变换后都放到了同一个图上,观察下结果吧!接下来我们再看看数据是否被打乱了呢?

fig, ax = plt.subplots(3, figsize=(6,14))

for a,d,l in zip(range(len(ax)), 
               (df[['Alcohol', 'Malic acid']].values, df_std, df_minmax),
               ('Input scale', 
                'Standardized [$N (\mu=0, \; \sigma=1)$]', 
                'min-max scaled [min=0, max=1]')
                ):
    for i,c in zip(range(1,4), ('red', 'blue', 'green')):
        ax[a].scatter(d[df['Class label'].values == i, 0], 
                  d[df['Class label'].values == i, 1],
                  alpha=0.5,
                  color=c,
                  label='Class %s' %i
                  )
    ax[a].set_title(l)
    ax[a].set_xlabel('Alcohol')
    ax[a].set_ylabel('Malic Acid')
    ax[a].legend(loc='upper left')
    ax[a].grid()
    
plt.tight_layout()

plt.show()


在机器学习中,如果我们对训练集做了上述处理,那么同样的对测试集也必须要经过相同的处理。

std_scale = preprocessing.StandardScaler().fit(X_train)
X_train = std_scale.transform(X_train)
X_test = std_scale.transform(X_test)

标准化处理对PCA主成分分析的影响

# 主成分分析(PCA)和一个非常有用的套路,接下来,咱们来看看数据经过标准化处理和未经标准化处理后使用PCA的效果。

import pandas as pd

df = pd.read_excel('data/wine_data.xlsx') #葡萄酒数据集
df.head()

# 将数据集划分为单独的训练和测试数据集
# 将随机将葡萄酒数据集分为训练数据集和测试数据集,其中训练数据集包含70%的样本,测试数据集包含30%的样本。

from sklearn.model_selection import train_test_split

X_wine = df.values[:,1:]
y_wine = df.values[:,0]

X_train, X_test, y_train, y_test = train_test_split(X_wine, y_wine,
    test_size=0.30, random_state=12345)

# 标准化处理数据
from sklearn import preprocessing

std_scale = preprocessing.StandardScaler().fit(X_train)
X_train_std = std_scale.transform(X_train)
X_test_std = std_scale.transform(X_test)

# 使用PCA进行降维
# 在标准化和非标准化数据集上执行PCA,将数据集转换成二维特征子空间。

from sklearn.decomposition import PCA

# 非标准化数据
pca = PCA(n_components=2).fit(X_train)
X_train = pca.transform(X_train)
X_test = pca.transform(X_test)


# 标准化数据
pca_std = PCA(n_components=2).fit(X_train_std)
X_train_std = pca_std.transform(X_train_std)
X_test_std = pca_std.transform(X_test_std)

from matplotlib import pyplot as plt

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10,4))


for l,c,m in zip(range(1,4), ('blue', 'red', 'green'), ('^', 's', 'o')):
    ax1.scatter(X_train[y_train==l, 0], X_train[y_train==l, 1],
        color=c, 
        label='class %s' %l, 
        alpha=0.5,
        marker=m
        )

for l,c,m in zip(range(1,4), ('blue', 'red', 'green'), ('^', 's', 'o')):
    ax2.scatter(X_train_std[y_train==l, 0], X_train_std[y_train==l, 1],
        color=c, 
        label='class %s' %l, 
        alpha=0.5,
        marker=m
        )

ax1.set_title('Transformed NON-standardized training dataset after PCA')    
ax2.set_title('Transformed standardized training dataset after PCA')    
    
for ax in (ax1, ax2):

    ax.set_xlabel('1st principal component')
    ax.set_ylabel('2nd principal component')
    ax.legend(loc='upper right')
    ax.grid()
plt.tight_layout()

plt.show()  

直观上,可以清晰的看到经过标准化的数据可分性更强的。

    原文作者:Mr数据杨
    原文地址: https://blog.csdn.net/qq_20288327/article/details/118065841
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。