第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)
运行结果如下图:
相同参数但不同随机初始化的情况下学到的决策函数
为了在显示世界的数据上进一步理解神经网络,我们将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机器学习:神经网络算法(续)的主要内容,如果未能解决你的问题,请参考以下文章