Applicazioni Reti Neurali

Previsioni del Tempo

Previsioni del tempo, usando Regressione Logistica, Foreste Causuali, PCA

In questo esempio le previsioni del tempo, usando

  • Regressione Logistica
  • Foresta Causuali
  • Principal component Analisys

Generazione di un data base casuale db.csv

Per generare il DB ho usato in codice

import numpy as np
import pandas as pd

# Genera il database casuale
np.random.seed(0)
n_rows = 1000
data = {
    'y': np.random.choice([0, 1], size=n_rows),  # Variabile target y (0: nuvoloso, 1: bel tempo)
    'temperatura': np.random.randint(0, 31, size=n_rows),  # Temperatura da 0 a 30
    'umidita': np.random.randint(10, 101, size=n_rows),  # Umidità da 10% a 100%
    'mese': np.random.randint(1, 13, size=n_rows)  # Mese dell'anno da 1 a 12
}
df = pd.DataFrame(data)

# Salva il dataframe in un file CSV
file_path = "~/Desktop/db.csv"  # Percorso del file sul desktop
df.to_csv(file_path, index=False)

print("Database salvato con successo in:", file_path)


 

Il DB si trova nella scrivania e lo stesso DB verrà usato per le 3 diverse simulazioni Posso cosi poi spostarlo nella directory del sito
La varibile y ha 2 valori
  • valore 1 che significa bel tempo, tale numero se la probabilità ottenuta è uguale o maggiore di 0,7 (0,7)
  • valore 0 che vuole dire nuvoloso, se la probabilità ottenuta è inferiore di 0,7 (0,7) .

Regressione Logistica

-Ecco il codice Python legge il db.csv
-Addestra un modello di regressione logistica per prevedere la probabilità di bel tempo in base alle tre variabili indipendenti
-Calcola la probabilità di bel tempo per una nuova riga

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Leggi il database dal file CSV
file_path = "/Applications/MAMP/htdocs/livio.bollini/SingoloArticolo-html/int-artificiale/approfondimenti/db.csv"
df = pd.read_csv(file_path)

# Dividi il database in training e test set (80% training, 20% test)
X = df[['temperatura', 'umidita', 'mese']]
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# Inizializza il modello di regressione logistica
model = LogisticRegression()

# Addestra il modello
model.fit(X_train, y_train)

# Calcola l'accuratezza del modello
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuratezza del modello:", accuracy)

# Aggiungi una nuova riga con temperatura 2, umidità 90, mese 5
new_data = {'temperatura': [2], 'umidita': [90], 'mese': [5]}
new_row = pd.DataFrame(new_data)

# Calcola la probabilità che sia bel tempo
probabilita_bel_tempo = model.predict_proba(new_row)[0][1]
print("Probabilità che sia bel tempo:", probabilita_bel_tempo)

# Mostra le prime 10 righe del database
print("\nPrime 10 righe del database:")
print(df.head(10))


Ho eseguito il codice a terminale, poichè il db è

Risposta del codice:


Accuratezza del modello: 0.53
Probabilità di bel tempo per la nuova riga: 0.2545663926796696
Y previsto per la nuova riga (0 se inferiore a 0.7, 1 altrimenti): 0


Prime righe del database:
-------------
y temperatura umidita mese
0 7 69 10
0 10 24 6
1 27 58 7


Foreste Casuali


import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# Leggi il database dal file CSV
file_path = "/Applications/MAMP/htdocs/livio.bollini/SingoloArticolo-html/int-artificiale/approfondimenti/db.csv"
df = pd.read_csv(file_path)

# Dividi il database in training e test set (80% training, 20% test)
X = df[['temperatura', 'umidita', 'mese']]
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# Inizializza il modello Random Forest
model = RandomForestClassifier()

# Addestra il modello
model.fit(X_train, y_train)

# Calcola l'accuratezza del modello
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuratezza del modello:", accuracy)

# Aggiungi una nuova riga con temperatura 2, umidità 90, mese 5 e prevedi y
new_data = {'temperatura': [2], 'umidita': [90], 'mese': [5]}
new_row = pd.DataFrame(new_data)
predicted_y = model.predict(new_row)
print("Y previsto per la nuova riga:", predicted_y[0])

# Mostra le prime 10 righe del database
print("\nPrime 10 righe del database:")
print(df.head(10))

Accuratezza: 0,555

Principal Component Analysis


import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression

# Leggi il database dal file CSV
file_path = "/Applications/MAMP/htdocs/livio.bollini/SingoloArticolo-html/int-artificiale/approfondimenti/db.csv"
df = pd.read_csv(file_path)

# Riduci da 3 a 1 le variabili con PCA
pca = PCA(n_components=1)
X_pca = pca.fit_transform(df[['temperatura', 'umidita', 'mese']])
df['PCA_feature'] = X_pca

# Dividi il database in training e test set (80% training, 20% test)
X = df[['PCA_feature']]
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# Inizializza il modello di regressione logistica
model = LogisticRegression()

# Addestra il modello
model.fit(X_train, y_train)

# Mostra le prime 10 righe del nuovo database
print("Prime 10 righe del nuovo database:")
print(df.head(10))

# Calcola y sulla base della regressione logistica per il test set
y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test)[:, 1]  # Probabilità di appartenenza alla classe positiva (bel tempo)
threshold = 0.7  # Soglia per determinare la classe
y_pred_adjusted = [1 if proba >= threshold else 0 for proba in y_proba]
accuracy = (y_pred_adjusted == y_test).mean()
print("Accuratezza del modello:", accuracy)

# Aggiungi una nuova riga con temperatura 2, umidità 90, mese 5
new_data = {'temperatura': [2], 'umidita': [90], 'mese': [5]}
new_row = pd.DataFrame(new_data)

# Applica la PCA alla nuova riga
new_row_pca = pca.transform(new_row)

# Calcola y sulla base della regressione logistica per la nuova riga
y_new_row_proba = model.predict_proba(new_row_pca)[:, 1]
y_new_row = 1 if y_new_row_proba >= threshold else 0
print("Y previsto per la nuova riga:", y_new_row)


In questo esempio
  • Riduco da 3 a 1 le variabili attraverso la tecnica della Principal Component Analysis.
  • Divido il nuovo data base trasformato in training e test (20%).
Nel nuovo DB applico la regressione logistica
y puo avere due valori:
  • valore 1 cioè bel tempo, se la probabilità ottenuta è uguale o maggiore di 0,7 (0,7)
  • valore 0 se la probabilità ottenuta è minore di 0,7 (0,7) .

Livio Bollini
Walter Livio Bollini

Matematico & Informatico · Intelligenza Artificiale · Sviluppo Web