Groot aantal toepassingsdomeinen
Leren typisch …
Aparte wetenschappelijke discipline
Deze presentatie: enkel supervised ANN
weight vector $\mathbf{w}$ ($w_0$ noemen we de bias)
Stap 1: bereken de som $z = \mathbf{w} \cdot \mathbf{x} = \sum_{i=0}^n w_i x_i $
Kortweg: $y = f(\mathbf{w} \cdot \mathbf{x})$
Algoritme:
Model = lineaire classificatie
Daarnet algoritme voor offline learning (trainingsdata wordt in batch aangeboden), maar kan ook gebruikt worden voor online learning (aanbieden van 1 data-instantie leidt tot aanpassing model: geheugenvriendelijk; kan ook gebruikt worden in context waar er uit elke voorspelling opnieuw moet worden geleerd)
Men kan bewijzen: gewichten convergeren indien data lineair scheidbaar is
Hyperparameter: learning rate α met $0 < \alpha <= 1$.
Indien er meerdere oplossingen zijn, kiest het perceptron lukraak een oplossing
Bestaat perceptron voor regressie? Eigenlijk wel, wanneer de activatiefunctie wordt vervangen door $f(z) = z$
opmerking: in deze figuur wordt de input layer niet meegeteld
Klassen MLPClassifier en MLPRegressor
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
import numpy as np
import matplotlib.pyplot as plt
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)
# default = 100 hidden nodes and activation='relu'
mlp = MLPClassifier(solver='lbfgs', random_state=0).fit(X_train, y_train)
plot_2d_separator(mlp, X_train) # huplfunctie verborgen in deze notebook
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train,
cmap=ListedColormap(['#0000aa', '#ff2020']))
<matplotlib.collections.PathCollection at 0x18cd658e430>
# 10 nodes in 1 hidden layer ...
mlp = MLPClassifier(solver='lbfgs', random_state=0,
hidden_layer_sizes=[10]).fit(X_train, y_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:541: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter)
# 10 nodes in 1 hidden layer ...
# ... resulteren in een decision boundary van 10 lijnsegmenten
mlp = MLPClassifier(solver='lbfgs', random_state=0, hidden_layer_sizes=[10],
max_iter=300).fit(X_train, y_train)
plot_2d_separator(mlp, X_train) # huplfunctie verborgen in deze notebook
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=ListedColormap(['#0000aa', '#ff2020']))
<matplotlib.collections.PathCollection at 0x18cd1e90940>
# laat ons een 2de laag toevoegen ...
mlp = MLPClassifier(solver='lbfgs', random_state=0,
hidden_layer_sizes=[10,10]).fit(X_train, y_train)
plot_2d_separator(mlp, X_train) # huplfunctie verborgen in deze notebook
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=ListedColormap(['#0000aa', '#ff2020']))
<matplotlib.collections.PathCollection at 0x18cd1ee8160>
# en laat ons de activatiefunctie veranderen naar tanh ...
mlp = MLPClassifier(solver='lbfgs', activation='tanh', random_state=0,
max_iter=300,
hidden_layer_sizes=[10,10]).fit(X_train, y_train)
plot_2d_separator(mlp, X_train) # huplfunctie verborgen in deze notebook
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=ListedColormap(['#0000aa', '#ff2020']))
<matplotlib.collections.PathCollection at 0x18cd1f2bb50>
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
mlp = MLPClassifier(random_state=0)
mlp.fit(X_train, y_train)
print("Accuracy on training set: {:.2f}".format(mlp.score(X_train, y_train)))
print("Accuracy on test set: {:.2f}".format(mlp.score(X_test, y_test)))
Accuracy on training set: 0.93 Accuracy on test set: 0.93
print("Cancer data per-feature maxima:\n{}".format(cancer.data.max(axis=0)))
Cancer data per-feature maxima: [2.811e+01 3.928e+01 1.885e+02 2.501e+03 1.634e-01 3.454e-01 4.268e-01 2.012e-01 3.040e-01 9.744e-02 2.873e+00 4.885e+00 2.198e+01 5.422e+02 3.113e-02 1.354e-01 3.960e-01 5.279e-02 7.895e-02 2.984e-02 3.604e+01 4.954e+01 2.512e+02 4.254e+03 2.226e-01 1.058e+00 1.252e+00 2.910e-01 6.638e-01 2.075e-01]
! Opgelet: schaal enkel de trainingsdata en gebruik dezelfde schaling op de testset
# compute the mean value per feature on the training set
mean_on_train = X_train.mean(axis=0)
# compute the standard deviation of each feature on the training set
std_on_train = X_train.std(axis=0)
# subtract the mean, and scale by inverse standard deviation
# afterward, mean=0 and std=1
X_train_scaled = (X_train - mean_on_train) / std_on_train
# use THE SAME transformation (using training mean and std) on the test set
X_test_scaled = (X_test - mean_on_train) / std_on_train
mlp = MLPClassifier(random_state=0)
mlp.fit(X_train_scaled, y_train)
print("Accuracy on training set: {:.3f}".format(
mlp.score(X_train_scaled, y_train)))
print("Accuracy on test set: {:.3f}".format(mlp.score(X_test_scaled, y_test)))
Accuracy on training set: 0.991 Accuracy on test set: 0.965
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:686: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet. warnings.warn(
# laat ons het aantal iteraties dus verhogen ....
mlp = MLPClassifier(max_iter=1000, random_state=0)
mlp.fit(X_train_scaled, y_train)
print("Accuracy on training set: {:.3f}".format(
mlp.score(X_train_scaled, y_train)))
print("Accuracy on test set: {:.3f}".format(mlp.score(X_test_scaled, y_test)))
# sterk resultaat !!
Accuracy on training set: 1.000 Accuracy on test set: 0.972
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")
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x18cd20178e0>
Multi-Layer Perceptron
Extra richtlijnen tuning MLPs: