神经网络(深度学习)
深度学习算法往往经过精确调整,只适用于特定的应用场景。这里讨论简单的用于分类和回归的多层感知机(multilayer perceptron, MLP),MLP也被称为前馈神经网络/神经网络。
1.神经网络模型
MLP可以被视为广义的线性模型。
display(mglearn.plots.plot_logistic_regression_graph())
输入特征×系数 加权求和即输出,计算中间的隐单元(hidden unit),再加权求和。
display(mglearn.plots.plot_single_hidden_layer_graph())
这个模型需要更多的系数(权重)。为了让这玩意儿比线性模型更强大,在计算完每个隐单元的加权求和后,对结果再应用一个非线性函数----通常是校正非线性(rectifying nonlinearity,也叫校正线性单元或 relu)或正切双曲线(tangens hyperbolicus, tanh)。然后将这个函数的结果用于加权求和,计算输出结果。relu 截断小于0的值,而tanh 在输入值较小时接近-1,较大时接近1,用这两种模型给深度学习加buff。
line = np.linspace(-3, 3, 100)
plt.plot(line, np.tanh(line), label="tanh")
plt.plot(line, np.maximum(line, 0), label="relu")
plt.legend(loc="best")
plt.xlabel("x")
plt.ylabel("relu(x), tanh(x)")
plt.show()
权重都是要从数据中学习得到,需要我们设置的只有结点数,有的时候它可以小到10,有时可以大到10000.
mglearn.plots.plot_two_hidden_layer_graph()
2.神经网络调参
我们使用MLPClassifier
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)
mlp = MLPClassifier(solver='lbfgs', random_state=0).fit(X_train, y_train)
mglearn.plots.plot_2d_separator(mlp, X_train, fill=True, alpha=.3)
mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train)
plt.xlabel("Feature 0