Learning BN as probabilistic classifier

Learning a Bayesian network can be used to obtain a classifier for one of the nodes of the model. For more about classifier, see pyAgrum.skbn.

Creative Commons License

aGrUM

interactive online version

In [1]:
import sys
import os

import numpy as np

import pyAgrum as gum
import pyAgrum.lib.notebook as gnb

%matplotlib inline
from pyAgrum.lib.bn2roc import showROC
from pyAgrum.lib.bn2roc import showPR
from pyAgrum.lib.bn2roc import showROC_PR

SIZE_LEARN=10000
SIZE_VALID=2000
In [2]:
bn=gum.loadBN("res/alarm.dsl")
bn
Out[2]:
G MINVOL MINVOL KINKEDTUBE KINKEDTUBE VENTLUNG VENTLUNG KINKEDTUBE->VENTLUNG PRESS PRESS KINKEDTUBE->PRESS VENTTUBE VENTTUBE VENTTUBE->VENTLUNG VENTTUBE->PRESS DISCONNECT DISCONNECT DISCONNECT->VENTTUBE SAO2 SAO2 CATECHOL CATECHOL SAO2->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP BP BP INTUBATION INTUBATION INTUBATION->MINVOL VENTALV VENTALV INTUBATION->VENTALV INTUBATION->VENTLUNG INTUBATION->PRESS SHUNT SHUNT INTUBATION->SHUNT LVFAILURE LVFAILURE STROKEVOLUME STROKEVOLUME LVFAILURE->STROKEVOLUME LVEDVOLUME LVEDVOLUME LVFAILURE->LVEDVOLUME HISTORY HISTORY LVFAILURE->HISTORY HYPOVOLEMIA HYPOVOLEMIA HYPOVOLEMIA->STROKEVOLUME HYPOVOLEMIA->LVEDVOLUME CO CO STROKEVOLUME->CO ERRCAUTER ERRCAUTER HREKG HREKG ERRCAUTER->HREKG HRSAT HRSAT ERRCAUTER->HRSAT ARTCO2 ARTCO2 ARTCO2->CATECHOL EXPCO2 EXPCO2 ARTCO2->EXPCO2 ANAPHYLAXIS ANAPHYLAXIS TPR TPR ANAPHYLAXIS->TPR VENTALV->ARTCO2 PVSAT PVSAT VENTALV->PVSAT PCWP PCWP LVEDVOLUME->PCWP CVP CVP LVEDVOLUME->CVP PVSAT->SAO2 INSUFFANESTH INSUFFANESTH INSUFFANESTH->CATECHOL MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH TPR->BP TPR->CATECHOL HR HR CATECHOL->HR VENTLUNG->MINVOL VENTLUNG->VENTALV VENTLUNG->EXPCO2 VENTMACH->VENTTUBE CO->BP PAP PAP PULMEMBOLUS PULMEMBOLUS PULMEMBOLUS->PAP PULMEMBOLUS->SHUNT FIO2 FIO2 FIO2->PVSAT HR->HRBP HR->CO HR->HREKG HR->HRSAT SHUNT->SAO2
In [3]:
gum.generateSample(bn,SIZE_LEARN,"out/learn.csv",show_progress=True,with_labels=True)
gum.generateSample(bn,SIZE_VALID,"out/train.csv",show_progress=True,with_labels=True)
out/learn.csv: 100%|███████████████████████████████████████|
Log2-Likelihood : -151554.4230546606
out/train.csv: 100%|███████████████████████████████████████|
Log2-Likelihood : -30406.139733341093

Out[3]:
-30406.139733341093

Learning a BN from learn.csv

In [4]:
# Learning a BN from the database
learner=gum.BNLearner("out/train.csv")

bn2=learner.useMIIC().learnBN()
currentTime=learner.currentTime()
In [5]:
gnb.flow.add(gnb.getBN(bn2,size="9"),f"Learned with {SIZE_LEARN} lines in {currentTime:.3f}s")
gnb.flow.display()

