Sat. Nov 26th, 2022

Creación de un sistema de apoyo a la toma de decisiones clínicas con potentes herramientas de Python

Imagen de Patrick Assale @ Unsplash

Fondo

Recientemente me encargaron un proyecto cuyo objetivo era visualizar cómo crear una herramienta que pudiera ayudar a los médicos a identificar los riesgos de mortalidad en pacientes con COVID-19 que ingresan a la unidad de cuidados intensivos. Esta herramienta, también conocida como “sistema de apoyo a la toma de decisiones clínicas”, es necesaria para empoderar a los médicos con información de salud basada en datos, como los resultados de pacientes con COVID-19 anteriores o el riesgo actual de mortalidad del paciente, para tomar decisiones de atención bien informadas. verdadero manitas haría, pensé que la mejor manera de imaginar algo era créalo mí mismo. Y, como entusiasta de Python, pensé que habría muchas herramientas disponibles para hacerlo posible. Por lo tanto, este tutorial describe cómo creé un sistema de soporte de decisiones clínicas de COVID-19 con potentes bibliotecas de Python y proporciona los recursos para que usted mismo recree o vuelva a imaginar el proyecto.Adelanto del producto final: https://covidtriage.streamlitapp.com/

Esquema

Vi este proyecto a través de la lente de un problema de aprendizaje automático. Por lo tanto, el proyecto se describió de la siguiente manera: Obtener datos (pacientes de la unidad de cuidados intensivos que tenían COVID-19) Entrenar y probar un modelo de aprendizaje automático (fallecidos versus sobrevivientes) Implementar un modelo de aprendizaje automático en una interfaz de usuario

Instalación de bibliotecas

Las bibliotecas esenciales centrales de este proyecto incluyen Pandas, Pycaret, Shap y Streamlit. Todos los cuales se utilizan para abordar necesidades específicas. Pandas: manipulación y análisis de datos Pycaret: creación de canalizaciones de aprendizaje automático de bajo código Shap: análisis y visualización del impacto de las funciones en las predicciones del modelo Streamlit: desarrollo de aplicaciones impulsado por Python Plotly: gráficos interactivos de alta calidad Para instalar estas bibliotecas, abra un indicador de línea de comando o terminal e ingrese lo siguiente.pip install pandas
pip instalar pycaret
forma de instalación de pip
pip instalar streamlit
pip install plotly Las bibliotecas adicionales en este tutorial son componentes de Streamlit y se usaron para mejorar la interfaz de usuario/experiencia. pip install streamlit_option_menu
pip instalar streamlit_shap
pip install streamlit_echarts Uno de los principales obstáculos de este proyecto fue la adquisición de datos para el entrenamiento del modelo. Dado que no había bases de datos de código abierto disponibles de personas con COVID-19 en cuidados intensivos, pensé que la mejor ruta sería crear la mía. Para hacerlo, encontré un documento que aborda un problema similar. El documento a continuación describe varias características clave que influyeron en las predicciones de mortalidad en pacientes con COVID-19. Luego invertí libremente la ingeniería de estas funciones para generar un conjunto de datos proxy. Importar al azar como rand
importar pandas como pd
importar numpy como np
muestras = 1000edad_m = 58,0
edad_std = 9.0bun_m = 16.0
bollo_estándar = 6,5 creatina_m = 1,1
creatina = 0.3inr_m = 1.2
inr_std = 0.1survived = pd.DataFrame()
sobrevivió[‘Age’] = np.random.normal(loc=edad_m,escala=edad_estándar,tamaño=muestras)
sobrevivió[‘Gender’] = np.random.binomial(1, 0.367, tamaño=muestras)
sobrevivió[‘Blood Urea Nitrogen’] = np.random.normal(loc=bun_m,scale=bun_std,size=samples)
sobrevivió[‘Cardiovascular History’] = np.random.binomial(1, 0.291, tamaño=muestras)
sobrevivió[‘Neurological History’] = np.random.binomial(1, 0.16, tamaño=muestras)
sobrevivió[‘Int Norm Ratio’] = np.random.normal(loc=inr_m,escala=inr_std,tamaño=muestras)edad_m = 72.5
edad_std = 8.25bun_m = 30.0
bollo_std = 9,0 creatina_m = 1,5
creatina = 0.4inr_m = 1.3
inr_std = 0.1fallecido = pd.DataFrame()
fallecido[‘Age’] = np.random.normal(loc=edad_m,escala=edad_estándar,tamaño=muestras)
fallecido[‘Gender’] = np.random.binomial(1, 0.646, tamaño=muestras)
fallecido[‘Blood Urea Nitrogen’] = np.random.normal(loc=bun_m,scale=bun_std,size=samples)
fallecido[‘Cardiovascular History’] = np.random.binomial(1, 0.709, tamaño=muestras)
fallecido[‘Neurological History’] = np.random.binomial(1, 0.840, tamaño=muestras)
fallecido[‘Int Norm Ratio’] = np.random.normal(loc=inr_m,escala=inr_std,tamaño=muestras)Luego, combiné, mezclé y guardé el marco de datos para representar el conjunto de datos de entrenamiento de mi modelo.train = pd.concat([survived, deceased])
tren = tren.muestra(frac=1).reset_index(drop=True)
train.to_csv(‘COVID_TRAIN.csv’) A continuación, utilicé las funciones de clasificación supervisada de Pycaret para configurar, entrenar y evaluar un modelo que identifica a los fallecidos frente a los sobrevivientes.Una vez que el modelo se adecuaba a mis necesidades, comencé a crear la interfaz de usuario. Los tres componentes principales que consideré necesarios para los médicos fueron: Facilidad de uso Predicciones de modelos interpretables Exploración de características de pacientes actuales y pasados ​​Streamlit ofrece la capacidad de usar estrictamente la sintaxis de Python para crear hermosas aplicaciones web. Por lo tanto, la interfaz de usuario está construida únicamente con Streamlit y componentes relacionados.

