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

Regressione Polinomiale


Data set con piu' variabili, definire una correlazione, regressione a più variabili

La regressione lineare e la regressione polinomiale sono due tecniche di modellazione che consentono di analizzare la relazione tra una variabile dipendente (target) e una o più variabili indipendenti (predittori). Tuttavia, presentano alcune differenze significative nel modo in cui modellano questa relazione:

Regressione Lineare

  • La regressione lineare assume una relazione lineare tra le variabili indipendenti e dipendenti.
  • L'obiettivo è trovare la linea retta che meglio si adatta ai dati, minimizzando la somma dei quadrati degli errori (metodo dei minimi quadrati).
  • La formula della regressione lineare è del tipo:
    \[ y = mx + b \] dove \( y \) è la variabile dipendente, \( x \) è la variabile indipendente, \( m \) è il coefficiente angolare della retta e \( b \) è il termine noto.
  • È adatto quando i dati mostrano una relazione lineare diretta tra le variabili.

Regressione Polinomiale

  • La regressione polinomiale permette di modellare relazioni non lineari tra le variabili.
  • La variabile dipendente può essere modellata come una funzione polinomiale delle variabili indipendenti.
  • La variabile dipendente può essere modellata come una funzione polinomiale delle variabili indipendenti.
  • Ad esempio, una regressione polinomiale di secondo grado ha una formula del tipo: \[ y = ax^2 + bx + c \] dove \( a \), \( b \), e \( c \) sono coefficienti che rappresentano il grado di inclinazione, la pendenza e l'intercetta della curva.

In breve, la regressione lineare è adatta per modellare relazioni lineari semplici, mentre la regressione polinomiale può catturare pattern più complessi nei dati, consentendo di adattare meglio il modello alla struttura dei dati sottostanti.

Correlazione tra varibili

il primo pezzo di codice, legge il data base e determina le variabili con relazioni non lineari

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Percorso del file CSV
file_path = "/Applications/MAMP/htdocs/livio.bollini/SingoloArticolo-html/int-artificiale/algoritmi/casemi.csv"

# Leggi il database dal file CSV e seleziona le colonne specificate
df = pd.read_csv(file_path, usecols=['price', 'm2', 'year_of_build', 'elevator', 'renewable_energy_performance_index_KWh/m2', 'floor_level'])

# Visualizza il nome delle colonne
print("Nomi delle colonne:")
print(df.columns)

# Rimuovi le righe con valori non numerici
df = df.apply(pd.to_numeric, errors='coerce').dropna()

# Esegui pairplot per verificare le relazioni non lineari
sns.pairplot(df)
plt.show()

# Calcola le correlazioni tra le variabili
correlation_matrix = df.corr()

# Trova le variabili con correlazioni non lineari
non_linear_vars = set()
for col in correlation_matrix.columns:
    for index, val in correlation_matrix[col].iteritems():
        if abs(val) >= 0.5 and index != col:
            non_linear_vars.add(col)
            non_linear_vars.add(index)

print("Variabili con relazioni non lineari:", non_linear_vars)


    

Risposta
Variabili con relazioni non lineari: {'price', 'm2'}
Tra queste due varibili la regressione lineare

Regressione Polinomiale tra due varibili

E' stata eseguita una regressione polinomiale dove y target è la colonna Price e m2 è la variabile indipendente.
E'stato usato PolinomilalFetures.
Per determinare il grado ottimale del polinomio un ciclo for che prende in considerazione un grado del polinomio da 2 a 10 .
Per ogni grado calcolato r2-score e mse (errore quadratico medio) .
Stampato il risultato .


import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error

# Percorso del file CSV
file_path = "/Applications/MAMP/htdocs/livio.bollini/SingoloArticolo-html/int-artificiale/algoritmi/casemi.csv"

# Leggi il database dal file CSV e seleziona le colonne specificate
df = pd.read_csv(file_path, usecols=['price', 'm2'])

# Visualizza il nome delle colonne
print("Nomi delle colonne:")
print(df.columns)

