Una de las mejores formar para poner en pr谩ctica nuestros conocimientos de Inteligencia Artificial y, en especial, de Machine Learning, es desarrollando proyectos por nuestra cuenta. De esta forma practicamos no solamente la parte te贸rica de los algoritmos de Machine Learning sino tambi茅n mejoramos nuestras habilidades de programaci贸n, en este caso de Python. Adicional a todo esto, y algo fundamental es que cada uno de estos proyectos que desarrollamos practicando nuestros conocimientos pueden servir para ingresarlos a nuestro portafolio de Machine Learning el cual podemos mostrar al momento de buscar trabajo dentro de esta 谩rea.

Por esta raz贸n ac谩 te traigo un proyecto en donde desarrollaremos un modelo para predecir si una persona puede sufrir una enfermedad en el coraz贸n.

En una regi贸n de Sud谩frica, los hombres de esa comunidad tienen un alto riesgo de padecer enfermedades card铆aca. Por tal motivo se han tomado algunos datos m茅dicos y de acuerdo a estos se han determinado si es posible padecer la enfermedad o no.

El link para descargar los datos es el siguiente: https://www.openml.org/d/1498

Los atributos que contiene este conjunto de datos son los siguientes:

Sbp: que se refiere a la presi贸n arterial sist贸lica

Tabaco: la acumulaci贸n en kg de tabaco dentro de su organismo

Ldl: prote铆na de baja densidad del colesterol

Adiposity

Antecedentes familiares de padecer alguna enfermedad card铆aca

Comportamiento Tipo-A

Obesidad

Consumo recurrente de alcohol

Enfermedad card铆aca

Recuerda que estos son t茅rminos m茅dicos, por lo que es muy probable que no entiendas la mayor铆a de ellos. Lo que s铆 debes saber es que la 煤ltima columna ser谩 nuestros datos objetivos, es decir esos ser谩n los datos que vamos a predecir.

Entonces comencemos a desarrollar el programa.

Lo primero ser谩 importar la librer铆a b谩sica que vamos a utilizar, Pandas para manejar los datos.

### IMPORTAR LIBRER脥AS ###
import pandas as pd

Seguidamente importamos los datos. Este es el mismo procedimiento que realizamos siempre, utilizamos read_csv y colocamos el nombre exacto del archivo junto a su extensi贸n, todo esto debe estar entre comillas.

### IMPORTAR LOS DATOS ###
data = pd.read_csv('phpgNaXZe.csv')
data.head()

Si imprimimos los datos que acabamos de exportar podemos observar que los nombres de las columnas se refieren a una n煤meraci贸n V1 hasta V9. Por esta raz贸n es conveniente cambiar estos nombres por los reales de cada columna. Esta informaci贸n la obtenemos directamente de la p谩gina donde descargamos los datos.

proyecto 1

Por lo tanto, definimos la variable columnas y colocamos los nuevos nombres. Debes tener cuidado en el orden que escribes cada nombre, este orden debe coincidir con el orden de las columnas dispuestas.

Ahora agregamos estos nombres a nuestros datos, para ello nos valemos de la instrucci贸n 鈥渃olumns鈥 que nos proporciona Panda para realizar este cambio.

#Colocar nombres a las columnas
columnas = ['sbp','Tabaco','ldl','Adiposity','Familia','Tipo','Obesidad','Alcohol','Edad','chd']
data.columns=columnas
data.head()

Imprimamos el resultado final. Como puedes ver ahora nuestros datos tienen los nombres respectivos para cada una de las columnas.

proyecto 2

Continuemos con el an谩lisis de los datos.

Lo primero es verificar el formato que contiene nuestros datos, para ello implementamos la instrucci贸n dtypes.

#Conocer el formato de los datos
data.dtypes

proyecto 3

Como podemos observar los datos son enteros y flotantes, por lo que no es necesario realizar un procesamiento mayor en cuanto al tipo de datos.

Posteriormente verificamos si se cuentan con datos perdidos. Para esto nos apoyamos de la instrucci贸n isnull y sumamos los resultados. De acuerdo a los resultados obtenidos no se cuentan con ning煤n dato perdido.

#Conocer los datos nulos
data.isnull().sum()

proyecto 4

Seg煤n el an谩lisis de datos realizado podemos determinar que no existe tanto trabajo para el procesamiento de los datos. Pero, esto no es tan cierto. Ya que si detallas los datos podr谩s observar de dos detalles.

El primero es que las columnas 鈥渇amilia鈥 y 鈥渃hd鈥, los datos son 1 y 2, esto lo podemos cambiar por 0 y 1.

A su vez si observas los valores de la columna 鈥渟bp鈥 podr谩s ver que est谩n en una escala mucho mayor a diferencia de las otras columnas. Por tal motivo debemos ajustar esta escala para obtener un mejor resultado.

De acuerdo a esto, realicemos el procesamiento de los datos.