Configuración

Instale bibliotecas y configure las configuraciones de página de Streamlit. Importe streamlit como st
importar pandas como pd
desde streamlit_option_menu importar option_menu
de pycaret.clasificación de importación *
importar plotly.express como px
forma de importación
desde streamlit_shap importar st_shap
de streamlit_echarts importar st_echarts#establecer configuraciones para la página streamlit
st.set_page_config(layout=”ancho”,
page_title=”Triage de COVID”,
page_icon=”chart_with_upwards_trend”)#ocultar barra de menú iluminada
hide_streamlit_style = “””

#MenúPrincipal {visibilidad: oculto;}
pie de página {visibilidad: oculto;}

“””
st.markdown(hide_streamlit_style, unsafe_allow_html=Verdadero)

Modelo

Inicialice los datos de entrenamiento y el modelo. # use pandas para leer datos de covid para el entrenamiento y la creación de modelos
tren = pd.read_csv(‘COVID_TRAIN.csv’)
#use pycaret para preprocesar y entrenar un modelo de aprendizaje automático supervisado por un árbol de decisión
exp = configuración (tren, objetivo = ‘clase’, silencioso = Verdadero, detallado = Falso)
dt = crear_modelo(‘dt’)

Barra de menús

Cree una barra de menú para cambiar entre el inicio de sesión y el triaje de COVID. #option menu del componente streamlit streamlit_option_menu
con st.sidebar:
seleccionado = menú_opción(Ninguno, [“Log In”, “COVID Triage”],
iconos=[‘house’, “list-task”],
menu_icon=”cast”, default_index=0, orientación=”vertical”)

Página de inicio de sesión

Crear lógica para la página de inicio de sesión simple que no funciona. Si se selecciona == ‘Iniciar sesión’:
st.title(‘Sistema de Apoyo a la Decisión Clínica de Riesgo de Mortalidad Covid 19’)
si ‘user_name’ no está en st.session_state:
st.session_state.user_name = ‘Nombre de usuario’
nombre_usuario = st.text_input(“Nombre de usuario”, valor = st.session_state.user_name)
st.session_state.user_name = nombre_usuario
contraseña = st.text_input(“Contraseña”, type=”contraseña”)
st.session_state.password = contraseña
si st.session_state.contraseña:
sc = “Bienvenido” + st.session_state.user_name + “continúe con la clasificación de COVID”
st.éxito(sc)

Página de clasificación de COVID-19: entradas del usuario

