Come realizzare una rete neurale con scikit learn
Elaborare i dati con una rete neurale è molto semplice in python perché si può utilizzare uno degli algoritmi di scikit learn con poche righe di codice. E' molto utile se si lavora con il machine learning.
Un esempio pratico
Provo a costruire una rete naturale usando un dataset didattico di scikit-learn.
Tra i tanti prendo il dataset composto dalle caratteristiche dei vini.
from sklearn.datasets import load_wine
dataset = load_wine()
L'obiettivo è trovare un modello statistico di classificazione dei vini a partire dalle loro caratteristiche.
In pratica, fornendo alcune caratteristiche di un vino, il modello riconosce di quale si tratta.
Suddivido il dataset in una matrice delle caratteristiche X (features) e un vettore delle etichette y (target)
X=dataset['data']
y=dataset['target']
Divido il dataset in due set, uno di training e l'altro di test.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
A questo punto carico in memoria l'algoritmo di classificazione MLPClassifier che utilizza il principio della rete neurale (neural network)
from sklearn.neural_network import MLPClassifier
Nei parametri imposto a due il numero dei livelli nascosti ( hidden layers ), ciascuno composto da 200 nodi.
Fisso il massimo delle iterazioni (epochs) a 200 e il margine di tolleranza (tol) a 0.000001.
model = MLPClassifier(hidden_layer_sizes=[200,200], verbose=True, max_iter=200, tol=0.000001)
Con il parametri verbose=True sto chiedendo all'algoritmo di mostrarmi i risultati di ogni iterazione.
A questo punto elaboro il modello con la funzione fit().
model.fit(X_train, y_train)
Durante l'elaborazione l'algoritmo mostra l'avanzamento in tempo reale dopo ogni iterazione (epoch).
Iteration 1, loss = 71.24516393
Iteration 2, loss = 20.14575164
Iteration 3, loss = 17.88382858
Iteration 4, loss = 8.75269401
Iteration 5, loss = 4.37436786
Iteration 6, loss = 6.42863537
Iteration 7, loss = 3.40341122
Iteration 8, loss = 2.13589180
Iteration 9, loss = 2.55737795
Iteration 10, loss = 4.49112366
Iteration 11, loss = 4.06346361
Iteration 12, loss = 3.88750816
Iteration 13, loss = 1.41540842
Iteration 14, loss = 4.15214444
Iteration 15, loss = 0.97863934
Iteration 16, loss = 1.50975491
Iteration 17, loss = 1.11187659
Iteration 18, loss = 1.44429474
Iteration 19, loss = 1.37661162
Iteration 20, loss = 0.77559843
Iteration 21, loss = 1.55805306
Iteration 22, loss = 0.99328457
Iteration 23, loss = 1.20419072
Iteration 24, loss = 1.22393783
Iteration 25, loss = 0.95327038
Iteration 26, loss = 1.27795031
Iteration 27, loss = 1.01864500
Iteration 28, loss = 0.88321579
Iteration 29, loss = 1.08282258
Iteration 30, loss = 0.82398148
Iteration 31, loss = 0.99960878
Training loss did not improve more than tol=0.000001 for 10 consecutive epochs. Stopping.
Process finished with exit code 0
L'esecuzione si stoppa alla 31a iterazione, prima delle 200 previste, perché il margine di tolleranza (tol=0.000001) non migliora in dieci iterazioni (epochs) consecutive.
Nota. Per non vedere i dettagli di ogni iterazione basta non inserire il parametro verbose=True nel metodo fit().
Il modello è stato creato. A questo punto lo utilizzo per prevedere le etichette sul dataset di training e di test tramite la funzione predict().
Salvo le previsioni rispettivamente nei vettori p_train e p_test.
p_train = model.predict(X_train)
p_test = model.predict(X_test)
Infine, calcolo l'accuratezza del modello confrontando le previsioni con le risposte corrette.
Per farlo carico in memoria il metodo accuracy_score
from sklearn.metrics import accuracy_score
e confronto le previsioni con le risposte corrette di training e di test
acc_train = accuracy_score(y_train, p_train)
acc_test = accuracy_score(y_test, p_test)
Infine stampo i risultati dell'accuratezza
print("acc. train : ", acc_train)
print("acc. test : ", acc_test)
Il modello restituisce un'accuratezza del 70% sui dati di training e del 74% sui dati di test
acc. train : 0.7096774193548387
acc. test : 0.7407407407407407
Il modello di classificazione è stato realizzato con la rete neurale.
E così via.