Lo primero que haremos es corregir los valores de las columnas 鈥渇amilia鈥 y 鈥渃hd鈥. Para este prop贸sito sklearn y, m谩s espec铆ficamente, preprocessing importamos labelencoder. Esta funci贸n se trata de codificar los datos de una etiqueta y nos facilita enormemente el trabajo.

Importado esto procedemos a utilizarlos.

Definimos la variable 鈥渆ncoder鈥 como la funci贸n 鈥淟abelEncoder鈥 y la implementamos sobre las columnas que queremos transformar, utilizando la instrucci贸n fit_transform.

#Cambiar los datos de Familia y CHD en digitales
from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
data['Familia']=encoder.fit_transform(data['Familia'])
data['chd']=encoder.fit_transform(data['chd'])
data.head()

Veamos como quedaron ambas columnas.

proyecto 5

Donde anteriormente hab铆a un 2 ahora hay un 1 y donde hab铆a un 1 ahora ese valor es 0. Eso era justamente lo que esper谩bamos.

Ahora procedemos a escalar los valores de la columna 鈥渟bp鈥.

Para esto volvemos a utilizar la librer铆a sklearn preprocessing e importamos MinMaxScaler. Con esta funci贸n podemos establecer un rango m铆nimo y m谩ximo para los valores definidos y los transforma en ese rango.

El siguiente paso es el de definir los rangos que vamos a implementar, por lo tanto los definimos entre 0 y 100, es decir los valores dentro de la columna 鈥渟bp鈥 estar谩n dentro de la escala de 0 y 100.

Ahora implementamos la funci贸n definida sobre la columna que queremos escalar e imprimimos los resultados.

#Escalamos los valores de la columna sbp
from sklearn.preprocessing import MinMaxScaler
scale = MinMaxScaler(feature_range =(0,100))
data['sbp'] = scale.fit_transform(data['sbp'].values.reshape(-1,1))
data.head()

proyecto 6

Como puedes observar los nuevos valores ahora se encuentran entre un rango de 0 y 100 y ninguno de ellos supera estos valores.

Perfecto, ahora si tenemos nuestros datos listos para poder utilizarlos dentro de los algoritmos de Machine Learning. Pero antes de implementar este procedimiento visualizamos los datos.

Para esto realizaremos varias gr谩ficas con los datos disponibles.

Lo primero que graficaremos ser谩 la obesidad de acuerdo a la edad. En este caso utilizaremos un c贸digo sencillo para realizar la gr谩fica. Simplemente indicamos el conjunto de datos punto plot y definimos los valores que se graficaran en los ejes 鈥渪鈥 y 鈥測鈥, el tipo de gr谩fica ser谩 de dispersi贸n o scatter y el tama帽o de la figura. Listo, con este c贸digo sencillo podemos realizar una gr谩fica.

#Visualizar la obesidad de acuerdo a la edad
data.plot(x='Edad',y='Obesidad',kind='scatter',figsize =(10,5))

Veamos los datos graficados.

proyecto 7

Seg煤n esta informaci贸n a medida que se aumenta de edad aumenta la obesidad en la persona. Solamente hay casos aislado cuando esto no sucede.

Grafiquemos ahora el consumo del tabaco de acuerdo a la edad. El c贸digo a utilizar ser谩 exactamente el mismo que se explico anteriormente.

#Visualizar el consumo de tabaco de acuerdo a la edad
data.plot(x='Edad',y='Tabaco',kind='scatter',figsize =(10,5))

Veamos el gr谩fico obtenido.

proyecto 8

Ac谩 podemos ver m谩s claramente que a medida que aumenta la edad aumenta significativamente el consumo de tabaco. Datos que en ocasiones pensar铆amos que es al contrario, pero con esta informaci贸n podemos ver que no es as铆.

Finalmente grafiquemos el consumo de alcohol de acuerdo a la edad. Ac谩 volvemos a implementar el mismo c贸digo explicado previamente.

#Visualizar el consumo de alcohol de acuerdo a la edad
data.plot(x='Edad',y='Alcohol',kind='scatter',figsize =(10,5))

El resultado obtenido se puede determinar que el consumo de alcohol se empieza a partir de los 20 a帽os y se mantiene a lo largo de los a帽os.

proyecto 9

Se pueden crear muchas m谩s gr谩ficas con los datos que tenemos disponibles, te recomiendo que practiques esto por tu cuenta, de esta forma mejoras tus habilidades en el desarrollo de visualizaciones de datos.

Ahora si, construyamos el modelo de Machine Learning.

Lo primero ser谩 importar las librer铆as que utilizaremos para construir y probar el modelo.

La primera librer铆a ser谩 train_test_split que la utilizaremos para separar los datos de entrenamiento y prueba.

Importamos el algoritmo a utilizar que ser谩 SVM o m谩quinas de vectores de soporte. Recuerda que este es un problema de clasificaci贸n, ac谩 queremos predecir de que si existe alguna enfermedad de coraz贸n o no.

