file.exists("~/INGENIERÍA AMBIENTAL/Semestre 3/Estadística y Probabilidad/Proyecto Eficiencia Energética Aragón/1.Datos")[1] TRUE
MACHINE LEARNING
file.exists("~/INGENIERÍA AMBIENTAL/Semestre 3/Estadística y Probabilidad/Proyecto Eficiencia Energética Aragón/1.Datos")[1] TRUE
Regresión múltiple
Ahora conoceremos la correlación existente entre una variable dependiente y varias variables independientes mediante modelos de regresión aprovechando el Machine Learning o Aprendizaje de máquina, aprovechando el conjunto total de datos para que un 80% sea de entrenamiento y un 20% se de prueba del modelo.
Buscamos el directorio de trabajo y cargamos la tabla de datos o el dataset:
setwd("~/INGENIERÍA AMBIENTAL/Semestre 3/Estadística y Probabilidad/Proyecto Eficiencia Energética Aragón/1.Datos")
library(readr)
data <- read.csv("Edificios_Reales.csv", sep = ";", dec = ".")Verificamos que rstudio nos lea correctamente los datos
str(data)'data.frame': 167479 obs. of 17 variables:
$ Día_Emisión : int 29 26 26 12 27 17 13 8 7 16 ...
$ Mes_Emisión : int 6 9 2 6 6 6 2 4 4 12 ...
$ Año_Emisión : int 2013 2013 2014 2013 2013 2013 2014 2014 2014 2013 ...
$ Emision_CO2 : num 30.1 46.1 20.3 39.2 103.8 ...
$ Clasificacion_Emisiones: chr "E" "E" "D" "E" ...
$ Demanda_energética : num 142.3 174.4 94.2 187.7 409 ...
$ Clasificacion_consumo : chr "E" "E" "D" "E" ...
$ Tipo_edificio : chr "Vivienda individual" "Vivienda individual" "Vivienda individual" "Vivienda individual" ...
$ Estado_edificio : chr "Existente" "Existente" "Existente" "Existente" ...
$ Anio_construccion : int 1962 1974 1999 1970 1965 1968 1966 1963 2006 1970 ...
$ Superficie_m2 : num 49 81 72 65 46 ...
$ Municipio : chr "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" ...
$ Provincia : chr "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" "ZARAGOZA" ...
$ Coordenadas._x : num 674904 674063 671872 676129 674807 ...
$ Coordenadas._y : num 4612931 4612970 4612102 4613402 4613068 ...
$ Anio_emision : int 2013 2013 2014 2013 2013 2013 2014 2014 2014 2013 ...
$ Dias_hasta_expiracion : int 3652 3652 3652 3652 3652 3652 3652 3653 3653 3652 ...
Carga de librerías para R para realizar el modelo de predicción, necesitamos diferentes librerías para el entrenamiento, prueba, neuronas, entre otras.
# Cargar las bibliotecas
library(neuralnet)Warning: package 'neuralnet' was built under R version 4.4.2
library(readr)
library(caret)Warning: package 'caret' was built under R version 4.4.2
Cargando paquete requerido: ggplot2
Warning: package 'ggplot2' was built under R version 4.4.2
Cargando paquete requerido: lattice
1)Seleccionamos nuestras variables regresoras y nuestra variable a predecir.
# Definir la variable respuesta y las variables predictoras
Y <- data$Emision_CO2
# Asegúrate de que las columnas existen y que no hay errores tipográficos
colnames(data) [1] "Día_Emisión" "Mes_Emisión"
[3] "Año_Emisión" "Emision_CO2"
[5] "Clasificacion_Emisiones" "Demanda_energética"
[7] "Clasificacion_consumo" "Tipo_edificio"
[9] "Estado_edificio" "Anio_construccion"
[11] "Superficie_m2" "Municipio"
[13] "Provincia" "Coordenadas._x"
[15] "Coordenadas._y" "Anio_emision"
[17] "Dias_hasta_expiracion"
X <- data[ , c("Día_Emisión","Mes_Emisión","Año_Emisión", "Demanda_energética","Anio_construccion","Superficie_m2","Coordenadas._x", "Coordenadas._y","Anio_emision","Dias_hasta_expiracion")]2) Depuramos las celdas de nuestra tabla que contenga valores vacios o nulos.
# Eliminar filas con NA en el conjunto de datos original
data <- na.omit(data)3)Normalizamos nuestras variables para que la máquina pueda identificar correctamente todos los valores y no se produzcan errores al momento del entrenamiento.
# Normalizar las variables numéricas
numeric_features <- c("Día_Emisión", "Mes_Emisión", "Año_Emisión", "Demanda_energética",
"Anio_construccion", "Superficie_m2", "Anio_emision", "Dias_hasta_expiracion")
# Asegúrate de que las columnas sean numéricas
X[numeric_features] <- lapply(X[numeric_features], function(x) as.numeric(as.character(x)))
# Normalización Min-Max
preproc <- preProcess(X[, numeric_features], method = c("range"))
X_normalized <- predict(preproc, X[, numeric_features])
X_normalized <- as.data.frame(X_normalized)
# Combinar características normalizadas con otras características
X <- cbind(X[, !names(X) %in% numeric_features], X_normalized)4) Dividimos nuestro conjunto de datos en dos: uno para entrenamiento con el 80% de los valores y otro para prueba con el 20% de los valores.Al final nos resulto entre 133983 valores de entrenamiento y 33496 valores de prueba
# Dividir los datos en conjuntos de entrenamiento y prueba
set.seed(42) # Para reproducibilidad
train_index <- createDataPartition(Y, p = 0.8, list = FALSE)
X_train <- X[train_index, ]
Y_train <- Y[train_index]
X_test <- X[-train_index, ]
Y_test <- Y[-train_index]
# Reemplazar espacios en los nombres de las columnas
names(X_train) <- make.names(names(X_train))
names(X_test) <- make.names(names(X_test))
# Crear un marco de datos para el entrenamiento
train_data <- data.frame(Y_train = Y_train, X_train)
# Eliminar filas con NA en el conjunto de entrenamiento
train_data <- na.omit(train_data)
# Verificar si hay valores NA introducidos
if (any(is.na(train_data))) {
cat("Valores NA introducidos en train_data. Verifique los niveles de los factores.\n")
print(sapply(train_data, function(x) sum(is.na(x)))) # Mostrar cuántos NA hay en cada columna
stop("Error: Hay valores NA en el conjunto de entrenamiento.")
}
# Convertir factores a numéricos de forma segura
train_data[] <- lapply(train_data, function(x) {
if (is.factor(x)) {
as.numeric(as.character(x)) # Convertir a caracteres y luego a numéricos
} else {
x
}
})
# Verificar si hay valores NA después de la conversión
if (any(is.na(train_data))) {
cat("Valores NA introducidos tras la conversión. Verifique los niveles de los factores.\n")
stop("Error: Hay valores NA en el conjunto de entrenamiento.")
}5) Definimos nuestro modelo de predicción.
# Definir la fórmula para el modelo
predictor_names <- names(X_train)
formula <- as.formula(paste("Y_train ~", paste(predictor_names, collapse = " + ")))# Entrenar el modelo de red neuronal
model <- neuralnet(formula, data = train_data,
hidden = c(5), # Número de neuronas en la capa oculta
linear.output = TRUE) # Salida lineal para regresión
# Hacer predicciones
predictions <- compute(model, X_test)
predicted_values <- predictions$net.result
plot(model)# Evaluación del modelo (ejemplo: RMSE) PREDICCIÓNM
RMSE <- sqrt(mean((predicted_values - Y_test)^2))
print(paste("RMSE:", RMSE))[1] "RMSE: 243.682718711806"
¿Cuál sera la emisión de CO2 de un edificio que su fecha de emisión sea el 10/10/2023 con una demanda energética de 100.34 KWh/m2*año, su año de construcción fuera en el 1950 d.c., tenga una superficie de 204.22 m2, sus coordenadas sean [67 000, 78 000]m y tenga un tiempo de vida sea de 1053 días?
Con dichas especificaciones, el modelo nos arroja un valor de 0.47 Kg de CO2.