standardize: 用于标准化 2D NumPy 数组中列的函数

一个对 NumPy 数组进行基于列的标准化的函数。

from mlxtend.preprocessing import standardize

概述

标准化(或 Z 分数归一化)的结果是特征将被重新缩放,使其具有标准正态分布的特性,均值为

和标准差为.

其中是均值(平均值),而是与均值的标准差;样本的标准分数(也称为 z 分数)计算为

标准化特征使其以 0 为中心,标准差为 1,这不仅在比较单位不同的测量值时很重要,而且也是许多机器学习算法实现最佳性能的通用要求。

一类不受尺度影响的算法包括基于树的学习算法。我们以通用的 CART 决策树算法为例。不深入探讨信息增益和不纯度度量,我们可以将决策看作是“特征 x_i 是否 >= 某个值?”直观上,我们可以看到这个特征的尺度(厘米、华氏度、标准化尺度——这 really 不重要)确实不重要。

一些特征缩放重要的算法示例包括

  • k 近邻算法,如果希望所有特征贡献相等,则使用欧氏距离度量
  • k-means (见 k 近邻)
  • 逻辑回归、支持向量机、感知器、神经网络等,如果使用基于梯度下降/上升的优化,否则某些权重更新会比其他权重快得多
  • 线性判别分析、主成分分析、核主成分分析,因为要找到最大化方差的方向(在方向/特征向量/主成分正交的约束下);希望特征具有相同的尺度,否则会更强调“较大测量尺度”的变量。

这里可能列出的情况还有很多...我总是建议您思考算法及其作用,然后是否需要缩放特征就通常显而易见了。

此外,我们还需要考虑是“标准化”还是“归一化”(此处指缩放到 [0, 1] 范围)数据。有些算法假设我们的数据以 0 为中心。例如,如果我们使用 tanh 激活单元将小型多层感知器的权重初始化为 0 或以零为中心的小随机值,我们希望“相等地”更新模型权重。作为经验法则,我会说:当不确定时,直接标准化数据,这应该不会有什么坏处。

示例 1 - 标准化 Pandas DataFrame

import pandas as pd

s1 = pd.Series([1, 2, 3, 4, 5, 6], index=(range(6)))
s2 = pd.Series([10, 9, 8, 7, 6, 5], index=(range(6)))
df = pd.DataFrame(s1, columns=['s1'])
df['s2'] = s2
df
s1 s2
0 1 10
1 2 9
2 3 8
3 4 7
4 5 6
5 6 5
from mlxtend.preprocessing import standardize
standardize(df, columns=['s1', 's2'])
s1 s2
0 -1.46385 1.46385
1 -0.87831 0.87831
2 -0.29277 0.29277
3 0.29277 -0.29277
4 0.87831 -0.87831
5 1.46385 -1.46385

示例 2 - 标准化 NumPy 数组

import numpy as np

X = np.array([[1, 10], [2, 9], [3, 8], [4, 7], [5, 6], [6, 5]])
X
array([[ 1, 10],
       [ 2,  9],
       [ 3,  8],
       [ 4,  7],
       [ 5,  6],
       [ 6,  5]])
from mlxtend.preprocessing import standardize
standardize(X, columns=[0, 1])
array([[-1.46385011,  1.46385011],
       [-0.87831007,  0.87831007],
       [-0.29277002,  0.29277002],
       [ 0.29277002, -0.29277002],
       [ 0.87831007, -0.87831007],
       [ 1.46385011, -1.46385011]])

示例 3 - 重用参数

在机器学习环境中,希望重用从训练集获得的参数来缩放新的未来数据(包括独立的测试集)。通过设置 return_params=Truestandardize 函数会返回第二个对象,一个包含列均值和标准差的参数字典,可以在函数调用时通过将其传递给 params 参数来重用。

import numpy as np
from mlxtend.preprocessing import standardize

X_train = np.array([[1, 10], [4, 7], [3, 8]])
X_test = np.array([[1, 2], [3, 4], [5, 6]])

X_train_std, params = standardize(X_train, 
                                  columns=[0, 1], 
                                  return_params=True)
X_train_std
array([[-1.33630621,  1.33630621],
       [ 1.06904497, -1.06904497],
       [ 0.26726124, -0.26726124]])
params
{'avgs': array([ 2.66666667,  8.33333333]),
 'stds': array([ 1.24721913,  1.24721913])}
X_test_std = standardize(X_test, 
                         columns=[0, 1], 
                         params=params)
X_test_std
array([[-1.33630621, -5.0779636 ],
       [ 0.26726124, -3.47439614],
       [ 1.87082869, -1.87082869]])

API

standardize(array, columns=None, ddof=0, return_params=False, params=None)

标准化 pandas DataFrames 中的列。

参数

  • array : pandas DataFrame 或 NumPy ndarray,形状 = [n_rows, n_columns]。

  • columns : 类数组,形状 = [n_columns] (默认: None)

    类数组,包含列名,例如 ['col1', 'col2', ...] 或列索引 [0, 2, 4, ...] 如果为 None,则标准化所有列。

  • ddof : int (默认: 0)

    Delta Freedom Degree。计算中使用的除数是 N - ddof,其中 N 表示元素数量。

  • return_params : dict (默认: False)

    如果设置为 True,除了标准化后的数组外,还会返回一个字典。参数字典包含各列的列均值 ('avgs') 和标准差 ('stds')。

  • params : dict (默认: None)

    一个字典,包含由 standardize 函数在 return_params 设置为 True 时返回的列均值和标准差。如果提供了 params 字典,standardize 函数将使用这些参数而不是从当前数组计算。

注意

如果给定列中的所有值都相同,则这些值都设置为 0.0。参数字典中的标准差因此设置为 1.0,以避免除以零。

返回值

  • df_new : pandas DataFrame 对象。

    原始数组或 DataFrame 的副本,已标准化列。

示例

使用示例请参见 https://mlxtend.cn/mlxtend/user_guide/preprocessing/standardize/