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 pyagrum as gum
import pyagrum.lib.notebook as gnb

from pyagrum.lib.bn2roc import showROC, showPR, showROC_PR

SIZE_LEARN = 10000
SIZE_VALID = 2000
In [2]:
bn = gum.loadBN("res/alarm.bgum")
bn
Out[2]:
G INSUFFANESTH INSUFFANESTH CATECHOL CATECHOL INSUFFANESTH->CATECHOL FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT HRSAT HRSAT HYPOVOLEMIA HYPOVOLEMIA LVEDVOLUME LVEDVOLUME HYPOVOLEMIA->LVEDVOLUME STROKEVOLUME STROKEVOLUME HYPOVOLEMIA->STROKEVOLUME DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE VENTMACH VENTMACH VENTMACH->VENTTUBE PCWP PCWP LVEDVOLUME->PCWP CVP CVP LVEDVOLUME->CVP VENTALV VENTALV ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT CO CO BP BP CO->BP PAP PAP TPR TPR TPR->BP TPR->CATECHOL INTUBATION INTUBATION INTUBATION->VENTALV VENTLUNG VENTLUNG INTUBATION->VENTLUNG PRESS PRESS INTUBATION->PRESS SHUNT SHUNT INTUBATION->SHUNT MINVOL MINVOL INTUBATION->MINVOL MINVOLSET MINVOLSET MINVOLSET->VENTMACH HR HR HR->HRSAT HR->CO HRBP HRBP HR->HRBP HREKG HREKG HR->HREKG VENTTUBE->VENTLUNG VENTTUBE->PRESS PULMEMBOLUS PULMEMBOLUS PULMEMBOLUS->PAP PULMEMBOLUS->SHUNT STROKEVOLUME->CO VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 VENTLUNG->MINVOL ARTCO2->EXPCO2 ARTCO2->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT ERRLOWOUTPUT->HRBP SAO2 SAO2 PVSAT->SAO2 KINKEDTUBE KINKEDTUBE KINKEDTUBE->VENTLUNG KINKEDTUBE->PRESS HISTORY HISTORY CATECHOL->HR SAO2->CATECHOL LVFAILURE LVFAILURE LVFAILURE->LVEDVOLUME LVFAILURE->STROKEVOLUME LVFAILURE->HISTORY ANAPHYLAXIS ANAPHYLAXIS ANAPHYLAXIS->TPR SHUNT->SAO2 ERRCAUTER ERRCAUTER ERRCAUTER->HRSAT ERRCAUTER->HREKG
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 : -152021.42407581996
out/train.csv: 100%|███████████████████████████████████████|
Log2-Likelihood : -30005.29079957952

