概述
数据标准化主要是应对特征向量中数据很分散的情况, 防止小数据被大数据 (绝对值) 吞并的情况. 另外, 数据标准化也有加速训练, 防止梯度爆炸的作用.
标准化
标准化常用的方法是 z-score 标准化. 经过处理后的数据均值为 0, 标准差为 1. 处理方法是:
- μ: 样本的均值
- σ: 样本的标准差
简单说一下 sklearn 的标准化. 没有接触过 机器学习的同志们我建议你们先去看机器学习的内容, 专栏链接:
https://blog.csdn.net/weixin_46274168/category_10621044.html
例子:
In [2]: import numpy as np
In [3]: X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
In [4]: from sklearn.preprocessing import StandardScaler
In [5]: std = StandardScaler()
In [6]: X_train_std = std.fit_transform(X_train)
In [7]: X_train_std
Out[7]:
array([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
方法一
# 方法一
def stand(factor):
"""数据标准化"""
mean = factor.mean()
std = factor.std()
return (factor - mean) / std
# 筛选条件
q = query(
fundamentals.eod_derivative_indicator.pe_ratio
)
# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]
# 标准化处理
fund["pe_ratio_fixed"] = stand(fund["pe_ratio"])
# 画图
plt.style.use('fivethirtyeight')
f, ax = plt.subplots(1,2,figsize=(20,8))
ax[0].bar(fund.index[:500],fund['pe_ratio'][:500], color="red")
ax[1].bar(fund.index[:500],fund['pe_ratio_fixed'][:500])
# 设置x轴
ax[0].set_xticks(fund.index[:501:100])
ax[1].set_xticks(fund.index[:501:100])
# 设置标题
ax[0].set_title("origional")
ax[1].set_title("standard")
plt.show()
输出结果:
方法二
def mad(factor):
"""3倍中位数去极值"""
# 求出因子值的中位数
median = np.median(factor)
# 求出因子值与中位数的差值, 进行绝对值
mad = np.median(abs(factor - median))
# 定义几倍的中位数上下限
high = median + (3 * 1.4826 * mad)
low = median - (3 * 1.4826 * mad)
# 替换上下限
factor = np.where(factor > high, high, factor)
factor = np.where(factor < low, low, factor)
return factor
# 筛选条件
q = query(
fundamentals.eod_derivative_indicator.pe_ratio
)
# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]
# 中位数绝对偏差法
fund["pe_ratio_fixed"] = mad(fund["pe_ratio"])
# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500], color="green")
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500])
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()
输出结果:
注: 两种方法并没有本质上的区别.