-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrebound_streamlit.py
135 lines (106 loc) · 5.58 KB
/
rebound_streamlit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import pickle
import streamlit as st
import pandas as pd
import numpy as np
st.set_page_config(layout="wide")
col1, col2, col3 = st.columns((1,1,1))
with col3:
st.image("Brain Technology_Full color.jpg")
st.markdown("# Esclerometría y Machine Learning")
st.markdown("***")
st.write("Esta web app utiliza un algoritmo de machine learning (XGBoost) para mejorar la predicción de la "
"resistencia del hormigón mediante el uso de un ensayo esclerométrico.")
st.write("El estudio que dió origen a esta web app puede encontrarse en el siguiente [repositorio](https://github.com/mbbau/About-rebound-test-and-its-models-of-prediction)")
st.markdown("**Nota:** La presente web app fue calibrada para un esclerómetro puntual y las predicciones serán válidas para el rebote tomado de ese esclerómetro.")
# Selección de nuevas variables dadas por el usuario.
# La lista de variables a entregar por el usuario son:
# ["TMN", "As. Obj.","Especificada", "Tenor", "Paston", "Cemento","Edad", "Rebote"]
st.sidebar.subheader("Selección de variables")
Rebote = st.sidebar.number_input("Promedio rebote esclerometría", min_value=20, max_value=50)
Edad = st.sidebar.number_input("Edad del hormigón", min_value=3)
Cemento = st.sidebar.selectbox("Cemento", options = ["Loma Negra", "Holcim", "Avellaneda"])
Paston = st.sidebar.selectbox("¿Es un pastón de laboratorio?", options = ["Si", "No"])
Tenor = st.sidebar.number_input("Tenor cemento teórico", min_value = 300, max_value = 500)
Especificada = st.sidebar.selectbox("Resistencia Especificada", options = ["13", "17", "21", "25", "30", "35"])
Piedra = st.sidebar.selectbox("Tamaño Máximo Nominal", options = ["12", "19", "25", "30"])
st.markdown("***")
st.subheader("Variables Nuevas")
st.write("Utilice el panel lateral para seleccionar las variables del hormigón a analizar. "
"Las variables ingresadas por el usuario son:")
st.markdown("* **Rebote:** {}".format([Rebote]))
st.markdown("* **Edad:** {} en días".format([Edad]))
st.markdown("* **Cemento:** {}".format([Cemento]))
st.markdown("* **¿La muestra proviene de un pastón?:** {}".format([Paston]))
st.markdown("* **Tenor Cemento Teórico:** {} en kilogramos".format([Tenor]))
st.markdown("* **Resistencia Especificada** {} en Mepascales".format([Especificada]))
Piedra_12, Piedra_19, Piedra_25, Piedra_30 = 0, 0, 0, 0
if Piedra == "12":
Piedra_12 = 1
elif Piedra == "19":
Piedra_19 = 1
elif Piedra == "25":
Piedra_25 = 1
elif Piedra == "30":
Piedra_30 = 1
Especificada_13, Especificada_17, Especificada_21, Especificada_25, Especificada_30, Especificada_35 = 0, 0, 0, 0, 0, 0
if Especificada == "13":
Especificada_132 = 1
elif Especificada == "17":
Especificada_17 = 1
elif Especificada == "21":
Especificada_21 = 1
elif Especificada == "25":
Especificada_25 = 1
elif Especificada == "30":
Especificada_30 = 1
elif Especificada == "35":
Especificada_35 = 1
Paston_No , Paston_Si = 0, 0
if Paston == "Si":
Paston_Si = 1
else:
Paston_No = 1
Cemento_Avellaneda, Cemento_Holcim, Cemento_Loma_Negra = 0, 0, 0
if Cemento == "Avellaneda":
Cemento_Avellaneda = 1
elif Cemento == "Holcim":
Cemento_Holcim = 1
elif Cemento == "Loma Negra":
Cemento_Loma_Negra = 1
xgb_pickle = open("XGB_model.pickle", "rb")
regressor = pickle.load(xgb_pickle)
xgb_pickle.close()
x_nuevo = np.array([[Tenor, Edad, Rebote, Piedra_12, Piedra_19, Piedra_25, Piedra_30,
Especificada_13, Especificada_17, Especificada_21, Especificada_25,
Especificada_30, Especificada_35, Paston_No, Paston_Si,
Cemento_Avellaneda, Cemento_Holcim, Cemento_Loma_Negra]])
y_predict = int(regressor.predict(x_nuevo))
st.markdown("***")
st.subheader("Predicción de Resistencia")
st.write("La resistencia en Megapascales estimada del hormigón analizado es: {}".format(y_predict))
st.markdown("***")
# Gráficos que caracterizan el nuevo modelo
st.subheader("Importancia de los parámetros")
st.write("En el siguiente gráfico, pueden observarse la importancia de las diferentes variables utilizadas para "
"realizar la predicción, basado en el cálculo de SHAP Values. Como se puede apreciar, existe una fuerte "
"Correlación entre la resistencia y el rebote, pero además, la presencia de las variables extra también arroja "
"información sobre la resistencia del hormigón. SHAP (Shapley Additive exPlanations) es un enfoque basado "
"en la teoría de juegos que busca explicar los resultado obtenidos por los modelo de machine learning")
st.image("Feature_Shap_Values.png")
st.markdown("Para más información sobre los Shap Values dirigirse a [SHAP](https://shap.readthedocs.io/en/latest/index.html)")
st.markdown("***")
st.subheader("Distribución de valores residuales")
st.write("A continuación pueden observarse las predicciones obtenidas por el modelo junto con la distribución de "
"residuales obtenida por el mismo. Este gráfico permite establecer la distribución de los errores "
"obtenidos por la estimación realizada de la resistencia.")
st.image("Residuals.png")
st.markdown("***")
st.subheader("Comparación de residuales con Regresión Lineal")
st.write("Tal como puede apreciarse en las figuras siguientes, la distribución de los residuales para el método"
"tradicional con el que se utiliza la esclerometría, comparado con el nuevo método, indica una disminución"
"en los errores de la estimaciones de la resistencia del hormigón.")
col_1, col_2 = st.columns((1,1))
with col_1:
st.image("Linear_Model_Residuals.png")
with col_2:
st.image("XGBoost_Residuals.png")