第21集 python机器学习:神经网络算法(续)

Posted AI学习小帮手

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第21集 python机器学习:神经网络算法(续)相关的知识,希望对你有一定的参考价值。

对于神经网络学习算法,我们还可以利用L2惩罚使用权重趋向于0,从而控制神经网络的复杂度,正如我们在岭回归和线性分类器中所作的那样,MLPClassifier中调节L2惩罚参数也是alpha(类似于线性回归模型中的alpha)。默认值小(若正则化)。下面我们来看不同的alpha值的决策边界,对应代码如下:

from sklearn.neural_network import MLPClassifier    #导入MLP

from sklearn.datasets import make_moons

x, y = make_moons(n_samples=100, noise=0.25, random_state=3)    #加载make_moons数据集

x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, random_state=42)    #打乱并获取训练、测#试集

fig, axes = plt.subplots(2, 5, figsize=(20, 8))    #获取alpha值的大体范围

for axx, n_hidden_nodes in zip(axes, [15, 150]):

for ax, alpha in zip(axx, [0.0001, 0.001, 0.01, 0.1, 1]):

mlp = MLPClassifier(solver='lbfgs', random_state=0,

hidden_layer_sizes=[n_hidden_nodes,

n_hidden_nodes],

alpha=alpha)

mlp.fit(x_train, y_train)

mglearn.plots.plot_2d_separator(mlp, x_train, fill=True, alpha=.3, ax=ax)

mglearn.discrete_scatter(x_train[:, 0], x_train[:, 1], y_train, ax=ax)

ax.set_title("n_hidden=[{}, {}]\nalpha={:.4f}".format(n_hidden_nodes, n_hidden_nodes,

alpha))

运行后结果为:

不同隐藏单元个数与alpha参数的不同设定下的决策边界的值

通过上述运行结果可知,控制神经网络复杂度的方法有很多,如隐藏层的个数、每个隐藏岑中的隐藏结点个数以及正则化参数(alpha)值等,都在不同程度的决定了神经网络算法的复杂度。

神经网络的一个重要性质是,在开始学习之前其权重是随机设置的,这种随机初始化会影响到模型。也就是说,即使我们使用完全相同的参数,如果随机种子不同的话,得到的结果也会是不同的,如下示例,在相同的参数但是不同随机初始化的情况下得到的决策边界:

from sklearn.neural_network import MLPClassifier

from sklearn.datasets import make_moons

x, y = make_moons(n_samples=100, noise=0.25, random_state=3)

x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, random_state=42)

fig, axes = plt.subplots(2, 5, figsize=(20, 8))

for i, ax in enumerate(axes.ravel()):

mlp = MLPClassifier(solver='lbfgs', random_state=0,

hidden_layer_sizes=[50,50])

mlp.fit(x_train, y_train)

mglearn.plots.plot_2d_separator(mlp, x_train, fill=True, alpha=.3, ax=ax)

mglearn.discrete_scatter(x_train[:, 0], x_train[:, 1], y_train, ax=ax)

运行结果如下图:

第21集 python机器学习:神经网络算法(续)相同参数但不同随机初始化的情况下学到的决策函数

为了在显示世界的数据上进一步理解神经网络,我们将MLPClassifier应用到乳腺癌数据集上。首先使用默认参数,对应代码如下:

from sklearn.neural_network import MLPClassifier

cancer = load_breast_cancer()

print("cancer date per-feature maxima:\n{}".format(cancer.data.max(axis=0)))

x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target,

random_state=0)

mlp = MLPClassifier(random_state=42).fit(x_train, y_train)

print("Accuracy set on training: {:.2f}".format(mlp.score(x_train, y_train)))

print("Accuracy on test set: {:.2f}".format(mlp.score(x_test, y_test)))

运行后对应的精度结果如下:

乳腺癌数据集在MLP上的训练精度

由上运行结果可以看出来,其训练精度还是很不错的,在数据没有经过缩放的情况下,测试和训练精度都在0.9左右。下面我们来看一下,如果数据经过缩放后会不会有更好的效果:

#计算训练集中每个特征的平均值

mean_on_train = x_train.mean(axis=0)

#计算训练集中每个特征的标准差

std_on_train = x_train.std(axis=0)

#减去平均值,然后乘以标准差的倒数,如此运算之后,mean=0std=1

x_train_scaled = (x_train - mean_on_train)/std_on_train

#对测试机做相同的变换

#计算测试集中每个特征的平均值

mean_on_test = x_test.mean(axis=0)

#计测试练集中每个特征的标准差

std_on_test = x_test.std(axis=0)

#减去平均值,然后乘以标准差的倒数,如此运算之后,mean=0,std=1

x_test_scaled = (x_test - mean_on_test)/std_on_test

mlp = MLPClassifier(random_state=0).fit(x_train_scaled, y_train)

print("Accuracy set on training_scaled: {:.2f}".format(mlp.score(x_train_scaled, y_train)))

print("Accuracy on test_scaled set: {:.2f}".format(mlp.score(x_test_scaled, y_test)))

运行后对应结果为:

Accuracy set on training_scaled: 0.99

Accuracy on test_scaled set: 0.95

由此可见,经过缩放后得到的MLP的训练集和测试集精度都更好。下面我们来大体看一下在连接输入和第一个隐藏层之间的权重,我们输入30个特征,列对应100个隐藏单元,浅色代表较大的正值,而深色代表负值,对应代码如下:

plt.figure(figsize=(20, 5))

plt.imshow(mlp.coefs_[0], interpolation='none', cmap='viridis')

plt.yticks(range(30), cancer.feature_names)

plt.xlabel("columns in weight matrix")

plt.ylabel("input feature value")

plt.colorbar()

运行结果如下:

MLP在乳腺癌数据集上学到的第一个隐藏层权重图

由此我们可以推断,如果某个特征对所有隐藏单元的权重范围很小,那么对这个特征模型来说就“不太重要”。可以看到,与其他特征相比,“mean smoothness"、mean compactness"、”smoothness error“和”fractal dimesion error“之间的特征权重都相对较小,可以说明这些特征不是太重要,当然,也可能是我们没有用神经网络可以使用的方法来表示这些特征。

尽管MLPClassifier和MLPRegressor为最常见的神经网络架构提供了简易的使用接口,不过需要说明的是他们只包含神经网络潜在应用的一部分。

神经网络学习的优点及缺点:

神经网络学习的主要优点为:在很多应用中,神经网络学习是最先进的模型,能够获取大量数据中包含的信息,并构建无比复杂的模型。给定足够的计算时间和数据且调整好参数,神经网络能够打败其他的机器学习算法(无论是分类任务还是回归任务)。

相应的,神经网络学习也有其缺点:那就是神经网络学习一般都需要耗费很长的学习时间,同时比较依赖于数据的预处理,神经网络学习中精度的大小比较依赖于其中参数的调整。

小提示:fit会重置模型

scikit-learn模型的一个重要性质是调用fit总会重置模型之前学到的内容。因此,如果你在一个数据集上构建模型,然后在另一个数据集上再次调用fit。那么模型会忘记从第一个数据集中所学到的所有内容。你可以对一个模型多次调用fit,其结果与最新的那个模型上调用fit是完全相同的。


以上是关于第21集 python机器学习:神经网络算法(续)的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习中文版

Python机器学习中文版

第 2 章 监督学习Python机器学习基础教程

机器学习第21篇 - 特征递归消除RFE算法 理论

吴裕雄 python 机器学习——人工神经网络感知机学习算法的应用

运用kNN算法识别潜在续费商家