问题1. 数据标准化和归一化的区别是什么?(参考 http://www.cnblogs.com/zhaokui/p/5112287.html)
标准化(Standardization)是将数据按照比例进行缩放,使之落入一个特定的区间。例如,sklearn的Standardscale()封装来z-score算法,它使得处理后的数据服从均值为0、方差为1的正态分布。
而归一化(Normalization)是将数据统一映射到[0,1]区间上。
问题2. 数据标准化和归一化的好处?(参考 https://www.zhihu.com/question/37069477)
问题3. 运用什么模型的时候需要进行数据标准化?(参考 https://blog.csdn.net/pipisorry/article/details/52247379)
主要看模型是否具有伸缩不变性。
有些模型在各个维度进行不均匀伸缩后,最优解与原来不等价,例如SVM。对于这样的模型,除非本来各维数据的分布范围就比较接近,否则必须进行标准化,以免模型参数被分布范围较大或较小的数据dominate。
有些模型在各个维度进行不均匀伸缩后,最优解与原来等价,例如logistic regression。对于这样的模型,是否标准化理论上不会改变最优解。但是,由于实际求解往往使用迭代算法,如果目标函数的形状太“扁”,迭代算法可能收敛得很慢甚至不收敛。所以对于具有伸缩不变性的模型, 最好也进行数据标准化。1. 神经网络模型(MPLRegressor)相关参数
(参考 http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPRegressor.html)
2. 数据标准化处理
# encoding: utf-8
from sklearn.neural_network import MLPRegressor
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
from sklearn.model_selection import train_test_split
boston = datasets.load_boston()
data_X = boston.data
data_y = boston.target
X_train, X_test, y_train, y_test = train_test_split(data_X, data_y, test_size=0.25)
print X_train[:2] # 观察标准化前后数据变化规律
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
print X_train[:2]
输出结果:
[[1.25179e+00 0.00000e+00 8.14000e+00 0.00000e+00 5.38000e-01 5.57000e+00
9.81000e+01 3.79790e+00 4.00000e+00 3.07000e+02 2.10000e+01 3.76570e+02
2.10200e+01]
[3.57800e-02 2.00000e+01 3.33000e+00 0.00000e+00 4.42900e-01 7.82000e+00
6.45000e+01 4.69470e+00 5.00000e+00 2.16000e+02 1.49000e+01 3.87310e+02
3.76000e+00]]
[[-0.28249236 -0.49864047 -0.45448766 -0.28784917 -0.12518102 -1.00798306
1.05278233 0.0115575 -0.64102141 -0.5986481 1.16622722 0.2339741
1.15164257]
[-0.43530193 0.32924142 -1.15578479 -0.28784917 -0.96778412 2.15325912
-0.13096685 0.44239947 -0.52593514 -1.13885674 -1.6582026 0.34785142
-1.22918693]]
3. 模型训练
model = MLPRegressor(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)
model.fit(X_train, y_train)
print model.predict(X_test[:2])
cengindex = 0
for wi in model.coefs_:
cengindex += 1
print '第%d层神经网络:' %cengindex
print '权重矩阵维度:', wi.shape
print '系数矩阵:\n', wi
输出结果:
[29.6766446 3.95604988]
第1层神经网络:
权重矩阵维度: (13, 5)
系数矩阵:
[[-0.21701758 0.09087947 -1.77472845 -0.28551945 -1.67093076]
[ 0.75745713 -0.24919343 -0.40304248 0.03560689 -0.38200105]
[ 0.34848143 0.59865674 -0.99637729 0.36241295 0.17891837]
[ 0.52801015 0.17583501 0.09879044 0.25038145 -0.60459104]
[-0.67727367 0.1269157 -0.36194037 -0.44037972 0.0693789 ]
[ 0.90474554 -0.07089014 -0.27049439 -1.26165027 1.65144758]
[ 0.04961703 1.16220688 -0.06577209 0.32199911 -0.63015022]
[-1.58610418 0.52515576 -0.09806803 -1.88079058 0.64439715]
[ 2.49876148 -0.22747921 2.00955577 -0.39692273 -2.10999037]
[-0.84732419 0.90886554 -1.63038427 1.31072344 -0.04586449]
[-0.56482211 -0.12330224 0.36372647 -0.72238722 -0.18280908]
[-0.16552658 0.85013865 -0.1947276 1.25505243 -0.1488897 ]
[-1.78336593 0.79185781 0.55988482 0.09736226 -0.22790721]]
第2层神经网络:
权重矩阵维度: (5, 2)
系数矩阵:
[[ 1.02235802 -0.80201695]
[-1.72713632 0.4728722 ]
[ 0.84836561 -0.70845336]
[ 0.78289268 -0.4597331 ]
[ 1.13343746 -0.03863247]]
第3层神经网络:
权重矩阵维度: (2, 1)
系数矩阵:
[[2.99279419]
[0.36247059]]
该神经网络模型具有4层:第一层是输入层,有13个节点;第二层是隐含层,有5个节点;第三层还是隐含层,有2个节点;第四层是输出层,有一个节点。