如果数据没有经过标准化,则神经网络可能在达到允许的最大迭代次数时仍未收敛。多层感知器对特征尺度(scale)敏感,因此强烈建议归一化数据。请注意,测试集采用相同的尺度变换才有意义。有很多不同的数据标准化方法,我们将使用内置的 StandardScaler 进行标准化。 In [17]: fromsklearn.preprocessingimportStandardScaler In [18]: scaler=StandardScaler() In [19]: # Fit only to the training data scaler.fit(X_train) Out[19]: StandardScaler(copy=True, with_mean=True, with_std=True) In [20]: # Now apply the transformations to the data: X_train=scaler.transform(X_train) X_test=scaler.transform(X_test) 训练模型 现在我们来训练模型。SciKit-learn 使用 estimator(估计量)对象。我们将从 SciKit-Learn 的 neural_network 库导入我们的估计量(多层感知器分类器模型/MLP)。 In [21]: fromsklearn.neural_networkimportMLPClassifier 接下来我们创建一个模型的实例,可以自定义很多参数,我们将只定义 hidden_layer_sizes 参数。此参数传入的是一个元组,表示计划在每个层的神经元数量,其中元组中的第 n 个元素表示 MLP 模型第 n 层中的神经元数量。有很多参数可供选择,但是为了简单起见,开奖,我们将选择具有相同数量神经元的 3 层神经网络,每层的神经元数量与数据的特征数相同(13),并将最大迭代次数设置为 500 次。 In [24]: mlp=MLPClassifier(hidden_layer_sizes=(13,13,13),max_iter=500) 现在我们已经建立好模型,可以用训练集来拟合我们的模型,记住这些数据已被预处理和标准化: In [25]: mlp.fit(X_train,y_train) Out[25]: MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9, beta_2=0.999, early_stopping=False, epsilon=1e-08, hidden_layer_sizes=(13, 13, 13), learning_rate='constant', learning_rate_init=0.001, max_iter=500, momentum=0.9, nesterovs_momentum=True, power_t=0.5, random_state=None, shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1, verbose=False, warm_start=False) 输出结果中给出了模型的其它参数的默认值。我鼓励你尝试这些参数的不同取值,看看它们对 Python 神经网络有什么影响。 In [26]: predictions=mlp.predict(X_test) 现在我们可以用 SciKit-Learn 自带的评价指标,如分类报告(classification report)和混淆矩阵(confusion matrix)来评估模型的性能: In [27]: fromsklearn.metricsimportclassification_report,confusion_matrix In [28]: print(confusion_matrix(y_test,predictions))[[17 0 0] [ 0 14 1] [ 0 0 13]] In [29]: print(classification_report(y_test,predictions))precision recall f1-score support 1 1.00 1.00 1.00 17 2 1.00 0.93 0.97 15 3 0.93 1.00 0.96 13avg / total 0.98 0.98 0.98 45 结果不错!看来测试集中我们只错误分类了 1 瓶葡萄酒!考虑到我们的 Python 神经网络的代码行很少,这个效果是非常好的。然而,多层感知器模型的缺点在于解释模型本身。例如,模型的权重和偏差与数据特征的关系以及哪些特征最重要将不容易解释。 如果想查看 MLP 训练模型得到的权重和偏差,使用 public 属性 coefs_ 和 intercepts_。 coefs_ 是权重矩阵的列表,其中索引 i 处的权重矩阵表示层 i 和层 i+1 之间的权重。 intercepts_ 是偏差向量的列表,其中索引 i 处的向量表示添加到层 i+1 的偏差值。 In [30]: len(mlp.coefs_) Out[30]: 4 In [31]: len(mlp.coefs_[0]) Out[31]: 13 In [32]: len(mlp.intercepts_[0]) Out[32]: 13 原文链接:https://www.springboard.com/blog/beginners-guide-neural-network-in-python-scikit-learn-0-18/ (责任编辑:本港台直播) |