-->

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

Regolarizzazione L1 e L2


La regolarizzazione, per ridurre l'overfitting. Introduce penalità sui coefficienti del modello, limita l'importanza di attributi.

La regolarizzazione dei dati è una tecnica utilizzata per ridurre l'overfitting in modelli di machine learning.
L'overfitting si verifica quando il modello si adatta eccessivamente ai dati di addestramento, perdendo di generalità e capacità di generalizzazione su nuovi dati.
La regolarizzazione introduce penalità sui coefficienti del modello, limitandone l'importanza eccessiva attribuita a specifici attributi o caratteristiche dei dati.

Le due tecniche di regolarizzazione più comuni sono la regolarizzazione L1 e L2.
-La regolarizzazione L1 (lasso) aggiunge la somma assoluta dei valori assoluti dei coefficienti.
-La regolarizzazione L2 (ridge) aggiunge la somma dei quadrati dei coefficienti.

La regolarizzazione L1 tende a produrre modelli sparsi, cioè con molti coefficienti nulli, mentre la regolarizzazione L2 tende a mantenere tutti i coefficienti, anche se li riduce in modo proporzionale.

La regolarizzazione Elastic Net combina la regolarizzazione L1 e L2, fornendo un controllo flessibile sulla selezione delle caratteristiche e sulla riduzione del coefficiente.
L'elastic net utilizza un parametro di mescolanza per bilanciare l'effetto di L1 e L2.

Di seguito un esempio di come applicare la regolarizzazione Elastic Net in Python utilizzando Scikit-Learn:


import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import ElasticNet
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score

# Genera il dataset casuale
np.random.seed(0)
n_samples = 100
X = np.random.rand(n_samples, 1) * 10
y = X ** 2 + 3 * X + np.random.randn(n_samples, 1) * 5  # Relazione non lineare

# Dividi il dataset in training e test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)


# Normalizza i dati
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Regressione polinomiale con regolarizzazione ElasticNet
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train_scaled)
X_test_poly = poly.transform(X_test_scaled)



model = ElasticNet(alpha=0.7, l1_ratio=0.5, max_iter=10000)
model.fit(X_train_poly, y_train)

# Calcola l'indicatore R^2
y_train_pred = model.predict(X_train_poly)
y_test_pred = model.predict(X_test_poly)
r2_train = r2_score(y_train, y_train_pred)
r2_test = r2_score(y_test, y_test_pred)

# Stampare i valori R^2
print(f'R^2 sul training set: {r2_train:.3f}')
print(f'R^2 sul test set: {r2_test:.3f}')

# Grafico del dataset e della regressione
plt.scatter(X_train, y_train, color='blue', label='Training data')
plt.scatter(X_test, y_test, color='green', label='Test data')
x_values = np.linspace(0, 10, 100)
X_values_scaled = scaler.transform(x_values.reshape(-1, 1))
X_values_poly = poly.transform(X_values_scaled)
y_values_pred = model.predict(X_values_poly)
plt.plot(x_values, y_values_pred, color='red', label='Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Regressione polinomiale con ElasticNet')
plt.legend()
plt.show()

Questo codice genera un dataset con una relazione non lineare tra X e y, applica la normalizzazione dei dati e la regressione polinomiale con regolarizzazione ElasticNet.
Infine, stampa i valori R^2 per valutare le prestazioni del modello.