(8 min de lecture)

Dans cet article, je vous propose de tenter d’implémenter une prédiction des maladies cardiaques à partir de données d’une région présentant de grands risques d’en développer.

Le projet vise à prédire ces maladies en utilisant trois algorithmes de Machine Learning différents:

  • Support Vector Machine (SVM)
  • K Nearest Neighbors (KNN)
  • Artificial Neural Network (ANN)

L’idée est donc de savoir quelle est la meilleure approche.

Description des données

Source

Un échantillon rétrospectif d’hommes dans une région à haut risque de maladies cardiaques à l’Ouest du Cap, en Afrique du Sud.

Source de l’ensemble de données sur les maladies cardiaques en Afrique du Sud : https://www.openml.org/d/1498

Description

Il y a environ deux témoins par cas de coronaropathie. Beaucoup d’hommes atteints de maladies coronariennes ont suivi un traitement de réduction de la pression artérielle et d’autres programmes visant à réduire leurs facteurs de risque après leur apparition. Dans certains cas, les mesures ont été effectuées après ces traitements. Ces données sont tirées d’un ensemble de données plus vaste, décrit dans Rousseauw et dans al, 1983, South African Medical Journal.

Attributs

  1. Systolic blood pressure (Sbp) – Tension artérielle systolique
  2. Cumulative tobacco consumption (kg) – Consommation cumulée de tabac
  3. Low density lipoprotein (LDL-cholesterol) – Lipoprotéine de basse densité
  4. Adiposity – Adiposité
  5. Family history of heart disease (Present/Absent) – Antécédents familiaux de maladies cardiaques
  6. Type-A behavior – Comportement de type A
  7. Obesity – Obésité
  8. Current alcohol consumption – Consommation actuelle d’alcool
  9. Age during onset of condition – Âge au moment de l’apparition de l’affection
  10. CHD response – Réponse à la CHD

Nombre total de valeurs : 462

# Importation des bibliothèques principales
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib notebook

Préparation et Traitement des données

Dans cette partie, nous allons préparer et traiter les données pour ensuite les visualiser et les utiliser pour construire nos modèles de Machine Learning.

# Lecture des données
data = pd.read_csv('https://www.openml.org/data/get_csv/1592290/phpgNaXZe')
# Mise en place des colonnes
column = ['sbp','tobacco','ldl','adiposity','famhist','type','obesity','alcohol','age','chd']

data.columns=column

data.head()

Le tableau détermine les données brutes.

Nous n’avons pas de valeurs manquantes dans nos données et pour égaliser les valeurs des différents attributs, nous appliquons la mise à l’échelle des caractéristiques puis la mise à l’échelle Min-Max :

# Mise à l'échelle des caractéristiques, pour rendre les données catégorielles précises 
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
data['famhist']=encoder.fit_transform(data['famhist'])
data['chd']=encoder.fit_transform(data['chd'])
from sklearn.preprocessing import MinMaxScaler
scale = MinMaxScaler(feature_range =(0,100))

# fixer l'échelle de la valeur maximale et minimale de sbp dans une fourchette de 0 à 100, normaliser
data['sbp'] = scale.fit_transform(data['sbp'].values.reshape(-1,1))

Et les données sont maintenant les suivantes :

Et la description des données après le pré-traitement des données est la suivante :

Box plots des différentes caractéristiques

Visualisation des données

Après avoir comparé différents attributs entre eux, nous obtenons les résultats utiles suivants.

Le graphique de dispersion ci-dessus (obésité vs âge) nous donne quelques informations. Nous pouvons notamment observer des clusters (ou groupes) principalement dans les groupes d’âge suivants :

  • Avant l’âge de 20 ans
  • Après l’âge de 40 ans et surtout dans la cinquantaine

Dans le graphique de la consommation de tabac en fonction de l’âge, on peut voir que la consommation augmente après l’âge de 30 ans.

A partir du graphique de la consommation d’alcool en fonction de l’âge, on observe que la consommation maximale d’alcool commence juste après 25 ans.

Modèles de Machine Learning : Prédiction des maladies cardiaques

Dans cette partie, nous allons tester 3 approches différentes de Machine Learning pour réaliser la prédiction des maladies cardiaques.

Modèle 1 : Support Vector Machine (SVM)