Por 煤ltimo importamos las funciones para evaluar el modelo que obtengamos. La primera ser谩 la matriz de confusi贸n y tambi茅n importamos las funciones de exactitud y precisi贸n del modelo.

### AN脕LISIS DE MACHINE LEARNING ###
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, precision_score

Realizado esto, procedemos a definir las variables dependientes e independientes.

Para 鈥測鈥 ser谩 igual a la columna 鈥渃hd鈥, mientras que 鈥淴鈥 ser谩 igual al resto de valores de nuestro conjunto de datos.

#Definir las variable dependiente e independientes
y = data['chd']
X = data.drop('chd', axis =1)

Separamos los datos de entrenamiento y prueba, utilizando la instrucci贸n train_test_split.

#Separar los datos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state=1)

Definimos el algoritmo a utilizar, que como se indic贸 anteriormente ser谩 el de M谩quinas Vectores de Soporte, junto a un kernel lineal. En caso de que no entiendas que es un kernel te recomiendo que revises la informaci贸n que tengo publicada al respecto en donde explico toda esto.

#Definir el algoritmo
algoritmo = svm.SVC(kernel ='linear')

Entrenamos el modelo junto con los datos de entrenamiento que separamos previamente.

#Entrenar el algoritmo
algoritmo.fit(X_train, y_train)

Y finalmente realizamos una predicci贸n junto con el modelo obtenido y los datos de prueba.

#Realizar una predicci贸n
y_test_pred = algoritmo.predict(X_test)

Veamos que tan bien es el modelo obtenido, para esto utilizamos las m茅tricas que importamos previamente.

La primera a evaluar ser谩 la matriz de confusi贸n.

#Se calcula la matriz de confusi贸n
print(confusion_matrix(y_test, y_test_pred))

proyecto 10

Los valores obtenidos es el de 67 datos correctos y 26 datos incorrectos. Recuerda que en la diagonal principal se muestran los valores predichos correctamente mientras que en la diagonal secundario est谩n representado los datos err贸neos. En caso de que no entiendas esto, puedes revisar la informaci贸n de la matrices de confusi贸n que fue publicada en el blog.

Con esto podemos ya decir que el modelo no acerto correctamente un gran n煤mero de datos. Pero veamos la precisi贸n y la exactitud del mismo.

#Se calcula la exactitud y precisi贸n del modelo
accuracy_score(y_test, y_test_pred)
precision_score(y_test, y_test_pred)

proyecto 11

Implementando las funciones importadas anteriormente de la librer铆a metrics de sklearn podemos decir que la exactitud del modelo es de 0,72 mientras que la precisi贸n es de 0,526. Recuerda que ambos valores se refieren a dos t茅rminos completamente distintos y que fueron explicados en la informaci贸n publicada de la m茅tricas de los algoritmos de clasificaci贸n.

La informaci贸n obtenida ac谩 reafirma lo obtenido en la matriz de confusi贸n.

Te recomiendo que por tu cuenta realices mejoras al calculo del modelo, algunos cosas que puedes hacer es probar con varios algoritmos de clasificaci贸n y ver si se mejora los datos obtenidos. Tambi茅n puedes probar seleccionando las caracter铆sticas m谩s significativa y verificar los resultados.

Recuerda que para mejorar en el 谩rea de Machine Learning debes realizar proyectos por tu cuenta o inclusive mejorar los que ya est谩n publicados, de esta forma mejorar谩s las habilidades dentro de este campo.

En caso de que te haya gustado este proyecto y quieras seguir desarrollando proyectos de este tipo e inclusivo m谩s complicado que estos, tengo un curso en donde realizo 5 ejercicios pr谩cticos de Machine Learning en donde puedes poner en pr谩ctica tus conocimientos y desarrollar junto a mi estos ejercicios.

En todos los ejercicios se tomaron datos de la vida real y se explica paso a paso el desarrollo de ellos Si quieres m谩s informaci贸n sobre este curso puedes ingresar al link de la descripci贸n.

Adicionalmente te recomiendo que te suscribas al blog y al canal para que no te pierdas de ning煤n video de esta serie, ac谩 tambi茅n podr谩s encontrar bastante informaci贸n t茅cnica gratis que te ser谩n de bastante ayuda para tu aprendizaje.

4 comentarios en “Proyecto: Predecir Enfermedades del Coraz贸n en Sud谩frica”

  1. Hola, 驴me podr铆as ayudar a resolver una duda?
    驴Por qu茅 motivo se cambian los datos de 芦sbp禄? 驴No cambiarlos afectar铆a en el resultado final ?

    1. Hola David, lo que se hace es escalarlo, es decir aplicando estad铆sticas se ajustan esos datos en una escala similar al resto de las otras variables. Si afecta el resultado final pero de la mejor manera, si se dejar谩 con los datos originales tambi茅n afectar铆a el resultado final pero creando un modelo no tan preciso. Saludos.

Deja un comentario

Tu direcci贸n de correo electr贸nico no ser谩 publicada.