Skip to content

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 LicenseaGrUMinteractive online version
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
bn = gum.loadBN("res/alarm.bgum")
bn
G INTUBATION INTUBATION PRESS PRESS INTUBATION->PRESS MINVOL MINVOL INTUBATION->MINVOL SHUNT SHUNT INTUBATION->SHUNT VENTLUNG VENTLUNG INTUBATION->VENTLUNG VENTALV VENTALV INTUBATION->VENTALV FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT PULMEMBOLUS PULMEMBOLUS PULMEMBOLUS->SHUNT PAP PAP PULMEMBOLUS->PAP LVFAILURE LVFAILURE STROKEVOLUME STROKEVOLUME LVFAILURE->STROKEVOLUME LVEDVOLUME LVEDVOLUME LVFAILURE->LVEDVOLUME HISTORY HISTORY LVFAILURE->HISTORY PCWP PCWP HR HR CO CO HR->CO HRSAT HRSAT HR->HRSAT HRBP HRBP HR->HRBP HREKG HREKG HR->HREKG ERRLOWOUTPUT ERRLOWOUTPUT ERRLOWOUTPUT->HRBP HYPOVOLEMIA HYPOVOLEMIA HYPOVOLEMIA->STROKEVOLUME HYPOVOLEMIA->LVEDVOLUME CATECHOL CATECHOL CATECHOL->HR SAO2 SAO2 PVSAT->SAO2 MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH BP BP CO->BP ARTCO2 ARTCO2 ARTCO2->CATECHOL EXPCO2 EXPCO2 ARTCO2->EXPCO2 DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE SHUNT->SAO2 KINKEDTUBE KINKEDTUBE KINKEDTUBE->PRESS KINKEDTUBE->VENTLUNG VENTLUNG->MINVOL VENTLUNG->EXPCO2 VENTLUNG->VENTALV STROKEVOLUME->CO LVEDVOLUME->PCWP CVP CVP LVEDVOLUME->CVP INSUFFANESTH INSUFFANESTH INSUFFANESTH->CATECHOL TPR TPR TPR->CATECHOL TPR->BP ANAPHYLAXIS ANAPHYLAXIS ANAPHYLAXIS->TPR VENTMACH->VENTTUBE VENTTUBE->PRESS VENTTUBE->VENTLUNG SAO2->CATECHOL VENTALV->PVSAT VENTALV->ARTCO2 ERRCAUTER ERRCAUTER ERRCAUTER->HRSAT ERRCAUTER->HREKG
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: 0%| |

out/learn.csv: 100%|███████████████████████████████████████|

Log2-Likelihood : -151669.28259683488

out/train.csv: 0%| |

out/train.csv: 100%|███████████████████████████████████████|

