机器学习中的数据标准化

Posted vvingerfly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习中的数据标准化相关的知识,希望对你有一定的参考价值。

标准化方法

Z-score Normalization

Z-score normalization又叫?standardization(规范化),将特征进行缩放使得其具有均值为0,方差为1的标准正态分布的特性。
[ z = frac{x-mu}{sigma} ]
其中均值(mu = frac{1}{N} sum_{i=1}^N (x_i)),方差(sigma = sqrt{frac{1}{N} sum_{i=1}^N (x_i - mu)^2})

标准化特征使其具有0均值1方差不仅对于比较单位不同的测量有用,而且还是众多机器学习算法的普遍要求。如果特征在不同的尺度下,不同的权重更新的速率会差异很大,不利于算法的收敛。

Mix-max Normalization

另一种常用的标准化叫Mix-max normalization,通常被简称为normalization(标准化)。这种方法将数据放缩到一个固定的区间,通常是0到1之间。

[ z = frac{x-min{(x)}}{max{(x)}-min{(x)}} ]

Constant Normalization

将数据除以一个固定的常数,比如最大值:
[ z = frac{x}{max{(|x|)}} ]

Binary Encoding

类别值(Categorical values)例如性别可以编码为0和1,如男性为1,女性为0,也可以编码为-1和1.

Manhattan Encoding

如果是不能二进制编码的类别值,可以使用曼哈顿编码Manhattan encoding,使用0或1来表示特征是否被包含:

例如:在宗教类别中,可以将穆斯林(Muslim)、印度教(Hindu)和基督教(Christian)分别编码为 [1 0 0][0 1 0][0 0 1]

示例代码

代码参考自About Feature Scaling and Normalization

import pandas as pd
import numpy as np

df = pd.io.parsers.read_csv(
    'https://raw.githubusercontent.com/rasbt/pattern_classification/master/data/wine_data.csv',
     header=None,
     usecols=[0,1,2]
    )
df.columns=['Class label', 'Alcohol', 'Malic acid']
df.head()


from sklearn import preprocessing

# Compute the mean and std to be used for later scaling.
std_scale = preprocessing.StandardScaler().fit(df[['Alcohol', 'Malic acid']]) 
# Perform standardization by centering and scaling
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('Mean after standardization:
Alcohol={:.2f}, Malic acid={:.2f}'
      .format(df_std[:,0].mean(), df_std[:,1].mean()))
print('
Standard deviation after standardization:
Alcohol={:.2f}, Malic acid={:.2f}'
      .format(df_std[:,0].std(), df_std[:,1].std()))


print('
Min-value after min-max scaling:
Alcohol={:.2f}, Malic acid={:.2f}'
      .format(df_minmax[:,0].min(), df_minmax[:,1].min()))
print('Max-value after min-max scaling:
Alcohol={:.2f}, Malic acid={:.2f}'
      .format(df_minmax[:,0].max(), df_minmax[:,1].max()))


from sys import platform as _platform
if _platform == "darwin":
    import matplotlib
    matplotlib.use('TkAgg')
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()

结果

技术图片

Reference

以上是关于机器学习中的数据标准化的主要内容,如果未能解决你的问题,请参考以下文章

《机器学习实战》中的splitDataSet函数

机器学习中的数据标准化

《Python机器学习及实践》----监督学习经典模型

《Python机器学习及实践》----监督学习经典模型

《Python机器学习及实践》----模型实用技巧

《Python机器学习及实践》----模型实用技巧