Algoritmi di classificazione: machine Learning con Python

Gli algoritmi di classificazione sono una classe di problemi di Machine Learning che hanno l’obiettivo di predire una variabile qualitativa nota come target, sulla base di una serie di variabili quantitative e qualitative note come features. Molti algoritmi di classificazione seguono un approccio supervisionato: l’intelligenza artificiale che deve predire la variabile target dovrà essere allenata preliminarmente su una serie di dati storici, che contengono una serie di associazioni già note tra variabili features e variabile target.

La sfida però è tutt’altro che banale: non vogliamo solamente che il nostro algoritmo comprenda le associazioni tra i dati storici, ma che costruisca anche una regola che permetta di fare predizioni su nuovi dati, mai visti in precedenza e per i quali la variabile target non è disponibile.

In questo articolo applicheremo vari algoritmi di classificazione implementati nella libreria scikit-learn di Python, applicandoli al famoso Dataset Iris che abbiamo già studiato nelle lezioni precedenti. Infatti, ora che sappiamo già come importare i dati, eseguire l’analisi esplorativa ed effettuare le operazioni di pre-processing, siamo pronti ad applicare gli algoritmi di classificazione.

Prepariamo i dati per gli algoritmi di classificazione

Effettuiamo velocemente tutte le operazioni preliminari di cui abbiamo già parlato nell’articolo sul pre-processing. Importiamo i dati:

import pandas as pd
f = "https://raw.githubusercontent.com/iantomasinicola/Machine-Learning-con-SQL/main/IrisDataset.csv"
iris = pd.read_csv(filepath_or_buffer = f,
                             sep = ";", 
                             skiprows = 4)

dividiamo le variabili in features (nella variabile X) e class (nella variabile y)

X=iris.drop(["class","Rownumber"], axis=1)
y=iris["class"]

dividiamo le righe in training (nelle variabili x1 e y1) e test (nelle variabili x2 e y2)

from sklearn.model_selection import train_test_split
x1,x2,y1,y2 = train_test_split(X, y, test_size = 0.3, random_state = 1)

codifichiamo la variabile di output

from sklearn.preprocessing import LabelEncoder
codifica_target = LabelEncoder()
y = codifica_target.fit_transform(y)

eliminiamo i null

from sklearn.impute import SimpleImputer
import numpy as np
valorizza_null = SimpleImputer(missing_values = np.nan, strategy = "mean")
valorizza_null.fit(x1)
x1 = valorizza_null.transform(x1)
x2 = valorizza_null.transform(x2)

ed eseguiamo la standardizzazione

from sklearn.preprocessing import StandardScaler
scaler= StandardScaler()
scaler.fit(x1)
x1 = scaler.transform(x1)
x2 = scaler.transform(x2)

Per lo scopo di questo articolo, i nostri dati sono pronti a essere processati con il Machine Learning!

Perceptron con scikit-learn

Partiamo utilizzando il Perceptron, che è stato il primo storico algoritmo di classificazione il cui funzionamento è alla base delle attuali reti neurali. In questo articolo abbiamo implementato passo per passo tutti gli step dell’algoritmo con il linguaggio SQL, ora useremo l’implementazione già codificata in Python su scikit-learn.

Con il codice seguente istanziamo la classe Perceptron e con il parametro random_state fissiamo gli aspetti non deterministici dell’algoritmo, in modo da poter ripetere in futuro l’esecuzione e ottenere lo stesso risultato.

from sklearn.linear_model import Perceptron
pcp = Perceptron(random_state = 0)

Alleniamo l’algoritmo con il metodo fit, dandogli in input i dati di training. In questa fase l’algoritmo ha bisogno sia delle feature e sia del target.

pcp.fit(x1,y1)

A questo punto siamo già pronti per calcolare le predizioni con il metodo predict!

pcp.predict(x2)

Valutiamo allora l’accuratezza ottenuta con il metodo score. In questo caso occorre passare all’algoritmo anche le feature dei dati di test (variabile y2) in modo da valutare quante predizioni si sono rivelate esatte.

pcp.score(x2,y2)

Abbiamo ottenuto un rispettabile 93%!

Discesa stocastica del gradiente e regressione logistica con scikit-learn

A partire dalle idee del Perceptron, sono stati implementati altri due famosi algoritmi di classificazione che migliorano le tecniche matematiche con cui il Perceptron impara dai dati di training: parliamo della discesa stocastica del gradiente e della regressione logistica.

Il codice da eseguire su scikit-learn è identico nella sostanza a quello del Perceptron.

from sklearn.linear_model import SGDClassifier
sgd = SGDClassifier(random_state = 0)
sgd.fit(x1,y1)
y_pred = sgd.predict(x2)
sgd.score(x2,y2)
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(random_state = 0)
lr.fit(x1,y1)
y_pred = lr.predict(x2)
lr.score(x2,y2)

Otterremo il 95% di accuratezza con entrambi gli algoritmi.

Risulta utile osservare che la Regressione logistica ci mette a disposizione anche il metodo predict_proba per ottenere le probabilità che l’algoritmo associa ad ogni possibile valore della variabile target nelle predizioni.

Alberi decisionali e random forest

La creazione di un albero decisionale è un altro algoritmo di Machine Learning molto noto, che parte però da idee completamente diverse da quelle del Perceptron e dei suoi derivati, basandosi sul calcolo iterato di indici statistici come l’indice di eterogeneità di Gini. Il suo utulizzo su scikit-learn resta comunque identico a quello dei precedenti algoritmi:

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state = 0)
dt.fit(x1,y1)
y_pred_dt = dt.predict(x2)
dt.score(x2,y2)

Abbiamo però la possibilità di capire nel dettaglio quale sia la strategia di classificazione ideata dall’algoritmo visualizzando l’albero decisionale creato dal metodo fit.

from sklearn.tree import plot_tree
plot_tree(decision_tree = dt,
feature_names = ["sepal_length",  "sepal_width",  "petal_length" ,"petal_width"],
class_names = ["Iris setosa", "Iris versicolor'", "Iris virginica"],
filled = True 
);

Nella pratica risulta più efficiente combinare i risultati di tanti alberi decisionali “approssimati“, piuttosto che cercare di crearne soltanto uno. Questa idea è alla base dell’algoritmo delle RandomForest utilizzabile su scikit-learn importando il seguente metodo

from sklearn.ensemble import RandomForestClassifier

Altri algoritmi di classificazione

Tra gli altri algoritmi di classificazione presenti in letteratura ricordiamo:

  • il K Neighbors Classifier che è probabilmente l’algoritmo più semplice dal punto di vista teorico essendo basato principalmente sul calcolo delle distanze tra il nuovo dato da predire e le informazioni storiche di cui conosciamo già la classificazione;
  • le reti neurali utilizzati per casi più complessi come la classificazione di immagini o di testo;
  • algoritmi di clustering che nascono per risolvere problemi diversi seguendo un approccio non supervisionato (non necessitano cioè di dati storici già etichettati) ma che in alcuni casi possono essere comunque eseguiti in ottica di risolvere problemi di classificazione.

Continua a imparare

Torna in alto
Torna su