神经网络学习算法可以通过应用L2惩罚来控制其复杂度,即将权重趋向于零。这种做法类似于我们在岭回归和线性分类器中的操作。在MLPClassifier中,L2惩罚参数被称为alpha,这与线性回归模型中的alpha类似。默认情况下,alpha值较小,意味着正则化程度较低。
接下来,我们通过不同的alpha值观察其对决策边界的影响。以下是相关代码:
```python from sklearn.neuralnetwork import MLPClassifier from sklearn.datasets import makemoons from sklearn.modelselection import traintest_split
x, y = makemoons(nsamples=100, noise=0.25, randomstate=3) xtrain, xtest, ytrain, ytest = traintestsplit(x, y, stratify=y, randomstate=42)
fig, axes = plt.subplots(2, 5, figsize=(20, 8))
for axx, nhiddennodes in zip(axes, [15, 150]): for ax, alpha in zip(axx, [0.0001, 0.001, 0.01, 0.1, 1]): mlp = MLPClassifier(solver='lbfgs', randomstate=0, hiddenlayersizes=[nhiddennodes, nhiddennodes], alpha=alpha) mlp.fit(xtrain, ytrain) mglearn.plots.plot2dseparator(mlp, xtrain, fill=True, alpha=.3, ax=ax) mglearn.discretescatter(xtrain[:, 0], xtrain[:, 1], ytrain, ax=ax) ax.settitle("nhidden=[{}, {}]nalpha={:.4f}".format(nhiddennodes, nhiddennodes, alpha)) ```
运行上述代码后,可以观察到不同alpha值下的决策边界变化情况。这表明,神经网络的复杂度可以通过调整隐藏层节点数和正则化参数alpha来控制。
神经网络的一个显著特点是,初始权重是随机设置的,这意味着即使使用相同的参数配置,不同的随机种子也会导致不同的结果。例如,即使参数相同,但随机初始化不同,也会产生不同的决策边界。
接下来,我们将MLPClassifier应用于乳腺癌数据集,以验证其在实际数据上的表现。首先,使用默认参数进行训练,以下是相关代码:
```python from sklearn.neuralnetwork import MLPClassifier from sklearn.datasets import loadbreast_cancer
cancer = loadbreastcancer() xtrain, xtest, ytrain, ytest = traintestsplit(cancer.data, cancer.target, random_state=0)
mlp = MLPClassifier(randomstate=42).fit(xtrain, ytrain) print("Training accuracy: {:.2f}".format(mlp.score(xtrain, ytrain))) print("Test accuracy: {:.2f}".format(mlp.score(xtest, y_test))) ```
运行上述代码后,可以看到训练集和测试集的准确率分别为约0.90,这表明模型在未经缩放的数据上表现良好。
为了进一步提高性能,我们对数据进行了标准化处理,即减去平均值并除以标准差。以下是相关代码:
```python meanontrain = xtrain.mean(axis=0) stdontrain = xtrain.std(axis=0) xtrainscaled = (xtrain - meanontrain) / stdontrain meanontest = xtest.mean(axis=0) stdontest = xtest.std(axis=0) xtestscaled = (xtest - meanontest) / stdontest
mlp = MLPClassifier(randomstate=0).fit(xtrainscaled, ytrain) print("Scaled training accuracy: {:.2f}".format(mlp.score(xtrainscaled, ytrain))) print("Scaled test accuracy: {:.2f}".format(mlp.score(xtestscaled, ytest))) ```
标准化处理后的训练集和测试集准确率分别提升至0.99和0.95,说明数据预处理对模型性能有显著影响。
此外,我们还查看了连接输入层和第一个隐藏层之间的权重分布。通过观察权重图,可以看出某些特征对模型的影响较小。例如,“mean smoothness”、“mean compactness”、“smoothness error”和“fractal dimension error”等特征的权重较小,这可能意味着这些特征在模型中不那么重要。
综上所述,神经网络学习在处理大量数据时具有强大的建模能力,但也需要较长的学习时间和精细的参数调整。此外,数据预处理对于提升模型性能至关重要。