浅谈特征归一化以及cut qcut的区别

650 阅读3分钟

特征归一化

什么是特征归一化?

数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。

为什么要进行特征归一化(必要性)

对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。 从经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

特征归一化的方法有哪些

  • Min-Max Scaling(数据归一化)

它对原始数据进行线性变换,使结果映射到[0,1]的范围,实现对原始数据的等比缩放,也称为离差标准化。 以下为归一化公式:

  • Zero-Score Normalization(数据标准化)

它会将原始数据映射到均值为0、标准差为1的分布上(高斯分布/正态分布),假设原始特征的均值为μ μμ、标准差为σ σσ

那么归一化公式定义为:

特征归一化的好处

1)提升收敛速度 对于线性模型来说,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。

2)提升模型的精度。

3)深度学习中数据归一化可以防止模型梯度爆炸。

cut qcut的区别

两者功能相似,都是将一个Series切割成若干个分组 首先创建数据

factors = np.random.randn(9)

[-0.01866508  0.72088087  0.67396285  0.50709849 -2.0963765   1.1875407
  0.56316144 -1.00214153  0.01905435]

qcut是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的。 传入q参数

pd.qcut(factors, 3)                   

>>>[(-2.097, 0.00648], (0.6, 1.188], (0.6, 1.188], (0.00648, 0.6], (-2.097, 0.00648], (0.6, 1.188], (0.00648, 0.6], (-2.097, 0.00648], (0.00648, 0.6]]
Categories (3, interval[float64]): [(-2.097, 0.00648] < (0.00648, 0.6] < (0.6, 1.188]]

pd.qcut(factors, 3).value_counts()    #计算每个分组中含有的数的数量

>>>
(-2.097, 0.00648]    3
(0.00648, 0.6]       3
(0.6, 1.188]         3
dtype: int64
传入label参数

pd.qcut(factors, 3, labels = ["a","b","c"])   #返回每个数对应的分组,但分组名称由label指示

[a, c, c, b, a, c, b, a, b]
Categories (3, object): [a < b < c]


pd.qcut(factors, 3, labels = False)           #返回每个数对应的分组,但仅显示分组下标

[0 2 2 1 0 2 1 0 1]
传入retbins参数

pd.qcut(factors, 3, retbins=True)             #返回每个数对应的分组,且额外返回bins,即每个边界值

([(-2.097, 0.00648], (0.6, 1.188], (0.6, 1.188], (0.00648, 0.6], (-2.097, 0.00648], (0.6, 1.188], (0.00648, 0.6], (-2.097, 0.00648], (0.00648, 0.6]]
Categories (3, interval[float64]): [(-2.097, 0.00648] < (0.00648, 0.6] < (0.6, 1.188]], array([-2.0963765 ,  0.00648121,  0.60009524,  1.1875407 ]))

pd.cut()

cut将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的

传入bins参数

pd.cut(factors, 3)        #返回每个数对应的数组

[(-1.002, 0.0929], (0.0929, 1.188], (0.0929, 1.188], (0.0929, 1.188], (-2.1, -1.002], (0.0929, 1.188], (0.0929, 1.188], (-2.1, -1.002], (-1.002, 0.0929]]
Categories (3, interval[float64]): [(-2.1, -1.002] < (-1.002, 0.0929] < (0.0929, 1.188]]

pd.cut(factors, bins=[-3, -2, -1, 0, 1, 2, 3])

>>> [(-1, 0], (0, 1], (0, 1], (0, 1], (-3, -2], (1, 2], (0, 1], (-2, -1], (0, 1]]
Categories (6, interval[int64]): [(-3, -2] < (-2, -1] < (-1, 0] < (0, 1] < (1, 2] < (2, 3]]


pd.cut(factors, 3).value_counts() #计算每个分组中含有的数的数量

>>>
(-2.1, -1.002]      2
(-1.002, 0.0929]    2
(0.0929, 1.188]     5
dtype: int64

传入label参数

pd.cut(factors, 3, labels=["a", "b", "c"])  #返回每个数对应的分组,但分组名称由label指示

>>> [b, c, c, c, a, c, c, a, b]
Categories (3, object): [a < b < c]

pd.cut(factors, 3, labels=False)            #返回每个数对应的分组,但仅显示分组下标

>>> [1 2 2 2 0 2 2 0 1]

传入retbins参数

pd.cut(factors, 3, retbins=True)            #返回每个数对应的分组,且额外返回bins,即每个边界值

>>> ([(-1.002, 0.0929], (0.0929, 1.188], (0.0929, 1.188], (0.0929, 1.188], (-2.1, -1.002], (0.0929, 1.188], (0.0929, 1.188], (-2.1, -1.002], (-1.002, 0.0929]]
Categories (3, interval[float64]): [(-2.1, -1.002] < (-1.002, 0.0929] < (0.0929, 1.188]], array([-2.09966042, -1.00173743,  0.09290163,  1.1875407 ]))