Log2-Likelihood : -30238.359952531624
-30238.359952531624
## Learning a BN from the database
learner = gum.BNLearner("out/train.csv")
bn2 = learner.useMIIC().learnBN()
currentTime = learner.currentTime()
gnb.flow.add(gnb.getBN(bn2, size="9"), f"Learned with {SIZE_LEARN} lines in {currentTime:.3f}s")
gnb.flow.display()
G INTUBATION INTUBATION PRESS PRESS INTUBATION->PRESS SHUNT SHUNT INTUBATION->SHUNT VENTALV VENTALV INTUBATION->VENTALV FIO2 FIO2 PVSAT PVSAT FIO2->PVSAT PULMEMBOLUS PULMEMBOLUS PAP PAP PULMEMBOLUS->PAP LVFAILURE LVFAILURE STROKEVOLUME STROKEVOLUME LVFAILURE->STROKEVOLUME LVEDVOLUME LVEDVOLUME LVFAILURE->LVEDVOLUME PCWP PCWP HR HR CO CO HR->CO HRSAT HRSAT HR->HRSAT HRBP HRBP HR->HRBP HREKG HREKG HR->HREKG ERRLOWOUTPUT ERRLOWOUTPUT ERRLOWOUTPUT->HRBP HYPOVOLEMIA HYPOVOLEMIA HYPOVOLEMIA->STROKEVOLUME CATECHOL CATECHOL CATECHOL->HR SAO2 SAO2 PVSAT->SAO2 MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH BP BP CO->BP ARTCO2 ARTCO2 EXPCO2 EXPCO2 ARTCO2->EXPCO2 MINVOL MINVOL MINVOL->INTUBATION DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE SHUNT->PULMEMBOLUS SHUNT->SAO2 KINKEDTUBE KINKEDTUBE VENTLUNG VENTLUNG KINKEDTUBE->VENTLUNG VENTLUNG->MINVOL VENTLUNG->EXPCO2 VENTLUNG->VENTALV HRSAT->HREKG STROKEVOLUME->CO LVEDVOLUME->PCWP LVEDVOLUME->HYPOVOLEMIA CVP CVP LVEDVOLUME->CVP HISTORY HISTORY HISTORY->LVFAILURE INSUFFANESTH INSUFFANESTH TPR TPR TPR->BP ANAPHYLAXIS ANAPHYLAXIS ANAPHYLAXIS->TPR VENTMACH->VENTTUBE SAO2->CATECHOL VENTTUBE->PRESS VENTTUBE->VENTLUNG VENTALV->PVSAT VENTALV->ARTCO2 ERRCAUTER ERRCAUTER ERRCAUTER->HRSAT ERRCAUTER->HREKG
Learned with 10000 lines in 1.965s
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 INTUBATION INTUBATION SHUNT SHUNT INTUBATION->SHUNT INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->PRESS VENTALV VENTALV INTUBATION->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 ANAPHYLAXIS->TPR CO CO STROKEVOLUME->CO TPR->CATECHOL BP BP TPR->BP LVEDVOLUME->HYPOVOLEMIA 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 MINVOL->INTUBATION 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 HRSAT->HREKG CO->BP
Diff with MIIC
G a->b overflow c->d Missing e->f reversed g->h Correct
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 PRESS PRESS KINKEDTUBE->PRESS HYPOVOLEMIA HYPOVOLEMIA STROKEVOLUME STROKEVOLUME HYPOVOLEMIA->STROKEVOLUME LVEDVOLUME LVEDVOLUME INTUBATION INTUBATION SHUNT SHUNT INTUBATION->SHUNT MINVOL MINVOL INTUBATION->MINVOL INTUBATION->PRESS VENTALV VENTALV MINVOLSET MINVOLSET MINVOLSET->INTUBATION VENTMACH VENTMACH MINVOLSET->VENTMACH PULMEMBOLUS PULMEMBOLUS PAP PAP PULMEMBOLUS->PAP PVSAT PVSAT PULMEMBOLUS->PVSAT INSUFFANESTH INSUFFANESTH CATECHOL CATECHOL INSUFFANESTH->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HR HR ERRLOWOUTPUT->HR HRBP HRBP ERRCAUTER ERRCAUTER HRSAT HRSAT ERRCAUTER->HRSAT HREKG HREKG ERRCAUTER->HREKG FIO2 FIO2 FIO2->LVEDVOLUME FIO2->PVSAT LVFAILURE LVFAILURE LVFAILURE->STROKEVOLUME HISTORY HISTORY LVFAILURE->HISTORY DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS TPR TPR CO CO STROKEVOLUME->CO TPR->ANAPHYLAXIS BP BP TPR->BP LVEDVOLUME->HYPOVOLEMIA LVEDVOLUME->LVFAILURE PCWP PCWP CVP CVP LVEDVOLUME->CVP VENTMACH->VENTTUBE PCWP->LVEDVOLUME SHUNT->KINKEDTUBE SHUNT->PULMEMBOLUS SAO2 SAO2 SHUNT->SAO2 VENTTUBE->KINKEDTUBE VENTTUBE->VENTLUNG VENTTUBE->PRESS VENTLUNG->KINKEDTUBE VENTLUNG->INTUBATION VENTLUNG->MINVOL VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 VENTALV->INTUBATION ARTCO2 ARTCO2 VENTALV->ARTCO2 VENTALV->PVSAT ARTCO2->EXPCO2 ARTCO2->CATECHOL PVSAT->SAO2 SAO2->CATECHOL SAO2->HRBP CATECHOL->TPR HR->CATECHOL HR->HRSAT HR->CO HR->HREKG HRBP->ERRLOWOUTPUT HRBP->HR CO->BP
Diff with GHC/NMD/BDEU
G a->b overflow c->d Missing e->f reversed g->h Correct
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 MINVOLSET->VENTMACH PULMEMBOLUS PULMEMBOLUS PAP PAP PULMEMBOLUS->PAP PVSAT PVSAT PULMEMBOLUS->PVSAT INSUFFANESTH INSUFFANESTH CATECHOL CATECHOL INSUFFANESTH->CATECHOL ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP ERRCAUTER ERRCAUTER HRSAT HRSAT ERRCAUTER->HRSAT HREKG HREKG ERRCAUTER->HREKG FIO2 FIO2 PCWP PCWP FIO2->PCWP FIO2->PVSAT LVFAILURE LVFAILURE LVFAILURE->STROKEVOLUME LVFAILURE->LVEDVOLUME HISTORY HISTORY DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE ANAPHYLAXIS ANAPHYLAXIS TPR TPR ANAPHYLAXIS->TPR CO CO STROKEVOLUME->CO TPR->CATECHOL BP BP TPR->BP LVEDVOLUME->HYPOVOLEMIA LVEDVOLUME->FIO2 LVEDVOLUME->PCWP CVP CVP LVEDVOLUME->CVP VENTMACH->VENTTUBE SHUNT->PULMEMBOLUS SAO2 SAO2 SHUNT->SAO2 HISTORY->INTUBATION 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 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
print(bn2.names())
{'INTUBATION', 'PRESS', 'FIO2', 'PULMEMBOLUS', 'LVFAILURE', 'PCWP', 'HR', 'ERRLOWOUTPUT', 'HYPOVOLEMIA', 'CATECHOL', 'PVSAT', 'MINVOLSET', 'CO', 'ARTCO2', 'MINVOL', 'DISCONNECT', 'EXPCO2', 'SHUNT', 'KINKEDTUBE', 'VENTLUNG', 'HRSAT', 'BP', 'STROKEVOLUME', 'HRBP', 'LVEDVOLUME', 'HISTORY', 'INSUFFANESTH', 'HREKG', 'CVP', 'TPR', 'ANAPHYLAXIS', 'VENTMACH', 'SAO2', 'VENTTUBE', 'VENTALV', 'PAP', 'ERRCAUTER'}
gnb.showInference(bn2, evs={}, size="10")

svg

print(bn2["HRSAT"])
print(bn2["INTUBATION"])
HRSAT:Labelized({HIGH|LOW|NORMAL})
INTUBATION:Labelized({ESOPHAGEAL|NORMAL|ONESIDED})
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);

svg

svg

svg

showROC(bn2, "out/train.csv", "INTUBATION", "ESOPHAGEAL", show_progress=False);

svg

showPR(bn2, "out/train.csv", "HRSAT", "LOW", show_progress=False);

svg

showPR(bn2, "out/train.csv", "INTUBATION", "ESOPHAGEAL", show_progress=False);

svg

showROC_PR(bn2, "out/train.csv", "HRSAT", "LOW", show_progress=False);

svg

showROC_PR(bn2, "out/train.csv", "INTUBATION", "ESOPHAGEAL", show_progress=False);

svg