Comparación de Modelos de Machine Learning para la Predición de Enfermedades Cardiacas¶
Este es un ejemplo de comparacion de modelos de machine learning y Analisis Exploratorio de Datos de enfermedades cardiovasculares. El dataset fue descargado desde la Pagina de Repositorios de la Universidad de California, Irvine.
Lo primero es importar todas las librerias necesarias para el EDA y la posterior implementación de los algoritmos de machine learning.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
url="https://raw.githubusercontent.com/jonathan-marin-pavia/Pandas/master/proc_heart_cleve_3_withheader.csv"
data_name="https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/heart-disease.names"
df=pd.read_csv(url)
Echemos un vistazo a las primeras instancias de datos de nuestro conjunto:
df.head()
Un breve vistazo a los estadisticos descriptivos se muestra como sigue:
df.describe()
Miremos ahora información mas detallada de nuestro conjunto de datos:
df.info()
df.shape
df.isnull().sum()
#df.isnull().values.any() # Se puede observar que no hay datos nulos en el dataset. Otras formas de chequearlo son las siguientes:
Definimos X e y
X=df.iloc[:,1:]
y=df["Disease"]
print(X.shape)
print(y.shape)
Tenemos ahora una matrix X de 299 registros y 18 caracteristicas y un vector y de 299 instancias
El Número de pacientes sin/con enfermedades cardiovasculares.
df["Disease"].value_counts()
Hay 138 pacientes que presentan enfermedades cardiacas. A continuacion se visualizan.
sns.countplot(df["Disease"], palette="RdBu_r" )
Número de pacientes sin/con enfermedades cardiovasculares según su edad.
plt.figure(figsize=(15,10))
sns.countplot(x="Age", hue="Disease", data=df, palette="RdBu_r")
Ahora se hace una analisis de las correlaciones entre cada uno de los atributos.
df.corr()
Se visualizan estas correlaciones con un mapa de calor.
plt.figure(figsize=(15,15))
sns.heatmap(df.corr(), annot=True, cmap="Blues", fmt=".0%")
X_train, X_test, y_train, y_test=train_test_split(X, y, test_size=0.25)
sc=StandardScaler()
X_train=sc.fit_transform(X_train)
X_test=sc.transform(X_test)
X_train.shape
X_test.shape
y_train.shape
y_test.shape
def modelos(X_train,y_train):
# Regression logistica
from sklearn.linear_model import LogisticRegression
log=LogisticRegression(max_iter=100000)
log.fit(X_train,y_train)
# Árboles de decisión
from sklearn.tree import DecisionTreeClassifier
arbol=DecisionTreeClassifier(criterion = "entropy", random_state=0)
arbol.fit(X_train,y_train)
#RFC
from sklearn.ensemble import RandomForestClassifier
forest=RandomForestClassifier(n_estimators=10, criterion = "entropy", random_state=0)
forest.fit(X_train,y_train)
#KNN
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=10)
knn.fit(X_train, y_train)
#imprimir la exactitud de cada modelo en el dataset de entrenamiento
print("[0]Exactitud del entrenamiento Logistic Regression:",log.score(X_train,y_train))
print("[1]Exactitud del entrenamiento Decision Tree Classifier:",arbol.score(X_train,y_train))
print("[2]Exactitud del entrenamiento Random Forest Classifier:",forest.score(X_train,y_train))
print("[3]Exactitud del entrenamiento KNN Classifier:",knn.score(X_train,y_train))
return log, arbol, forest, knn
model = modelos (X_train,y_train)
Esto nos muestra que el clasificador Decision Tree esta sobreajustado y no se puede tomar un clasificador solo basandose en los datos de entrenamientos. Testeando y evaluando los clasificadores tenemos lo siguiente:
from sklearn.metrics import confusion_matrix
for i in range(len(model)):
print ("model: ",i)
cm=confusion_matrix(y_test, model[i].predict(X_test))
TP=cm[0][0]
TN=cm[1][1]
FN=cm[1][0]
FP=cm[0][1]
print(cm)
print("La exactitud del modelo en los datos de prueba es= ", (TP+TN)/(TP+TN+FN+FP))
print()
Evaluando el modelo por exactitud vemos que el clasificador de Random Forest nos da un valor de 85.33%
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.