Spaces:
Sleeping
Sleeping
import logging | |
from fastapi import FastAPI, HTTPException | |
from pydantic import BaseModel | |
import numpy as np | |
import pandas as pd | |
import tensorflow as tf | |
from sklearn.preprocessing import StandardScaler, OneHotEncoder | |
from sklearn.compose import ColumnTransformer | |
# Configurar el logger | |
logging.basicConfig(level=logging.INFO) | |
app = FastAPI() | |
# Cargar el modelo preentrenado desde el archivo .h5 | |
try: | |
model = tf.keras.models.load_model('Model.h5') | |
logging.info("Modelo cargado correctamente.") | |
except Exception as e: | |
logging.error("Error cargando el modelo: %s", e) | |
# Cargar el conjunto de datos para ajuste del preprocesador | |
try: | |
file_path = 'heart.csv' | |
df = pd.read_csv(file_path) | |
logging.info("Conjunto de datos cargado correctamente.") | |
except Exception as e: | |
logging.error("Error cargando el conjunto de datos: %s", e) | |
# Identificar columnas num茅ricas y categ贸ricas | |
num_features = ['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak'] | |
cat_features = ['Sex', 'ChestPainType', 'FastingBS', 'RestingECG', 'ExerciseAngina', 'ST_Slope'] | |
# Preprocesamiento: Escalar caracter铆sticas num茅ricas y codificar caracter铆sticas categ贸ricas | |
try: | |
preprocessor = ColumnTransformer( | |
transformers=[ | |
('num', StandardScaler(), num_features), | |
('cat', OneHotEncoder(handle_unknown='ignore'), cat_features) | |
]) | |
X = df.drop('HeartDisease', axis=1) | |
preprocessor.fit(X) | |
logging.info("Preprocesador ajustado correctamente.") | |
except Exception as e: | |
logging.error("Error ajustando el preprocesador: %s", e) | |
class HeartDiseaseInput(BaseModel): | |
age: float | |
sex: str | |
chest_pain_type: str | |
resting_bp: float | |
cholesterol: float | |
fasting_bs: int | |
resting_ecg: str | |
max_hr: float | |
exercise_angina: str | |
oldpeak: float | |
st_slope: str | |
def read_root(): | |
return {"Hello": "World!"} | |
def predict(input: HeartDiseaseInput): | |
try: | |
# Crear un DataFrame con los datos de entrada | |
input_data = pd.DataFrame({ | |
'Age': [input.age], | |
'Sex': [input.sex], | |
'ChestPainType': [input.chest_pain_type], | |
'RestingBP': [input.resting_bp], | |
'Cholesterol': [input.cholesterol], | |
'FastingBS': [input.fasting_bs], | |
'RestingECG': [input.resting_ecg], | |
'MaxHR': [input.max_hr], | |
'ExerciseAngina': [input.exercise_angina], | |
'Oldpeak': [input.oldpeak], | |
'ST_Slope': [input.st_slope] | |
}) | |
logging.info("Datos de entrada recibidos: %s", input_data) | |
# Aplicar preprocesamiento | |
input_data_preprocessed = preprocessor.transform(input_data) | |
logging.info("Datos preprocesados: %s", input_data_preprocessed) | |
# Realizar la predicci贸n | |
prediction_prob = model.predict(input_data_preprocessed) | |
predicted_class = (prediction_prob > 0.3).astype(int) | |
logging.info("Probabilidad de predicci贸n: %s", prediction_prob) | |
logging.info("Clase predicha: %s", predicted_class) | |
# Interpretar la predicci贸n | |
result = "Tiene enfermedad card铆aca." if predicted_class == 1 else "No tiene enfermedad card铆aca." | |
return {"prediction": result, "probability": prediction_prob[0][0]} | |
except Exception as e: | |
logging.error("Error en la predicci贸n: %s", e) | |
raise HTTPException(status_code=500, detail=str(e)) | |