Testare il machine learning con Scikit-learn

In questo post riprodurremo uno dei primi esempi nel campo del machine learning, ovvero dell’apprendimento automatico, cioè il riconoscimento dei numeri scritti a mano del database MNST. I principali metodi che si usano in questo tipo di applicazioni sono le reti neurali, il teorema di Bayes, gli alberi di decisione e il metodo del nearest-neighbor. La descrizione di questi algoritmi va oltre lo scopo di questo post ma in tutti i casi bisogna prima effettuare una fase di addestramento del modello, in questo caso chiamato classificatore, cioè mostrargli l’immagine da decodificare e la risposta esatta, dopodicchè si può metterlo alla prova con altre immagini e vedere se riesce a leggere correttamente i nostri numeri.
il risultato del nostro test

Tra le varie librerie che consentono di fare questo, Weka per Java, Tensorflow di Google, una delle più semplici da utilizzare è scikit-learn per il linguaggio python. Quindi mettiamoci subito all’opera. Il codice da utilizzare per produrre l’immagine sovrastante è il seguente:


from random import randint
import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.neural_network import MLPClassifier
from sklearn.neighbors import KNeighborsClassifier


digits = datasets.load_digits()
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1)) #flattens the images


classifier = GaussianNB()
#MLPClassifier(alpha=1, hidden_layer_sizes=(25, 15), random_state=1)
#svm.SVC(gamma=1) #KNeighborsClassifier(3)

#Traing model with labelled data!!!
classifier.fit(data[:int(n_samples*2/3)], digits.target[:int(n_samples*2/3)])
predicted = classifier.predict(data[int(n_samples/3):])
expected = digits.target[int(n_samples/3):]


print("Classification report for classifier %s:\n%s\n" % (classifier, metrics.classification_report(expected, predicted)))
images_and_predictions = list(zip(digits.images[int(n_samples/3):], predicted))
x = randint(0, int(n_samples/3)) #to show different examples each time

for index, (image, prediction) in enumerate(images_and_predictions[x:x+21]):
plt.subplot(3, 7, index+1)
plt.axis('off')
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
plt.title('%i(%i)' % (prediction, expected[x+index]))
plt.show()

Analizziamolo. Dopo gli import le prime 3 righe non fanno altro che caricare il dataset delle immagini dei nostri numeri e manipolarle in modo da renderle unidimensionali, ovvero una lunga sequenza di pixel. Nelle seconde tre righe, di cui due commentate, scegliamo il nostro classificatore, nel nostro caso un classificatore gaussiano di tipo Naive Bayes. Nei commenti sono elencate le altre scelte disponibili: Multi-layer Perceptron, ovvero una rete neurale a più strati, Support Vector Machine, ovvero una macchina a vettori di supporto o K-Neighbors Classifier, cioè un classificatore del tipo nearest-neighbor, ovvero vicino più prossimo.

Quindi nelle tre righe successive in un colpo solo addestriamo il modello usando i 2/3 dei nostri dati e lo testiamo sul rimanente terzo. Cioè nel primo caso gli viene mostrata l’immagine e la risposta corretta, mentre nel secondo solo l’immagine e deve esso fornire la risposta. Nelle righe successive non facciamo altro che stampare delle informazioni e creare l’immagine. La versione originale di questo tutorial produceva un immagine diversa, con pochi esempi, perciò l’ho modificata per poter vedere di volta in volta il modello all’opera su un numero maggiore di occorrenze.

Come si può vedere, questi modelli hanno un accuratezza superiore al 90%, ma non sono perfetti, infatti c’è qualche errore sulle cifre più confuse. Tuttavia consideriamo che abbiamo ottenuto tutto questo con una libreria e circa 30 righe di python, possiamo ritenerci più che soddisfatti! Questo infatti è solo un punto di partenza, il divertimento sta nel giocare con il codice, provare a modificare i parametri della rete neurale per vedere cosa si può fare. Ad esempio potremmo usare tutti i modelli contemporaneamente e fare una media delle risposte, o confrontarle per vedere quale si adatta meglio in questo caso. Ci vediamo al prossimo tutorial!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *