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
- Systolic blood pressure (Sbp) – Tension artérielle systolique
- Cumulative tobacco consumption (kg) – Consommation cumulée de tabac
- Low density lipoprotein (LDL-cholesterol) – Lipoprotéine de basse densité
- Adiposity – Adiposité
- Family history of heart disease (Present/Absent) – Antécédents familiaux de maladies cardiaques
- Type-A behavior – Comportement de type A
- Obesity – Obésité
- Current alcohol consumption – Consommation actuelle d’alcool
- Age during onset of condition – Âge au moment de l’apparition de l’affection
- 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 :
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:
- Meilleure exactitude obtenue en ANN
- Meilleure précision (ou valeur prédictive positive) obtenue en KNN
- 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.