Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Il metodo k-fold


Una tecnica di convalida incrociata per le prestazioni di un modello di ML.
Divide il set di dati in k sottoinsiemi

Metodo k-fold

Il metodo k-fold è una tecnica di convalida incrociata utilizzata per valutare le prestazioni di un modello di machine learning.
Consiste nel dividere il set di dati in k sottoinsiemi (fold) di dimensioni simili.
Successivamente, il modello viene addestrato k volte, utilizzando ciascun sottoinsieme come set di test una volta e gli altri k-1 sottoinsiemi come set di addestramento.
Alla fine di ogni iterazione, si calcola una metrica di valutazione delle prestazioni (come l'accuratezza, l'errore quadratico medio, ecc.) utilizzando il set di test corrente.
Infine, si calcola la media delle metriche di valutazione ottenute durante tutte le iterazioni per ottenere una stima complessiva delle prestazioni del modello.
Il metodo k-fold è utile perché utilizza l'intero set di dati per l'addestramento e la valutazione, riducendo il rischio di sovrapposizione tra set di addestramento e test e fornendo una stima più accurata delle prestazioni del modello rispetto a una singola divisione tra set di addestramento e test.

Ecco un esempio con 5 fold

import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt

# Carica il set di dati Iris
iris = load_iris()
X = iris.data
y = iris.target

# Crea un classificatore KNN
knn = KNeighborsClassifier(n_neighbors=3)

# Esegui la convalida incrociata con 5 fold
scores = cross_val_score(knn, X, y, cv=5)

# Visualizza i risultati della convalida incrociata
print("Punteggi della convalida incrociata:", scores)
print("Media dei punteggi:", np.mean(scores))

# Mostra i risultati utilizzando matplotlib
plt.plot(range(1, 6), scores, marker='o', linestyle='-', color='b')
plt.xlabel('Fold')
plt.ylabel('Punteggio')
plt.title('Convalida Incrociata K-Fold')
plt.grid(True)
plt.show()

In questo esempio, abbiamo utilizzato il set di dati Iris e un classificatore KNN.
Abbiamo eseguito la convalida incrociata con 5 fold utilizzando la funzione `cross_val_score` di sklearn.
I punteggi della convalida incrociata sono poi visualizzati e la media dei punteggi viene stampata. Infine, i punteggi sono rappresentati graficamente utilizzando Matplotlib.


Il numero ottimale di fold


Per trovare il numero ottimale di fold, possiamo eseguire la convalida incrociata con diversi valori di k e confrontare le prestazioni dei modelli ottenuti. Successivamente, possiamo selezionare il valore di k che massimizza le prestazioni del modello.

Ecco come possiamo fare questo in Python:


import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier

# Carica il set di dati Iris
iris = load_iris()
X = iris.data
y = iris.target

# Valori di k da testare
k_values = range(2, 11)

# Calcola i punteggi della convalida incrociata per ogni valore di k
mean_scores = []
for k in k_values:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X, y, cv=k)
    mean_scores.append(np.mean(scores))

# Trova il valore ottimale di k
optimal_k = k_values[np.argmax(mean_scores)]
print("Numero ottimale di fold:", optimal_k)

# Visualizza i risultati utilizzando matplotlib
plt.plot(k_values, mean_scores, marker='o', linestyle='-', color='b')
plt.xlabel('Numero di Fold (k)')
plt.ylabel('Punteggio Medio')
plt.title('Convalida Incrociata K-Fold per KNN')
plt.grid(True)
plt.show()

In questo codice, abbiamo testato i valori di k da 2 a 10.
Per ciascun valore di k, abbiamo calcolato i punteggi della convalida incrociata utilizzando `cross_val_score` e abbiamo calcolato la media dei punteggi. Successivamente, abbiamo identificato il valore ottimale di k come quello che massimizza la media dei punteggi.
Infine, abbiamo rappresentato graficamente i punteggi della convalida incrociata in funzione di k per visualizzare la relazione tra il numero di fold e le prestazioni del modello.