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=True
,standardize
函数会返回第二个对象,一个包含列均值和标准差的参数字典,可以在函数调用时通过将其传递给 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/