Un Support Vector Machine (SVM) est un classificateur discriminatoire formellement défini par un hyperplan de séparation. En d’autres termes, à partir de données d’entraînement étiquetées (apprentissage supervisé), l’algorithme produit un hyperplan optimal qui catégorise les nouveaux exemples.
–> Description ici

from sklearn import svm
svm_clf = svm.SVC(kernel ='linear')
svm_clf.fit(X_train,y_train)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
    kernel='linear', max_iter=-1, probability=False, random_state=None,
    shrinking=True, tol=0.001, verbose=False)
y_pred_svm =svm_clf.predict(X_test)
y_pred_svm
array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1,
       0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0,
       0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0,
       0, 0, 0, 1, 0])
# Matrice de confusion
from sklearn.metrics import confusion_matrix
cm_svm = confusion_matrix(y_test, y_pred_svm)
cm_svm
array([[51,  9],
       [15, 18]])
from sklearn.metrics import accuracy_score
svm_result = accuracy_score(y_test,y_pred_svm)
print("Accuracy :",svm_result)
Accuracy : 0.7419354838709677

Exactitude (accuracy) obtenue pour le modèle SVM ~74%

Modèle 2 : k Nearest Neighbors (kNN)

En reconnaissance de formes, l’algorithme des k-plus proches voisins (k-NN) est une méthode non paramétrique utilisée pour la classification et la régression. Dans les deux cas, l’entrée consiste en k exemples d’entraînement les plus proches dans l’espace des caractéristiques.
Dans la classification k-NN, la sortie est une appartenance à une classe.
–> Description ici

from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors =5,n_jobs = -1,leaf_size = 60,algorithm='brute')
knn_clf.fit(X_train,y_train)
KNeighborsClassifier(algorithm='brute', leaf_size=60, metric='minkowski',
                     metric_params=None, n_jobs=-1, n_neighbors=5, p=2,
                     weights='uniform')
y_pred_knn = knn_clf.predict(X_test)
y_pred_knn
array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
       0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
       0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
       0, 0, 0, 1, 0])
# Matrice de confusion
from sklearn.metrics import confusion_matrix
cm_knn = confusion_matrix(y_test, y_pred_knn)
cm_knn
array([[49, 11],
       [22, 11]])
knn_result = accuracy_score(y_test,y_pred_knn)
knn_result
0.6451612903225806

Exactitude obtenue pour le KNN ~65%

Modèle 3 : Réseau de Neurones (ANN)

Les réseaux neuronaux artificiels ou systèmes connexionnistes sont des systèmes informatiques vaguement inspirés des réseaux neuronaux biologiques qui constituent nos cerveaux.
–> Description ici

import keras
from keras.models import Sequential
from keras.layers import Dense

# Initialiser ANN
classifier = Sequential()

# Ajout de la couche d'entrée et de la première couche cachée
classifier.add(Dense(output_dim = 6, init = 'uniform', activation = 'relu', input_dim = 9))

# Ajout de la seconde couche cachée
classifier.add(Dense(output_dim = 6, init = 'uniform', activation = 'relu'))

# Ajout de la couche de sortie
classifier.add(Dense(output_dim = 1, init = 'uniform', activation = 'sigmoid'))

# Compilation de ANN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Adapter ANN au set de training
classifier.fit(X_train, y_train, batch_size = 10, nb_epoch = 100)

# Faire les prédictions et évaluer le modèle

# Prédire les résultats du set de test
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)

# Faire la matrice de confusion
from sklearn.metrics import confusion_matrix
cm_annk = confusion_matrix(y_test, y_pred)

Exactitude obtenue par ANN ~ 74,5%

Comparaison des 3 approches

Après avoir appliqué les trois algorithmes de prédiction, nous obtenons les résultats suivants:

Machine Learning : Prédiction des maladies cardiaques
  1. Meilleure exactitude obtenue en ANN
  2. Meilleure précision (ou valeur prédictive positive) obtenue en KNN
  3. Meilleur rappel (ou sensibilité) en ANN

Par conséquent, l’utilisation du réseau neuronal artificiel (ANN) est la meilleure approche parmi les trois suivies par les K plus proches voisins et enfin le SVM (même sur de petits ensembles de données).

Pour en apprendre plus sur le Machine Learning, regardez mon cours en cliquant ici.
Pour le code complet, veuillez regarder ce notebook jupyter.

Machine Learning : Prédiction des maladies cardiaques