apprentissage d’arythmies cardiaques par icl et aleph · plan z contexte de l’étude et...
TRANSCRIPT
Apprentissage d’arythmiescardiaques par ICL et Aleph
René Quiniou - Marie-Odile Cordier (IRISA)Céline Fildier (DEA U. Lyon)Guy Carrault - Feng Wang (LTSI)Philippe Mabo (CHU Rennes)
Plan
z Contexte de l’étude et éléments de cardiologiez Programmation logique inductive pour
l’apprentissage d’arythmiesz ICLz ALEPHz Bilan
Motivations
z Objectif : amélioration des systèmes desurveillance de patients
x réduire le nombre de fausses alarmesx produire de meilleurs diagnosticsx améliorer les explications
z Contexte : monitoring cardiaquex unités de soins intensifsx enregistreurs ambulatoires (Holter)x prothèses : stimulateurs, défibrillateurs
*Caractérisations des situations pathologiques
Méthode
z Utiliser l’ECG (reflète l’activité cardiaque) Èz Codage symbolique de l’ECG en événements
datésy traitement de signal
z Analyse continue du flot d’événementsy reconnaissance de chroniques
z Acquisition d’ensembles de chroniques Èreprésentant des arythmiesy apprentissage automatique
Vue du système
z
0 1000 2000 3000 4000
Transformation
d’ECG numérique
en ECG symbolique
Reconnaissancede chroniques
t
P(normal) P(normal)
t0 t1 t2 t3 t4
QRS(normal) QRS(normal)
Arythmie
Base dechroniques
Apprentissagepar PLI
Base deDonnées
Codagesymbolique
du signal
Plusieurs réalisations de la même arythmie
QRS(anormal)
Modèlecardiaque
Hors ligneEn ligne
Apprentissage d’arythmiesà partir d’ECG
z Caractérisation d’une arythmie : Èy ensemble d’événements + contraintes*chronique
z Pourquoi apprendre?y produire des caractérisations discriminantes,
robustes, explicatives, …y prendre en compte les nouveaux capteursy caractériser les poly-arythmies
z Quelle base d’apprentissage?
Apprentissage inductif
z Conjecture de Muggleton :y in domains that are naturally structural, ILP will
significantly outperform simpler feature-based methodsthat can only use preselected attributes
*Avantages de l’apprentissage parprogrammation logique inductive (PLI)y relations du premier ordrey règles plus naturelles et plus intelligibles
Apprentissage multiclassex B une théorie du domainex E l’ensemble de tous les exemplesx Cp les exemples positifs associés à la classe Cx Cn = E - Cp les exemples négatifs de la classe Cx LH le langage spécifiant les clauses acceptables
y pour chaque classe C trouver une théorie clausale(hypothèse) HC ⊂ LH telle que :
x pour tout exemple p de Cp, M(B U p) est une interprétationsatisfaisant la théorie cible HC (B ∧ HC= Cp )
x pour tout exemple n de Cn, M(B U n) est une interprétation nesatisfaisant pas la théorie cible HC (B ∧ HC ∧ Cn≠ �)
Apprentissage multiclasse:données
z Définir :y le langage de représentation des exemples
*base d’exemples
y le langage de représentation des concepts*biais
y la théorie du domaine*lien entre langage des exemples et langage des concepts*connaissance supplémentaire facilitant l’apprentissage
Codage de l’ECG
z Ondes P et QRS (R) Èy morphologie (normale, anormale : déformée, inversée)y datey durée (longue, normale, courte)
z Intervalles PR, PP1, RR1, PP2, RR2 :y durée (longue, normale, courte)
z Suite d’intervalles Èy durée constante, croissante , décroissante,
irrégulière
ICL : représentation d’unexemple d’ECGz Fragment de 5s à 15s : 10 à 40 événements
begin(model(mobitz2_231_1)).mobitz2. p_wave(p1, 124, normal, noPreWave). qrs_complex(r1, 295 , normal, p1). p_wave(p2, 968, normal, r1). p_wave(p3, 1812, normal, p2). qrs_complex(r2, 1967 , normal, p3). p_wave(p4, 2687, normal, r2). p_wave(p5, 3523, normal, p4). qrs_complex(r3, 3669 , normal, p5). …end(model(mobitz2_231_1)).
ICL : langage des concepts
z Arythmie : séquence d’ondes + contraintes Èy class(lbbb) :-
p_wav(P0, normal, _), qrs(R0, abnormal, P0),pr1(P0, R0, normal).p_wav(P1, normal, R0), qrs(R1, abnormal, P1),pr1(P1, R1, normal).
z Biais (DLAB)y fournit la syntaxe du langage des conceptsy induit l’espace de recherche des concepts
Langage des concepts
z Basé sur la notion de cycle cardiaque Èy en adéquation avec la représentation des expertsy permet d’imposer le nombre de cycles È
x lisibilité : validationx chroniques compactes : détection précocex redondance : résistance au bruit
*Souplesse de la spécification
z Réduit l’espace de recherche : efficacitéz Trop spécifique?
Langage des hypothèses
z Spécification d’un cycle cardiaque en DLABz 1-1:[
len-len:[p_wav(P1, 1-1:[normal, abnormal], R0), qrs(R1, 1-1:[normal, abnormal], P1), 0-len:[rr1(R0, R1, 1-1:[short, normal, long]), pr1(P1, R1, 1-1:[short, normal, long])]],
len-len:[p_wav(P1, 1-1:[normal, abnormal], R0), pp1(P0, P1, 1-1:[short, normal, long])],
len-len:[qrs(R1, 1-1:[normal, abnormal], R0), 0-1:[rr1(R0, R1, 1-1:[short, normal, long])]] ],
Langage des hypothèsesz dlab_template( ’
false <-- len-len:[ 1-1:[len-len:[1-1:[ len-len:[p_wav(P0, w_feature, _), qrs(R0, w_feature, P0), 0-1:[pr1(P0,R0, r_feature)]], len-len:[p_wav(P0, w_feature, _), equal(P0,R0)], len-len:[qrs(R0, w_feature, _), 0-0:[rr1(_, R0, r_feature)]] ], 0-1:[len-len:[1-1:[ len-len:[p_wav(P1, w_feature, R0), qrs(R1, w_feature, P1), 0-len:[rr1(R0, R1, r_feature), pr1(P1, R1, r_feature)]], len-len:[p_wav(P1, w_feature, R0), pp1(P0, P1, r_feature), equal(P1, R1)], len-len:[qrs(R1, w_feature, R0), 0-1:[rr1(R0, R1, r_feature)]] ], 0-1:[len-len:[1-1:[ len-len:[p_wav(P2, w_feature, R1), qrs(R2, w_feature, P2),…]]).dlab_variable(r_feature, 1-1, [short, normal, long]).dlab_variable(w_feature, 1-1, [normal, abnormal]).
Ê
Théorie du domaine
z Connaissances facilitant l’apprentissage Èy connaissance générale (utilitaire)y connaissance particulière au domaine*évite de tout apprendre
z Lien entre langage des concepts etreprésentation des données Èy assure l’indépendance entre représentation des
données et des concepts
Expérimentation
z Base d’apprentissagey 4 (5) rythmes : bigéminy, bloc de branche gauche
(lbbb), mobitz 2, normal(, pvc)y 20 ECG réels par classe tirés de la base MIT-BIHy durée d’un ECG : 10 s - 10 à 15 cycles (8 à 30
événements)
y génération d’exemples par simulateur
Expérimentation
z 2 cycles obligatoires Èclass(bigeminy, [20, 0, 0, 0], [0, 20, 20, 20]) :- qrs(R0, abnormal, _), p_wav(P1, normal, R0), qrs(R1, normal, P1).class(lbbb, [0, 20, 0, 0], [20, 0, 20, 20]) :- qrs(R0, abnormal, _), p_wav(P1, normal, R0), qrs(R1, abnormal, P1).class(mobitz2, [0, 0, 17, 0], [20, 20, 3, 20]) :- p_wav(P0, normal, _), equal(P0, R0), p_wav(P1, normal, R0), qrs(R1, normal, P1).class(mobitz2, [0, 0, 3, 0], [20, 20, 17, 20]) :- p_wav(P0, normal, _), equal(P0, R0), p_wav(P1, normal, R0), qrs(R1, abnormal, P1).class(normal, [0, 0, 0, 20], [20, 20, 20, 0]) :- qrs(R0, normal, _), p_wav(P1, normal, R0), qrs(R1, normal, P1).
È
Expérimentation
z 3 cycles obligatoires Èclass(bigeminy, [15, 0, 0, 0], [5, 20, 20, 20]) :- p_wav(P0, normal, _), qrs(R0, normal, P0), qrs(R1, abnormal, R0), p_wav(P2, normal, R1), qrs(R2, normal, P2).class(bigeminy, [5, 0, 0, 0], [15, 20, 20, 20]) :- p_wav(P0, normal, _), qrs(R0, normal, P0), p_wav(P1, normal, R0), qrs(R1, abnormal, P1), p_wav(P2, normal, R1), qrs(R2, normal, P2).
class(mobitz2, [0, 0, 17, 0], [20, 20, 3, 20]) :- p_wav(P0, normal, _), qrs(R0, normal, P0), p_wav(P1, normal, R0), pp1(P0, P1, normal), equal(P1, R1), p_wav(P2, normal, R1), qrs(R2, normal, P2).class(mobitz2, [0, 0, 3, 0], [20, 20, 17, 20]) :- p_wav(P0, normal, _), qrs(R0, abnormal, P0), p_wav(P1, normal, R0), pp1(P0, P1, normal), equal(P1, R1), p_wav(P2, normal, R1), qrs(R2, abnormal, P2).
Expérimentation
z Apprentissage sans onde P 1-1:[ len-len:[
0-1:[len-len:[p_wav(P0, w_feature, _),0-1:[pr1(P0,R, r_feature)]]],qrs(R0, w_feature, 1-1:[P0,_], _),0-0:[rr1(_, R0, r_feature)],0-0:[rr2(_, R0, r_feature)],
0-1:[ len-len:[
0-1:[len-len:[p_wav(P1, w_feature, _),0-1:[pr1(P1,R1, r_feature)]]],qrs(R1, w_feature, 1-1:[P1,R0], R0),rr1(R0, R1, r_feature),0-0:[rr2(_, R1, r_feature)],
0-1:[ len-len:[
0-1:[len-len:[p_wav(P2, w_feature, _),0-1:[pr1(P2,R2, r_feature)]]],qrs(R2, w_feature, 1-1:[P2,R1], R1),rr1(R1, R2, r_feature),0-1:[rr2(R0, R2, r_feature)],...
Expérimentation
z Apprentissage sans onde Pclass(bigeminy, [13, 0, 0, 0], [0, 15, 12, 13]) :- qrs(R0, normal, P0, _), qrs(R1, abnormal, P1, R0), rr1(R0, R1, short).class(lbbb, [0, 15, 0, 0], [13, 0, 12, 13]) :- qrs(R0, abnormal, _, _), qrs(R1, abnormal, P1, R0), rr1(R0, R1, normal), qrs(R2, abnormal, P2, R1), rr1(R1, R2, normal), rr2(R0, R2, normal).class(mobitz2, [0, 0, 10, 0], [13, 15, 2, 13]) :- qrs(R0, normal, P0, _), qrs(R1, normal, P1, R0), rr1(R0, R1, long).class(mobitz2, [0, 0, 2, 0], [13, 15, 10, 13]) :- qrs(R0, abnormal, P0, _), qrs(R1, abnormal, P1, R0), rr1(R0, R1, long).class(normal, [0, 0, 0, 13], [13, 15, 12, 0]) :- qrs(R0, normal, _, _), qrs(R1, normal, P1, R0), rr1(R0, R1, normal), qrs(R2, normal, P2, R1), rr1(R1, R2, normal), rr2(R0, R2, normal).
Validation
z Validation croisée : 1/10 en test Set | Acc TTot FTot | TrAcc | Correct*Incorrect/class #----------------------------------------------------------------- 1 | 1.000 8 0 | 1.000 | [2,1,3,2] * [0,0,0,0] # 2 | 1.000 8 0 | 1.000 | [2,1,3,2] * [0,0,0,0] # 3 | 1.000 8 0 | 1.000 | [1,2,1,4] * [0,0,0,0] # 4 | 1.000 8 0 | 1.000 | [3,2,2,1] * [0,0,0,0] # 5 | 1.000 8 0 | 1.000 | [2,2,3,1] * [0,0,0,0] # 6 | 1.000 8 0 | 1.000 | [2,1,2,3] * [0,0,0,0] # 7 | 1.000 8 0 | 1.000 | [3,3,2,0] * [0,0,0,0] # 8 | 1.000 8 0 | 1.000 | [2,3,1,2] * [0,0,0,0] # 9 | 1.000 8 0 | 1.000 | [1,3,1,3] * [0,0,0,0] # 10 | 1.000 8 0 | 1.000 | [2,2,2,2] * [0,0,0,0] #------------------------------------- Tot: 10.000 80 0
Accuracy: 1.000 (+/-0.000) (Training set Accuracy: 1.000 (+/-0.000))Correlation: 1.000
Aleph : langage desexemples
z Objets + attributs « binarisés »ecg(bigeminy_106_1).
has_wave(bigeminy_106_1,p1_bigeminy_106_1). has_wave(bigeminy_106_1,p2_bigeminy_106_1). has_wave(bigeminy_106_1,p3_bigeminy_106_1). has_wave(bigeminy_106_1,r1_bigeminy_106_1). has_wave(bigeminy_106_1,r2_bigeminy_106_1). has_wave(bigeminy_106_1,r3_bigeminy_106_1). has_wave(bigeminy_106_1,r4_bigeminy_106_1).
p_wave(p1_bigeminy_106_1). p_wave(p2_bigeminy_106_1). p_wave(p3_bigeminy_106_1).
qrs(r1_bigeminy_106_1). qrs(r2_bigeminy_106_1). qrs(r3_bigeminy_106_1). qrs(r4_bigeminy_106_1).
Attributs d’une onde
shape(p1_bigeminy_106_1,normal).
time(p1_bigeminy_106_1,872).
pre_wave(p3_bigeminy_106_1,r4_bigeminy_106_1).
pp1(p2_bigeminy_106_1,p3_bigeminy_106_1,long).
pp2(p1_bigeminy_106_1,p3_bigeminy_106_1,long).
pr1(p1_bigeminy_106_1,r1_bigeminy_106_1,normal).
rr1(r1_bigeminy_106_1,r2_bigeminy_106_1,short).
rr2(r1_bigeminy_106_1,r3_bigeminy_106_1,normal).
Théorie du domaine :connaissances a priori
has_wave(E,qrs,N,S,Prec) :- has_wave(E,N), (p_wave(N) ; qrs(N)), shape(N,S), pre_wave(N,Prec).
has_wave(E,N1,T1,S1,N2,T2,S2) :- has_wave(E,N1), (qrs(N1); p_wave(N1)),
time(N1,T1), shape(N1,S1), suc(N1,N2), has_wave(E,N2), (qrs(N2); p_wave(N2)),
time(N2,T2), shape(N2,S2).
Expérimentation6 classes - has_wave/2
bigeminy(A) :- %7.09 has_wave(A,B), shape(B,abnormal), has_wave(A,C), rr1(C,B,short).lbbb(A) :- %24.83 has_wave(A,B), shape(B,abnormal), has_wave(A,C), rr1(C,B,normal).mobitz2(A) :- %1.29 has_wave(A,B), has_wave(A,C), rr2(C,B,long).normal(A) :- %17.42 has_wave(A,B), has_wave(A,C), shape(C,normal), rr1(C,B,normal).pvc105(A) :- %6268.27 has_wave(A,B), has_wave(A,C), rr1(C,B,short), has_wave(A,D), pr2(D,B,normal).pvc108(A) :- %4782.19 has_wave(A,B), has_wave(A,C), rr2(C,B,long), has_wave(A,D), rr2(D,C,normal).
Expérimentation6 classes - has_wave/7
bigeminy(A) :- %1.12 has_wave(A,B,p_wave,normal,C,qrs,normal), has_wave(A,D,qrs,abnormal,E,p_wave,normal), rr1(C,D,short), has_wave(A,F,qrs,abnormal,B,p_wave,normal).lbbb(A) :- %0.35 has_wave(A,B,p_wave,normal,C,qrs,abnormal), has_wave(A,D,qrs,abnormal,B,p_wave,normal).mobitz2(A) :- %0.39 has_wave(A,B,p_wave,normal,C,p_wave,normal), has_wave(A,D,p_wave,normal,E,p_wave,normal), pp1(E,B,normal).pvc105(A) :- %2.74 has_wave(A,B,qrs,normal,C,p_wave,normal), has_wave(A,D,qrs,normal,E,qrs,normal), rr1(E,B,normal).pvc108(A) :- %12.34 has_wave(A,B,p_wave,normal,C,qrs,normal), has_wave(A,D,qrs,normal,E,p_wave,normal), pp2(B,E,long).
Influence de l’apport destructurebigeminy(A) :- has_wave(A,B), shape(B,abnormal), has_wave(A,C), shape(C,normal), qrs(C).bigeminy(A) :- has_wave(A,qrs,B,abnormal,C), has_wave(A,qrs,D,normal,E).bigeminy(A) :- has_wave(A,B,p_wave,normal,C,qrs,normal), has_wave(A,D,qrs,abnormal,B,p_wave,normal).
bigeminy(A) :- has_wave(A,B), shape(B,abnormal), has_wave(A,C), rr1(C,B,short).bigeminy(A) :- has_wave(A,p_wave,B,normal,C), has_wave(A,p_wave,D,normal,E), has_wave(A,qrs,F,normal,D), rr1(F,C,short), has_wave(A,qrs,E,abnormal,G).bigeminy(A) :- has_wave(A,B,p_wave,normal,C,qrs,normal), has_wave(A,D,qrs,abnormal,E,p_wave,normal), rr1(C,D,short), has_wave(A,F,qrs,abnormal,B,p_wave,normal).
Influence de l’apport destructure
lbbb(A) :- has_wave(A,B), shape(B,abnormal), has_wave(A,C), rr1(C,B,normal).lbbb(A) :- has_wave(A,p_wave,B,normal,C), has_wave(A,qrs,D,abnormal,B), rr1(C,D,normal).lbbb(A) :- has_wave(A,B,p_wave,normal,C,qrs,abnormal), has_wave(A,D,qrs,abnormal,B,p_wave,normal).