Perceptron con scikit learn in python
Questo script esegue il classificatore Perceptron ( machine learning ) tramite la libreria scikit-learn del linguaggio python.
Su quale dataset? Nello script importo il dataset iris direttamente dalla collezione integrata nella libreria scikit-learn (riga 7). Il 30% degli esempi lo utilizzo come test set (riga 10) mentre il restante 70% come training set.
I dati sono standardizzati prima dell'elaborazione.
- import numpy as np
- from sklearn import datasets
- from sklearn.linear_model import Perceptron
- from sklearn.metrics import accuracy_score
- from sklearn.model_selection import train_test_split
- # preparazione dataset
- iris = datasets.load_iris()
- X = iris.data[:, [2, 3]]
- y = iris.target
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
- # standardizzazione
- from sklearn.preprocessing import StandardScaler
- sc = StandardScaler()
- sc.fit(X_train)
- X_train_std = sc.transform(X_train)
- X_test_std = sc.transform(X_test)
- # addestramento
- ppn = Perceptron(max_iter=40, tol=0.001, eta0=0.01, random_state=0)
- ppn.fit(X_train_std, y_train)
- # test e calcolo accuratezza
- y_pred = ppn.predict(X_test_std)
- print(accuracy_score(y_test, y_pred))
Gli iperparametri
Nella riga 7 eseguo il metodo fit() fissando il numero massimo di iterazioni (max_iter) a 40 e una tolleranza di uscita (tol) a 0.001.
Fisso il tasso di apprendimento (eta0) del modello di apprendimento a 0.01
L'accuratezza
Lo script ha un'accuratezza del 97%
0.9777777777777777
Vuol dire che dopo l'addestramento il modello prevede e classifica correttamente il 97% degli esempi dell'insieme di test.
Rappresentazione grafica del classificatore
Aggiungo qualche riga in fondo allo script python per rappresentare graficamente la classificazione del Perceptron con la funzione plot_decision_region().
- from mlxtend.plotting import plot_decision_regions
- # Plotting decision regions
- plot_decision_regions(X_test, y_test, clf=ppn, legend=2)
- # Adding axes annotations
- import matplotlib.pyplot as plt
- plt.show()
La funzione mostra la ripartizione degli esempi di test.
Sugli assi x e y sono misurati i valori dei due attributi degli esempi.
I simboli (quadrato, triangolo, cerchio) indicano le diverse tipologie di fiori Iris ( versicolor, setosa, virginica ).

Il modello ha diviso correttamente la regione degli esempi dell'insieme di test in tre parti distinte. C'è un solo errore.
Nota. Uno dei limiti del percpetron è di non riuscire a riconoscere regioni non delimitate in modo lineare. In questo caso, il dataset Iris è molto semplice ed è stato possibile farlo.
Verifica
Per verificare il risultato aggiungo in coda allo script un ciclo per leggere i singoli esempi di test (standardizzati) e calcolare l'etichetta tramite il classificatore.
- for i in range(0,len(X_test_std)):
- z = np.array([X_test_std[i]])
- y = ppn.predict(z)
- print(X_test_std[i], y_test[i], y)
Il risultato è il seguente:
| num | X_test_std | y_test | predict() |
|---|---|---|---|
| 1 | [0.70793846 1.51006688] | 2 | 2 |
| 2 | [ 0.09545238 -0.29318114] | 1 | 1 |
| 3 | [-1.35224199 -1.32360858] | 0 | 0 |
| 4 | [1.37610509 0.7372463 ] | 2 | 2 |
| 5 | [-1.29656144 -1.32360858] | 0 | 0 |
| 6 | [1.20906343 1.63887031] | 2 | 2 |
| 7 | [-1.40792255 -1.19480515] | 0 | 0 |
| 8 | [0.48521625 0.35083601] | 1 | 1 |
| 9 | [0.5408968 0.22203258] | 1 | 1 |
| 10 | [0.09545238 0.09322915] | 1 | 1 |
| 11 | [0.98634122 0.22203258] | 2 | 1 |
| 12 | [0.37385514 0.35083601] | 1 | 1 |
| 13 | [ 0.48521625 -0.03557428] | 1 | 1 |
| 14 | [0.42953569 0.35083601] | 1 | 1 |
| 15 | [0.48521625 0.22203258] | 1 | 1 |
| 16 | [-1.35224199 -1.45241201] | 0 | 0 |
| 17 | [0.37385514 0.35083601] | 1 | 1 |
| 18 | [ 0.31817459 -0.03557428] | 1 | 1 |
| 19 | [-1.35224199 -1.19480515] | 0 | 0 |
| 20 | [-1.40792255 -1.06600172] | 0 | 0 |
| 21 | [0.59657735 0.99485316] | 2 | 2 |
| 22 | [0.37385514 0.35083601] | 1 | 1 |
| 23 | [-1.07383923 -1.32360858] | 0 | 0 |
| 24 | [-1.35224199 -1.32360858] | 0 | 0 |
| 25 | [0.5408968 0.7372463] | 2 | 2 |
| 26 | [-1.57496421 -1.32360858] | 0 | 0 |
| 27 | [-1.07383923 -1.06600172] | 0 | 0 |
| 28 | [0.26249403 0.09322915] | 1 | 1 |
| 29 | [-0.29431149 -0.29318114] | 1 | 1 |
| 30 | [-1.24088089 -1.06600172] | 0 | 0 |
| 31 | [0.93066067 0.7372463 ] | 2 | 2 |
| 32 | [0.37385514 0.35083601] | 1 | 1 |
| 33 | [-1.29656144 -1.32360858] | 0 | 0 |
| 34 | [0.59657735 0.7372463 ] | 2 | 2 |
| 35 | [0.98634122 1.25246002] | 2 | 2 |
| 36 | [0.03977182 0.22203258] | 1 | 1 |
| 37 | [-1.18520034 -1.19480515] | 0 | 0 |
| 38 | [0.70793846 0.47963944] | 1 | 1 |
| 39 | [0.20681348 0.35083601] | 1 | 1 |
| 40 | [ 0.09545238 -0.03557428] | 1 | 1 |
| 41 | [0.93066067 1.12365659] | 2 | 2 |
| 42 | [-1.40792255 -1.32360858] | 0 | 0 |
| 43 | [0.70793846 1.38126345] | 2 | 2 |
| 44 | [-1.24088089 -0.80839486] | 0 | 0 |
| 45 | [-1.29656144 -1.32360858] | 0 | 0 |
Su 45 esempi presenti nel test set, il classificatore ha sbagliato un solo esempio, l'esempio numero 11.
Il modello ha un tasso di errore di 1/45 = 0.0222 ossia del 2,22% periodico
Questo equivale a dire che il modello ha un'accuratezza di circa il 97,78%.
Il dato conferma il risultato ottenuto in precedenza con il metodo accuracy_score().
E così via.
