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.dsl")
bn
G PAP PAP HREKG HREKG ANAPHYLAXIS ANAPHYLAXIS TPR TPR ANAPHYLAXIS->TPR DISCONNECT DISCONNECT VENTTUBE VENTTUBE DISCONNECT->VENTTUBE CATECHOL CATECHOL TPR->CATECHOL BP BP TPR->BP SAO2 SAO2 SAO2->CATECHOL HRSAT HRSAT CO CO CO->BP PCWP PCWP SHUNT SHUNT SHUNT->SAO2 INTUBATION INTUBATION INTUBATION->SHUNT VENTALV VENTALV INTUBATION->VENTALV VENTLUNG VENTLUNG INTUBATION->VENTLUNG MINVOL MINVOL INTUBATION->MINVOL PRESS PRESS INTUBATION->PRESS HR HR CATECHOL->HR VENTTUBE->VENTLUNG VENTTUBE->PRESS STROKEVOLUME STROKEVOLUME STROKEVOLUME->CO MINVOLSET MINVOLSET VENTMACH VENTMACH MINVOLSET->VENTMACH HISTORY HISTORY PVSAT PVSAT VENTALV->PVSAT ARTCO2 ARTCO2 VENTALV->ARTCO2 INSUFFANESTH INSUFFANESTH INSUFFANESTH->CATECHOL FIO2 FIO2 FIO2->PVSAT CVP CVP VENTLUNG->VENTALV EXPCO2 EXPCO2 VENTLUNG->EXPCO2 VENTLUNG->MINVOL PULMEMBOLUS PULMEMBOLUS PULMEMBOLUS->PAP PULMEMBOLUS->SHUNT VENTMACH->VENTTUBE ERRLOWOUTPUT ERRLOWOUTPUT HRBP HRBP ERRLOWOUTPUT->HRBP PVSAT->SAO2 HR->HREKG HR->HRSAT HR->CO HR->HRBP HYPOVOLEMIA HYPOVOLEMIA HYPOVOLEMIA->STROKEVOLUME LVEDVOLUME LVEDVOLUME HYPOVOLEMIA->LVEDVOLUME ERRCAUTER ERRCAUTER ERRCAUTER->HREKG ERRCAUTER->HRSAT LVEDVOLUME->PCWP LVEDVOLUME->CVP ARTCO2->CATECHOL ARTCO2->EXPCO2 KINKEDTUBE KINKEDTUBE KINKEDTUBE->VENTLUNG KINKEDTUBE->PRESS LVFAILURE LVFAILURE LVFAILURE->STROKEVOLUME LVFAILURE->HISTORY LVFAILURE->LVEDVOLUME
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 : -150642.1695277766

out/train.csv: 0%| |

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

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