Applicazioni pratiche di machine learning/Previsioni sugli incendi: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1:
{{avanzamento|75%|01 febbraio 2020}}
{{Applicazioni pratiche di machine learning}}
==Caricamento librerie==
Line 32 ⟶ 31:
 
<syntaxhighlight lang="rsplus">
forestfires <- read.csv("forestfires.csv", stringsAsFactors = TRUE)
</syntaxhighlight>
 
Line 125 ⟶ 124:
</syntaxhighlight>
 
Starting H2O JVM and connecting: ....... Connection successful!
H2O is not running yet, starting it now...
 
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Ubuntu-0ubuntu1.118.04)
OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Ubuntu-0ubuntu1.118.04, mixed mode, sharing)
Starting H2O JVM and connecting: ..... Connection successful!
R is connected to the H2O cluster:
H2O cluster uptime: 75 seconds 720344 milliseconds
H2O cluster timezone: Europe/Rome
H2O data parsing timezone: UTC
H2O cluster version: 3.2838.0.21
H2O cluster version age: 111 month and 9 days
H2O cluster name: H2O_started_from_R_gian_wze918H2O_started_from_R_gian_pqa647
H2O cluster total nodes: 1
H2O cluster total memory: 1.9291 GB
H2O cluster total cores: 2
H2O cluster allowed cores: 2
Line 146 ⟶ 142:
H2O Connection proxy: NA
H2O Internal Security: FALSE
R Version: R version 4.2.1 (2022-06-23)
H2O API Extensions: Amazon S3, XGBoost, Algos, AutoML, Core V3, TargetEncoder, Core V4
 
R Version: R version 3.6.2 (2019-12-12)
 
Show in New WindowClear OutputExpand/Collapse Output
Si divide il dataset df in un training set fatto dal 75% delle prime osservazioni e su cui si addestra il modello ed il rimanente 25% costituisce il testing set su cui verrà testato il modello :
 
 
<syntaxhighlight lang="rsplus">
trainn <- h2o.importFilenrow("forestfires.csv")
training <- forestfires[1:round(n*0.75),]
testing <- forestfires[round(n*0.75):n,]
</syntaxhighlight>
 
Si addestra il modello:
 
<syntaxhighlight lang="rsplus">
train <- as.h2o(training)
y <- "area"
x <- setdiff(names(train), y)
Line 157 ⟶ 163:
aml <- h2o.automl(x = x, y = y,
training_frame = train,
max_runtime_secs = 30300)
</syntaxhighlight>
 
Di seguito in ordine i migliori algoritmi selezionati da H2o, tra cui il primo è GLM_1_AutoML_20200201_222130GBM_lr_annealing_selection_AutoML_3_20221029_184630_select_model cioè un algoritmo GLM (Generalized Linear Models):
 
<syntaxhighlight lang="rsplus">
Line 167 ⟶ 173:
</syntaxhighlight>
 
model_id mean_residual_deviance rmse model_id rmse
1 GBM_lr_annealing_selection_AutoML_3_20221029_184630_select_model 57.32336
1 GLM_1_AutoML_20200201_222130 4045.990 63.60810
2 GBM_grid_1_AutoML_3_20221029_184630_model_10 57.54180
2 GBM_5_AutoML_20200201_222130 4055.079 63.67950
3 XGBoost_2_AutoML_20200201_222130 GBM_grid_1_AutoML_3_20221029_184630_model_3 4064.721 6358.7551686349
4 DeepLearning_1_AutoML_20200201_222130 GBM_grid_1_AutoML_3_20221029_184630_model_9 4069.798 6359.7949718868
5 XRT_1_AutoML_20200201_222130 GBM_5_AutoML_3_20221029_184630 4126.609 6459.2386920226
6 GBM_grid_1_AutoML_3_20221029_184630_model_12 59.28968
6 StackedEnsemble_BestOfFamily_AutoML_20200201_222130 4133.725 64.29405
 
L'errore previsionale RMSE dell'algoritmo di Boosting selezionato sul testing set è pari a 73,14 ettari...
 
L'errore previsionale RMSE dell'algoritmo GLM selezionato è pari a 63,23 ettari...
 
<syntaxhighlight lang="rsplus">
model <- aml@leader
test <- as.h2o(testing)
model
p1 = h2o.predict(model, newdata=traintest)
p1_df <- as.data.frame(p1)
cat("RMSERMSE_test=",sqrt(mean((p1_df$predict-forestfirestesting$area)^2)))
</syntaxhighlight>
 
RMSE_test= 73.13926
RMSE= 63.23721
 
== Parte 5: Previsioni in Python==
 
<syntaxhighlight lang="Python">
import pandas as pd
 
# Caricamento dati
data = pd.read_csv('forestfires.csv')
 
# Separo la variabile da predire area dai predictors
y = data.area
X = data.drop(['area'], axis=1)
 
# Divido i dati in training e validation subsets, il primo con il 75% delle partite e il secondo con il 25%
X_train_full=X.iloc[1:round(0.75*X.shape[0])+1,]
X_valid_full=X.iloc[round(0.75*X.shape[0])+1:,]
y_train=y.iloc[1:round(0.75*X.shape[0])+1]
y_valid=y.iloc[round(0.75*X.shape[0])+1:]
 
# Seleziono le colonne con valori categoriali in numero minore di 12
categorical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique() < 12 and X_train_full[cname].dtype == "object"]
 
# Seleziono le colonne numeriche
numerical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]
 
# Mantengo soltanto le colonne selezionate
my_cols = categorical_cols + numerical_cols
X_train = X_train_full[my_cols].copy()
X_valid = X_valid_full[my_cols].copy()
</syntaxhighlight>
 
Le colonne numeriche e categoriche nel dataset che hanno valori mancanti NA vengono trasformate con valori approssimativi nei NA tramite SimpleImputer, mentre le variabili categoriche vengono trasformate in numeriche tramite OneHotEncoder :
 
<syntaxhighlight lang="Python">
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
 
# Preprocessing per i dati numerici
numerical_transformer = SimpleImputer(strategy='constant')
 
# Preprocessing per i dati categoriali
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
 
 
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_cols),
('cat', categorical_transformer, categorical_cols)
])
</syntaxhighlight>
 
Per la previsione utilizzo l'algoritmo RandomForest e addestro il modello sul training set dopo avere preprocessato i dati con il preprocessor precedentemente creato. Infine prevedo i dati sul validation set.
 
<syntaxhighlight lang="Python">
from sklearn.ensemble import RandomForestRegressor
 
model = RandomForestRegressor(random_state=0)
 
my_pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('model', model)
])
 
# addestro il modello
my_pipeline.fit(X_train, y_train)
 
# ottengo le previsioni sul validation set
preds_valid = my_pipeline.predict(X_valid)
 
</syntaxhighlight>
 
Sul validation set ottengo un errore previsionale RMSE di 79.08 ettari... in R ho ottenuto il risultato migliore pari a 73,14 ettari...
 
<syntaxhighlight lang="Python">
from sklearn.metrics import mean_squared_error
print("RMSE_valid=",mean_squared_error(y_valid,preds_valid, squared=False))
</syntaxhighlight>
 
RMSE_valid= 79.07977319002202
 
{{avanzamento|75%|30 ottobre 2022}}
[[Categoria:Applicazioni pratiche di machine learning|Previsioni sugli incendi]]