G MINVOL MINVOL KINKEDTUBE KINKEDTUBE VENTLUNG VENTLUNG KINKEDTUBE->VENTLUNG VENTTUBE VENTTUBE VENTTUBE->VENTLUNG PRESS PRESS VENTTUBE->PRESS DISCONNECT DISCONNECT DISCONNECT->VENTTUBE SAO2 SAO2 CATECHOL CATECHOL SAO2->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP BP BP INTUBATION INTUBATION INTUBATION->PRESS SHUNT SHUNT INTUBATION->SHUNT LVFAILURE LVFAILURE STROKEVOLUME STROKEVOLUME LVFAILURE->STROKEVOLUME LVEDVOLUME LVEDVOLUME LVFAILURE->LVEDVOLUME HYPOVOLEMIA HYPOVOLEMIA HYPOVOLEMIA->STROKEVOLUME HYPOVOLEMIA->LVEDVOLUME CO CO STROKEVOLUME->CO ERRCAUTER ERRCAUTER HREKG HREKG ERRCAUTER->HREKG HRSAT HRSAT ERRCAUTER->HRSAT ARTCO2 ARTCO2 ANAPHYLAXIS ANAPHYLAXIS PCWP PCWP LVEDVOLUME->PCWP CVP CVP LVEDVOLUME->CVP PVSAT PVSAT PVSAT->SAO2 VENTALV VENTALV VENTALV->MINVOL VENTALV->INTUBATION VENTALV->ARTCO2 VENTALV->PVSAT INSUFFANESTH INSUFFANESTH MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH TPR TPR TPR->BP TPR->ANAPHYLAXIS CATECHOL->TPR HR HR CATECHOL->HR VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 CO->BP VENTMACH->VENTTUBE PAP PAP PULMEMBOLUS PULMEMBOLUS PULMEMBOLUS->PAP FIO2 FIO2 FIO2->PVSAT HISTORY HISTORY HISTORY->LVFAILURE HREKG->HRSAT HR->HRBP HR->CO HR->HREKG HR->HRSAT SHUNT->SAO2 SHUNT->PULMEMBOLUS
Learned with 10000 lines in 0.145s
In [6]:
import pyAgrum.lib.bn_vs_bn as bnvsbn
gnb.flow.add(gnb.getBNDiff(bn,bn2,size="8!"),"Diff with MIIC")
gnb.flow.add(bnvsbn.graphDiffLegend())
gnb.flow.display()
G KINKEDTUBE KINKEDTUBE VENTLUNG VENTLUNG KINKEDTUBE->VENTLUNG PRESS PRESS KINKEDTUBE->PRESS HYPOVOLEMIA HYPOVOLEMIA STROKEVOLUME STROKEVOLUME HYPOVOLEMIA->STROKEVOLUME LVEDVOLUME LVEDVOLUME HYPOVOLEMIA->LVEDVOLUME INTUBATION INTUBATION SHUNT SHUNT INTUBATION->SHUNT INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->MINVOL INTUBATION->PRESS VENTALV VENTALV MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH PULMEMBOLUS PULMEMBOLUS PAP PAP PULMEMBOLUS->PAP INSUFFANESTH INSUFFANESTH CATECHOL CATECHOL INSUFFANESTH->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP ERRCAUTER ERRCAUTER HRSAT HRSAT ERRCAUTER->HRSAT HREKG HREKG ERRCAUTER->HREKG FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT LVFAILURE LVFAILURE LVFAILURE->STROKEVOLUME LVFAILURE->LVEDVOLUME HISTORY HISTORY DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS TPR TPR CO CO STROKEVOLUME->CO TPR->ANAPHYLAXIS BP BP TPR->BP PCWP PCWP LVEDVOLUME->PCWP CVP CVP LVEDVOLUME->CVP VENTMACH->VENTTUBE SHUNT->PULMEMBOLUS SAO2 SAO2 SHUNT->SAO2 HISTORY->LVFAILURE VENTTUBE->VENTLUNG VENTTUBE->PRESS VENTLUNG->MINVOL VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 VENTALV->INTUBATION VENTALV->MINVOL ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT ARTCO2->EXPCO2 ARTCO2->CATECHOL PVSAT->SAO2 SAO2->CATECHOL CATECHOL->TPR HR HR CATECHOL->HR HR->HRBP HR->HRSAT HR->CO HR->HREKG CO->BP HREKG->HRSAT
Diff with MIIC
G a->b overflow c->d Missing e->f reversed g->h Correct
In [7]:
bn3=learner.useGreedyHillClimbing().useNMLCorrection().useScoreBDeu().learnBN()
gnb.flow.add(gnb.getBNDiff(bn,bn3,size="8!"),"Diff with GHC/NMD/BDEU")
gnb.flow.add(bnvsbn.graphDiffLegend())
gnb.flow.display()
G KINKEDTUBE KINKEDTUBE VENTLUNG VENTLUNG KINKEDTUBE->VENTLUNG PRESS PRESS KINKEDTUBE->PRESS HYPOVOLEMIA HYPOVOLEMIA PULMEMBOLUS PULMEMBOLUS HYPOVOLEMIA->PULMEMBOLUS STROKEVOLUME STROKEVOLUME LVEDVOLUME LVEDVOLUME HYPOVOLEMIA->LVEDVOLUME INTUBATION INTUBATION SHUNT SHUNT INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->MINVOL INTUBATION->PRESS VENTALV VENTALV INTUBATION->VENTALV MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH PAP PAP PULMEMBOLUS->PAP INSUFFANESTH INSUFFANESTH CATECHOL CATECHOL INSUFFANESTH->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP ERRCAUTER ERRCAUTER HR HR ERRCAUTER->HR HRSAT HRSAT HREKG HREKG FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT LVFAILURE LVFAILURE HISTORY HISTORY LVFAILURE->HISTORY DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS TPR TPR STROKEVOLUME->HYPOVOLEMIA STROKEVOLUME->LVFAILURE PCWP PCWP STROKEVOLUME->PCWP CO CO TPR->ANAPHYLAXIS BP BP TPR->BP LVEDVOLUME->LVFAILURE CVP CVP LVEDVOLUME->CVP VENTMACH->VENTTUBE PCWP->HYPOVOLEMIA PCWP->LVEDVOLUME SHUNT->INTUBATION SHUNT->PULMEMBOLUS SAO2 SAO2 SHUNT->SAO2 VENTTUBE->VENTLUNG VENTTUBE->PRESS VENTLUNG->MINVOL VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT ARTCO2->EXPCO2 ARTCO2->CATECHOL PVSAT->SAO2 CATECHOL->TPR CATECHOL->SHUNT CATECHOL->SAO2 HR->STROKEVOLUME HR->CATECHOL HR->HRBP HR->CO HRSAT->ERRCAUTER HRSAT->HR CO->STROKEVOLUME CO->BP HREKG->ERRCAUTER HREKG->HR HREKG->HRSAT
Diff with GHC/NMD/BDEU
G a->b overflow c->d Missing e->f reversed g->h Correct
In [8]:
bn4=learner.useGreedyHillClimbing().useNMLCorrection().useScoreBDeu().setInitialDAG(bn2.dag()).learnBN()
gnb.flow.add(gnb.getBNDiff(bn,bn4,size="8!"),"Diff with GHC/NMD/BDEU with intial DAG from MIIC")
gnb.flow.add(bnvsbn.graphDiffLegend())
gnb.flow.display()
G KINKEDTUBE KINKEDTUBE VENTLUNG VENTLUNG KINKEDTUBE->VENTLUNG PRESS PRESS KINKEDTUBE->PRESS HYPOVOLEMIA HYPOVOLEMIA STROKEVOLUME STROKEVOLUME HYPOVOLEMIA->STROKEVOLUME LVEDVOLUME LVEDVOLUME HYPOVOLEMIA->LVEDVOLUME INTUBATION INTUBATION SHUNT SHUNT INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->MINVOL INTUBATION->PRESS VENTALV VENTALV INTUBATION->VENTALV MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH PULMEMBOLUS PULMEMBOLUS PULMEMBOLUS->HYPOVOLEMIA PAP PAP PULMEMBOLUS->PAP PULMEMBOLUS->SHUNT INSUFFANESTH INSUFFANESTH CATECHOL CATECHOL INSUFFANESTH->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP ERRCAUTER ERRCAUTER HRSAT HRSAT ERRCAUTER->HRSAT HREKG HREKG ERRCAUTER->HREKG FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT LVFAILURE LVFAILURE LVFAILURE->STROKEVOLUME LVFAILURE->LVEDVOLUME HISTORY HISTORY DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS TPR TPR CO CO STROKEVOLUME->CO TPR->ANAPHYLAXIS BP BP TPR->BP PCWP PCWP LVEDVOLUME->PCWP CVP CVP LVEDVOLUME->CVP VENTMACH->VENTTUBE SHUNT->INTUBATION SAO2 SAO2 SHUNT->SAO2 HISTORY->LVFAILURE VENTTUBE->VENTLUNG VENTTUBE->PRESS VENTLUNG->MINVOL VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT ARTCO2->EXPCO2 ARTCO2->CATECHOL PVSAT->SAO2 SAO2->CATECHOL CATECHOL->TPR HR HR CATECHOL->HR HR->HRBP HR->HRSAT HR->CO HR->HREKG CO->BP
Diff with GHC/NMD/BDEU with intial DAG from MIIC
G a->b overflow c->d Missing e->f reversed g->h Correct
In [9]:
print(bn2.names())
{'MINVOL', 'KINKEDTUBE', 'VENTTUBE', 'DISCONNECT', 'SAO2', 'ERRLOWOUTPUT', 'BP', 'INTUBATION', 'LVFAILURE', 'HYPOVOLEMIA', 'STROKEVOLUME', 'ERRCAUTER', 'ARTCO2', 'ANAPHYLAXIS', 'HRBP', 'LVEDVOLUME', 'PVSAT', 'VENTALV', 'INSUFFANESTH', 'MINVOLSET', 'PCWP', 'TPR', 'CVP', 'CATECHOL', 'VENTLUNG', 'CO', 'VENTMACH', 'PAP', 'PULMEMBOLUS', 'FIO2', 'HISTORY', 'PRESS', 'HREKG', 'HRSAT', 'HR', 'EXPCO2', 'SHUNT'}
In [10]:
gnb.showInference(bn2,evs={},size="10")
../_images/notebooks_32-Learning_learningClassifier_13_0.svg