# Rimuovi le righe con valori non numerici
df = df.apply(pd.to_numeric, errors='coerce').dropna()

# Dividi il dataset in training e test (80% training, 20% test)
X = df[['m2']]
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Inizializza le liste per raccogliere i risultati
r2_scores = []
mse_scores = []

# Loop per provare gradi del polinomio da 2 a 10
for degree in range(2, 11):
    # Crea le features polinomiali
    poly = PolynomialFeatures(degree=degree)
    X_train_poly = poly.fit_transform(X_train)
    X_test_poly = poly.transform(X_test)

    # Crea e addestra il modello di regressione lineare
    model = LinearRegression()
    model.fit(X_train_poly, y_train)

    # Esegui le previsioni
    y_pred = model.predict(X_test_poly)

    # Calcola r2_score e mse
    r2 = r2_score(y_test, y_pred)
    mse = mean_squared_error(y_test, y_pred)

    # Aggiungi i risultati alle liste
    r2_scores.append(r2)
    mse_scores.append(mse)

    # Stampa i risultati per il grado corrente
    print(f"Grado {degree}: R2 Score = {r2}, MSE = {mse}")

# Trova il grado ottimale basato sul r2_score massimo
optimal_degree = r2_scores.index(max(r2_scores)) + 2
print(f"Il grado ottimale è {optimal_degree} con R2 Score massimo di {max(r2_scores)}")



  

Risposta
Il grado ottimale è 3 con R2 Score massimo di 0.6541985557449832
Grado 3: R2 Score = 0.6541985557449832, MSE = 121334552127.59897

R egressione Polinomiale tutte le varibili

se invece esguiamo la regressione polinomiale su tutte le varibili

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error

# Percorso del file CSV
file_path = "/Applications/MAMP/htdocs/livio.bollini/SingoloArticolo-html/int-artificiale/algoritmi/casemi.csv"

# Leggi il database dal file CSV e seleziona le colonne specificate
df = pd.read_csv(file_path, usecols=['price', 'm2', 'year_of_build', 'elevator', 'renewable_energy_performance_index_KWh/m2', 'floor_level'])

# Visualizza il nome delle colonne
print("Nomi delle colonne:")
print(df.columns)

# Rimuovi le righe con valori non numerici
df = df.apply(pd.to_numeric, errors='coerce').dropna()

# Dividi il dataset in training e test (80% training, 20% test)
X = df[['m2', 'year_of_build', 'elevator', 'renewable_energy_performance_index_KWh/m2', 'floor_level']]
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Inizializza le liste per raccogliere i risultati
r2_scores = []
mse_scores = []

# Loop per provare gradi del polinomio da 2 a 4
for degree in range(2, 5):
    # Crea le features polinomiali
    poly = PolynomialFeatures(degree=degree)
    X_train_poly = poly.fit_transform(X_train)
    X_test_poly = poly.transform(X_test)

    # Crea e addestra il modello di regressione lineare
    model = LinearRegression()
    model.fit(X_train_poly, y_train)

    # Esegui le previsioni
    y_pred = model.predict(X_test_poly)

    # Calcola r2_score e mse
    r2 = r2_score(y_test, y_pred)
    mse = mean_squared_error(y_test, y_pred)

    # Aggiungi i risultati alle liste
    r2_scores.append(r2)
    mse_scores.append(mse)

    # Stampa i risultati per il grado corrente
    print(f"Grado {degree}: R2 Score = {r2}, MSE = {mse}")

# Trova il grado ottimale basato sul r2_score massimo
optimal_degree = r2_scores.index(max(r2_scores)) + 2
print(f"Il grado ottimale è {optimal_degree} con R2 Score massimo di {max(r2_scores)}")


Risposta
Il grado ottimale è 2 con R2 Score massimo di 0.45561305546074393
Grado 2: R2 Score = 0.45561305546074393, MSE = 187607246045.87643

r2_score è un valore tra 0 -1
Piu' alto è megliore è la relazione Nel priimo caso r2_score è maggiore del secondo caso