Spaces:
Sleeping
Sleeping
import os | |
import math | |
import gradio as gr | |
from huggingface_hub import InferenceClient | |
# Configuraci贸n del cliente de Hugging Face para el modelo Llama | |
client = InferenceClient(model="meta-llama/Meta-Llama-3-8B-Instruct") | |
# Coeficientes obtenidos del modelo de regresion logistica | |
coef_intercepto = -5.123 | |
coef_edad = 0.045 | |
coef_sexo = 0.68 | |
coef_diabetes = 0.58 | |
coef_hipertension = 0.70 | |
coef_colesterolLDL = 0.012 | |
coef_colesterolHDL = -0.015 | |
coef_presionSistolica = 0.022 | |
coef_presionDiastolica = 0.018 | |
coef_fumador = 0.80 | |
def calcular_riesgo(edad, sexo, diabetes, hipertension, colesterolLDL, colesterolHDL, presionSistolica, presionDiastolica, fumador): | |
# Calcular el logit | |
logit = (coef_intercepto + | |
coef_edad * edad + | |
coef_sexo * (1 if sexo == "Hombre" else 0) + | |
coef_diabetes * (1 if diabetes == "S铆" else 0) + | |
coef_hipertension * (1 if hipertension == "S铆" else 0) + | |
coef_colesterolLDL * colesterolLDL + | |
coef_colesterolHDL * colesterolHDL + | |
coef_presionSistolica * presionSistolica + | |
coef_presionDiastolica * presionDiastolica + | |
coef_fumador * (1 if fumador == "S铆" else 0)) | |
# Calcular el riesgo (probabilidad) usando la funci贸n log铆stica | |
riesgo = 1 / (1 + math.exp(-logit)) | |
resultado = { | |
"edad": edad, | |
"sexo": sexo, | |
"diabetes": diabetes, | |
"hipertension": hipertension, | |
"colesterolLDL": colesterolLDL, | |
"colesterolHDL": colesterolHDL, | |
"presionSistolica": presionSistolica, | |
"presionDiastolica": presionDiastolica, | |
"fumador": fumador, | |
"riesgo_enfermedad_coronaria": f"{riesgo * 100:.2f}%" | |
} | |
comentario = generar_comentario(resultado) | |
resultado["comentario"] = comentario | |
return resultado | |
def generar_comentario(resultado): | |
prompt = (f"El paciente tiene {resultado['edad']} a帽os, es {resultado['sexo']}, " | |
f"{'tiene' if resultado['diabetes'] == 'S铆' else 'no tiene'} diabetes, " | |
f"{'tiene' if resultado['hipertension'] == 'S铆' else 'no tiene'} hipertensi贸n, " | |
f"tiene un nivel de colesterol LDL de {resultado['colesterolLDL']} y HDL de {resultado['colesterolHDL']}, " | |
f"su presi贸n sist贸lica es {resultado['presionSistolica']} y diast贸lica es {resultado['presionDiastolica']}, " | |
f"y {'es' if resultado['fumador'] == 'S铆' else 'no es'} fumador. " | |
f"El riesgo calculado de enfermedad coronaria es {resultado['riesgo_enfermedad_coronaria']}. " | |
f"Comente sobre este resultado.") | |
chat_history = [{"role": "system", "content": "Eres un asistente 煤til que proporciona respuestas en espa帽ol."}, {"role": "user", "content": prompt}] | |
response = client.chat_completion(messages=chat_history, max_tokens=500) | |
return response.choices[0].message.content | |
with gr.Blocks() as demo: | |
with gr.Row(): | |
with gr.Column(): | |
edad = gr.Number(label="Edad", value=40) | |
sexo = gr.Radio(label="Sexo", choices=["Hombre", "Mujer"], value="Hombre") | |
diabetes = gr.Radio(label="Diabetes", choices=["S铆", "No"], value="No") | |
hipertension = gr.Radio(label="Hipertensi贸n", choices=["S铆", "No"], value="No") | |
colesterolLDL = gr.Number(label="Colesterol LDL", value=2) | |
colesterolHDL = gr.Number(label="Colesterol HDL", value=3) | |
presionSistolica = gr.Number(label="Presi贸n Sist贸lica", value=120) | |
presionDiastolica = gr.Number(label="Presi贸n Diast贸lica", value=80) | |
fumador = gr.Radio(label="Fumador", choices=["S铆", "No"], value="No") | |
calcular_btn = gr.Button("Calcular") | |
output = gr.HTML(label="Resultado") | |
def mostrar_resultado(*args): | |
resultado = calcular_riesgo(*args) | |
resultado_html = f""" | |
<div style="color:black;"> | |
<h2>Datos del Usuario:</h2> | |
<table border="1" style="width:100%; border-collapse: collapse;"> | |
<tr><th>Edad</th><td>{resultado['edad']}</td></tr> | |
<tr><th>Sexo</th><td>{resultado['sexo']}</td></tr> | |
<tr><th>Diabetes</th><td>{resultado['diabetes']}</td></tr> | |
<tr><th>Hipertensi贸n</th><td>{resultado['hipertension']}</td></tr> | |
<tr><th>Colesterol LDL</th><td>{resultado['colesterolLDL']}</td></tr> | |
<tr><th>Colesterol HDL</th><td>{resultado['colesterolHDL']}</td></tr> | |
<tr><th>Presi贸n Sist贸lica</th><td>{resultado['presionSistolica']}</td></tr> | |
<tr><th>Presi贸n Diast贸lica</th><td>{resultado['presionDiastolica']}</td></tr> | |
<tr><th>Fumador</th><td>{resultado['fumador']}</td></tr> | |
</table> | |
<hr> | |
<h2>Resultados:</h2> | |
<table border="1" style="width:100%; border-collapse: collapse;"> | |
<tr><th>Riesgo de Enfermedad Coronaria</th><td>{resultado['riesgo_enfermedad_coronaria']}</td></tr> | |
<tr><th>Comentario</th><td>{resultado['comentario']}</td></tr> | |
</table> | |
</div> | |
""" | |
return resultado_html | |
calcular_btn.click( | |
mostrar_resultado, | |
inputs=[edad, sexo, diabetes, hipertension, colesterolLDL, colesterolHDL, presionSistolica, presionDiastolica, fumador], | |
outputs=[output] | |
) | |
if __name__ == "__main__": | |
demo.launch() | |