数据集的标准化,在scikit中,对于众多机器学习评估器来说是必须的;如果各独立特征不进行标准化,结果标准正态分布数据差距很大:比如使用均值为0、方差为1的高斯分布.
标准化的流程简单来说可以表达为:将数据按其属性(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个属性/每列来说所有数据都聚集在0附近,方差值为1。
下面我们用numpy自带的算法和sklearn提供的standardscaler来看看分别怎么做:
#1.首先生成测试 数据
import numpy as np
np.random.seed(123)
data = np.random.randn(10, 4)
print('original data: ')
print(data)
我们就看到我们生成的数据,其中np.random.seed()
函数是使生成的随机数具有可预测性,那如果我们用sklearn.preprocessing.StandardScaler
怎么写呢?
from sklearn.preprocessing import StandardScaler
data = np.random.randn(10, 4)
scaler = StandardScaler()
scaler.fit(data)
trans_data = scaler.transform(data)
print('original data: ')
print(data)
print('transformed data: ')
print(trans_data)
print('scaler info: scaler.mean_: {}, scaler.var_: {}'.format(scaler.mean_, scaler.var_))
print('\n')
非常简单,核心代码就是先生成 StandardScaler()
对象,然后调用transform()
方法
那用numpy自己的方法怎么写呢?
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
var = std * std
print('mean: {}, std: {}, var: {}'.format(mean, std, var))
# numpy 的广播功能
another_trans_data = data - mean
# 注:是除以标准差
another_trans_data = another_trans_data / std
print('another_trans_data: ')
print(another_trans_data)
其实就是最基本的数学方法。
网友评论