Cree widgets para tomar la entrada del usuario correspondiente a las funciones en los datos de entrenamiento.#página de clasificación de covid
Las entradas de funciones corresponden a datos de entrenamiento
si se selecciona == ‘Triage COVID’:
col1, col2, col3= st.columnas(3)
con col1:
nombre = st.text_input(“ID del paciente”)
con col2:
género = st.selectbox(“Género”, (0, 1), ayuda = “0 = Femenino, 1 = Masculino”)
con col3:
edad = st.number_input(“Edad”, paso = 1)ccol1, ccol2, ccol3, ccol4= st.columns(4)
con ccol1:
bollo = st.slider(“Nitrógeno de urea en sangre”, min_value=0, max_value=60)
con ccol2:
inr = st.slider(“Relación Internacional Normalizada”, min_value=0.88, max_value=1.66)
con ccol3:
honeuro = st.selectbox(“Historial de trastorno neurológico”, (0, 1), ayuda = “0 = Sin antecedentes de trastornos neurológicos, 1 = Historial de trastornos neurológicos”)
con ccol4:
hocard = st.selectbox(“Historial de trastorno cardiovascular”, (0, 1), help = “0 = Sin historial de trastorno cardiovascular, 1 = Historial de trastorno cardiovascular”)test = pd.DataFrame({“Edad”: [age]”Género”:[int(gender)],”Nitrógeno ureico en sangre”:[bun]”Historia cardiovascular”:[int(hocard)]”Historia neurológica”:[int(honeuro)]”Relación de norma interna”:[inr]})

Página de triaje de COVID-19: modelo de predicción y confianza

Configure la pantalla y la lógica para los valores de predicción y confianza.preds = predict_model(dt, test)
st.sidebar.text(‘Predicción de riesgo y confianza’)
presas[‘Mortality Risk’] = presiona[‘Label’].reemplazar([0,1], [‘Low Mortality Risk’, ‘High Mortality Risk’])
si presiona[‘Label’].iloc[0] == 0:
#mostrar si etiqueta = 0 (bajo riesgo de mortalidad)
st.sidebar.info(preds[‘Mortality Risk’].iloc[0])
liquidfill_option = {
“serie”: [{“type”: “liquidFill”, “data”: [preds[‘Score’].iloc[0]]}]
}
si presiona[‘Label’].iloc[0] == 1:
#display if label = 1 (alto riesgo de mortalidad)
st.sidebar.error(preds[‘Mortality Risk’].iloc[0])
liquidfill_option = {
“serie”: [{“type”: “liquidFill”, “data”: [preds[‘Score’].iloc[0]], ‘color’: [‘#ff0000’]}]
}
con st.sidebar:
Gráfico de relleno de #líquido con valor de confianza y color correspondiente al riesgo de mortalidad (alto = rojo, bajo = azul)
st_echarts(liquidfill_opción)
Explicación aditiva #shapley de los pesos de características en la predicción del modelo
explicador = shap.KernelExplainer(modelo = dt.predict_proba, datos = get_config(‘X_train’), enlace = “identidad”)
shap_value_single = explicador.shap_values(X = prueba)
st_shap(shap.force_plot(valor_base = explicador.valor_esperado[0],
shap_values ​​= shap_value_single[0]caracteristicas=prueba
))

Página de triaje de COVID-19: gráficos de pacientes

Lógica de configuración para mostrar las relaciones actuales del paciente con pacientes anteriores y características.st.text (“Pacientes anteriores de la UCI con COVID-19”)
df = entrenar.copiar()
para cols en df.drop([‘Unnamed: 0’, ‘class’]eje=1).columnas:
d.f.[‘Mortality Outcome’] = tren[‘class’].reemplazar([1,0], [‘Deceased’, ‘Survived’])
fig = px.histogram(df, x = cols, color = ‘Resultado de mortalidad’,
color_discrete_map = {‘Fallecido’:’rojo’,’Sobreviviente’:’azul’})
fig.add_vline(x=prueba[cols].iloc[0]line_dash=”punto”,
annotation_text=”Paciente actual”,
annotation_position=”arriba a la izquierda”,
anotación_tamaño_fuente=10,
annotation_font_color=”gris”
)
st.plotly_chart(fig, config=dict(
displayModeBar = Falso))

Poniendolo todo junto

La interfaz de usuario estaba lista para implementarse. Los pasos finales incluyeron guardar los requisitos, agregar todos los archivos a GitHub e implementar el servicio para compartir Streamlit. Para acceder al producto final, visite el enlace a continuación o constrúyalo usted mismo en su máquina local desde mi repositorio covidtriageStreamlit.https://covidtriage.streamlitapp.com/