From a Bayesian network to a Classifier
This notebook shows how to build a classifier from an Bayesian network (and not from a database).
In [1]:
import pyAgrum as gum
import pyAgrum.skbn as skbn
import pyAgrum.lib.notebook as gnb
In [2]:
bn=gum.loadBN("res/alarm.dsl")
gnb.showBN(bn,size="10")
print(bn.variable("HR"))
HR:Labelized({LOW|NORMAL|HIGH})
Let’s say that you would like to use this Bayesian network to learn a classifier for the class HR (3 classes)
In [3]:
#generating the base of 100 values for testing purpose
print(f"LL(alarm-100)={gum.generateSample(bn,100,'out/alarm-100.csv')}")
LL(alarm-100)=-1560.9605754123863
In [4]:
bnc=skbn.BNClassifier()
bnc.fromTrainedModel(bn,targetAttribute="HR")
print(f"Binary classifier : {bnc.isBinaryClassifier}")
gnb.showBN(bnc.MarkovBlanket)
xTrain, yTrain = bnc.XYfromCSV(filename ='out/alarm-100.csv' )
print(f"predicted : {list(bnc.predict(xTrain))}")
print(f"in base : {yTrain.to_list()}")
Binary classifier : False
predicted : [np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('LOW'), np.str_('HIGH'), np.str_('HIGH')]
in base : ['HIGH', 'HIGH', 'NORMAL', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'NORMAL', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'NORMAL', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'HIGH', 'NORMAL', 'HIGH', 'HIGH']
In [5]:
print(list(bnc.predict(X ='out/alarm-100.csv')))
[np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('NORMAL'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('HIGH'), np.str_('LOW'), np.str_('HIGH'), np.str_('HIGH')]
In [6]:
scoreCSV1 = bnc.score('out/alarm-100.csv', y = yTrain)
print("{0:.2f}% good predictions".format(100*scoreCSV1))
99.00% good predictions
From a Bayesian network to a Binary classifier
By targetting a specific label, one can create a binary classifier to predict this very target.
In [7]:
bnc=skbn.BNClassifier()
bnc.fromTrainedModel(bn,targetAttribute="HR",targetModality="LOW")
print(f"Binary classifier : {bnc.isBinaryClassifier}")
Binary classifier : True
In [8]:
gnb.showBN(bnc.MarkovBlanket)
In [9]:
xTrain, yTrain = bnc.XYfromCSV(filename ='out/alarm-100.csv' )
print(f"predicted : {list(bnc.predict(xTrain))}")
print(f"in base : {yTrain.to_list()}")
predicted : [np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_]
in base : [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
In [10]:
print(list(bnc.predict(X ='out/alarm-100.csv')))
[np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_, np.False_]
In [11]:
scoreCSV1 = bnc.score('out/alarm-100.csv', y = yTrain)
print("{0:.2f}% good predictions".format(100*scoreCSV1))
100.00% good predictions
In [12]:
print(f"LL(alarm-1000)={gum.generateSample(bn,1000,'out/alarm-1000.csv',with_labels=True)}")
bnc.showROC_PR('out/alarm-1000.csv')
LL(alarm-1000)=-15454.296758363702
In [13]:
import pyAgrum.lib.bn2roc as bn2roc
bn2roc.animROC(bnc.bn,'out/alarm-1000.csv',target="HR",label="LOW")
Out[13]:
In [14]:
bn2roc.animPR(bnc.bn,'out/alarm-1000.csv',target="HR",label="LOW")
Out[14]:
In [ ]: