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%).
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) .