sklearn学习笔记:神经网络

问题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个节点;第四层是输出层,有一个节点。




你可能感兴趣的:(sklearn学习笔记:神经网络)