Out[3]:
-30005.29079957952

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 INSUFFANESTH INSUFFANESTH HRSAT HRSAT FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE HYPOVOLEMIA HYPOVOLEMIA STROKEVOLUME STROKEVOLUME HYPOVOLEMIA->STROKEVOLUME VENTMACH VENTMACH VENTMACH->VENTTUBE LVEDVOLUME LVEDVOLUME LVEDVOLUME->HYPOVOLEMIA PCWP PCWP LVEDVOLUME->PCWP LVFAILURE LVFAILURE LVEDVOLUME->LVFAILURE VENTALV VENTALV INTUBATION INTUBATION VENTALV->INTUBATION ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT MINVOL MINVOL VENTALV->MINVOL CO CO BP BP CO->BP PAP PAP PULMEMBOLUS PULMEMBOLUS PAP->PULMEMBOLUS PRESS PRESS INTUBATION->PRESS SHUNT SHUNT INTUBATION->SHUNT TPR TPR TPR->BP MINVOLSET MINVOLSET MINVOLSET->VENTMACH HR HR HR->HRSAT HR->CO HRBP HRBP HR->HRBP HREKG HREKG HR->HREKG VENTLUNG VENTLUNG VENTTUBE->VENTLUNG VENTTUBE->PRESS PULMEMBOLUS->SHUNT STROKEVOLUME->CO ERRCAUTER ERRCAUTER STROKEVOLUME->ERRCAUTER VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 KINKEDTUBE KINKEDTUBE VENTLUNG->KINKEDTUBE ERRLOWOUTPUT ERRLOWOUTPUT ERRLOWOUTPUT->HRBP SAO2 SAO2 PVSAT->SAO2 CATECHOL CATECHOL CATECHOL->HR HISTORY HISTORY SAO2->CATECHOL CVP CVP CVP->LVEDVOLUME LVFAILURE->STROKEVOLUME LVFAILURE->HISTORY ANAPHYLAXIS ANAPHYLAXIS ANAPHYLAXIS->TPR SHUNT->SAO2 MINVOL->INTUBATION ERRCAUTER->HRSAT ERRCAUTER->HREKG HREKG->HRSAT
Learned with 10000 lines in 2.652s
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 PRESS PRESS KINKEDTUBE->PRESS HYPOVOLEMIA HYPOVOLEMIA STROKEVOLUME STROKEVOLUME HYPOVOLEMIA->STROKEVOLUME LVEDVOLUME LVEDVOLUME INTUBATION INTUBATION SHUNT SHUNT INTUBATION->SHUNT INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->PRESS VENTALV VENTALV MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH PULMEMBOLUS PULMEMBOLUS PAP 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 HISTORY HISTORY LVFAILURE->HISTORY DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS TPR TPR ANAPHYLAXIS->TPR PAP->PULMEMBOLUS STROKEVOLUME->ERRCAUTER CO CO STROKEVOLUME->CO TPR->CATECHOL BP BP TPR->BP LVEDVOLUME->HYPOVOLEMIA LVEDVOLUME->LVFAILURE PCWP PCWP LVEDVOLUME->PCWP CVP CVP VENTMACH->VENTTUBE SAO2 SAO2 SHUNT->SAO2 VENTTUBE->VENTLUNG VENTTUBE->PRESS CVP->LVEDVOLUME VENTLUNG->KINKEDTUBE VENTLUNG->MINVOL VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 MINVOL->INTUBATION VENTALV->INTUBATION VENTALV->MINVOL ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT ARTCO2->EXPCO2 ARTCO2->CATECHOL PVSAT->SAO2 SAO2->CATECHOL 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 STROKEVOLUME STROKEVOLUME HYPOVOLEMIA->STROKEVOLUME LVEDVOLUME LVEDVOLUME HYPOVOLEMIA->LVEDVOLUME PCWP PCWP HYPOVOLEMIA->PCWP INTUBATION INTUBATION SHUNT SHUNT INTUBATION->SHUNT INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->MINVOL INTUBATION->PRESS VENTALV VENTALV INTUBATION->VENTALV MINVOLSET MINVOLSET VENTMACH VENTMACH PULMEMBOLUS PULMEMBOLUS PAP PAP PULMEMBOLUS->PAP PULMEMBOLUS->SHUNT INSUFFANESTH INSUFFANESTH CATECHOL CATECHOL INSUFFANESTH->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP ERRCAUTER ERRCAUTER ERRCAUTER->PULMEMBOLUS HRSAT HRSAT ERRCAUTER->HRSAT HREKG HREKG ERRCAUTER->HREKG FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT LVFAILURE LVFAILURE LVFAILURE->STROKEVOLUME LVFAILURE->LVEDVOLUME LVFAILURE->PCWP HISTORY HISTORY DISCONNECT DISCONNECT DISCONNECT->VENTMACH VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS ANAPHYLAXIS->DISCONNECT TPR TPR STROKEVOLUME->ERRCAUTER CO CO STROKEVOLUME->CO TPR->ANAPHYLAXIS TPR->CATECHOL BP BP TPR->BP CVP CVP LVEDVOLUME->CVP VENTMACH->MINVOLSET PCWP->LVEDVOLUME SAO2 SAO2 SHUNT->SAO2 HISTORY->LVFAILURE VENTTUBE->FIO2 VENTTUBE->VENTMACH 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 HR HR CATECHOL->HR HR->HRBP HR->HRSAT HR->CO HR->HREKG CO->BP
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 INTUBATION INTUBATION SHUNT SHUNT INTUBATION->SHUNT INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->MINVOL INTUBATION->PRESS VENTALV VENTALV INTUBATION->VENTALV MINVOLSET MINVOLSET VENTMACH VENTMACH PULMEMBOLUS PULMEMBOLUS PAP PAP PULMEMBOLUS->SHUNT INSUFFANESTH INSUFFANESTH HISTORY HISTORY INSUFFANESTH->HISTORY 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->HYPOVOLEMIA LVFAILURE->PAP LVFAILURE->STROKEVOLUME LVFAILURE->HISTORY DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS ANAPHYLAXIS->DISCONNECT TPR TPR PAP->PULMEMBOLUS STROKEVOLUME->ERRCAUTER CO CO STROKEVOLUME->CO TPR->ANAPHYLAXIS TPR->CATECHOL BP BP TPR->BP LVEDVOLUME->HYPOVOLEMIA LVEDVOLUME->LVFAILURE PCWP PCWP LVEDVOLUME->PCWP CVP CVP VENTMACH->MINVOLSET VENTMACH->VENTTUBE SAO2 SAO2 SHUNT->SAO2 VENTTUBE->FIO2 VENTTUBE->VENTLUNG VENTTUBE->PRESS CVP->LVEDVOLUME VENTLUNG->MINVOL VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT ARTCO2->EXPCO2 ARTCO2->CATECHOL PVSAT->SAO2 SAO2->CATECHOL 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())
{'INSUFFANESTH', 'HRSAT', 'FIO2', 'DISCONNECT', 'HYPOVOLEMIA', 'VENTMACH', 'LVEDVOLUME', 'VENTALV', 'CO', 'BP', 'PAP', 'PCWP', 'INTUBATION', 'TPR', 'MINVOLSET', 'HR', 'VENTTUBE', 'PULMEMBOLUS', 'STROKEVOLUME', 'VENTLUNG', 'PRESS', 'ARTCO2', 'EXPCO2', 'ERRLOWOUTPUT', 'PVSAT', 'HRBP', 'KINKEDTUBE', 'CATECHOL', 'HISTORY', 'SAO2', 'CVP', 'LVFAILURE', 'ANAPHYLAXIS', 'SHUNT', 'MINVOL', 'ERRCAUTER', 'HREKG'}
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["HRSAT"])
print(bn2["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