Two classifiers from the learned BN

In [11]:
print(bn2.variableFromName("HRSAT"))
print(bn2.variableFromName("INTUBATION"))
HRSAT:Labelized({HIGH|LOW|NORMAL})
INTUBATION:Labelized({ESOPHAGEAL|NORMAL|ONESIDED})
In [12]:
showROC(bn2,"out/train.csv",'HRSAT','LOW',show_progress=False)
showROC(bn2,"out/train.csv",'HRSAT','NORMAL',show_progress=False)
showROC(bn2,"out/train.csv",'HRSAT','HIGH',show_progress=False);
../_images/notebooks_32-Learning_learningClassifier_16_0.svg
../_images/notebooks_32-Learning_learningClassifier_16_1.svg
../_images/notebooks_32-Learning_learningClassifier_16_2.svg
In [13]:
showROC(bn2,"out/train.csv",'INTUBATION',"ESOPHAGEAL",show_progress=False);
../_images/notebooks_32-Learning_learningClassifier_17_0.svg
In [14]:
showPR(bn2,"out/train.csv",'HRSAT','LOW',show_progress=False);
../_images/notebooks_32-Learning_learningClassifier_18_0.svg
In [15]:
showPR(bn2,"out/train.csv",'INTUBATION',"ESOPHAGEAL",show_progress=False);
../_images/notebooks_32-Learning_learningClassifier_19_0.svg
In [16]:
showROC_PR(bn2,"out/train.csv",'HRSAT','LOW',show_progress=False);
../_images/notebooks_32-Learning_learningClassifier_20_0.svg
In [17]:
showROC_PR(bn2,"out/train.csv",'INTUBATION',"ESOPHAGEAL",show_progress=False);
../_images/notebooks_32-Learning_learningClassifier_21_0.svg