22from sklearn.model_selection
import train_test_split
23from tensorflow.keras.layers
import Dense, Input
24from tensorflow.keras.models
import Sequential
25from tensorflow.keras.optimizers
import Adam
28@contextlib.contextmanager
29def expect_warning(category, message):
30 """Silence a known third-party warning. Raise if it stops firing.
32 Notifies us to drop the workaround once the upstream library is fixed.
34 with warnings.catch_warnings(record=
True)
as caught:
35 warnings.simplefilter(
"always")
39 if issubclass(w.category, category)
and message
in str(w.message):
42 warnings.warn_explicit(w.message, w.category, w.filename, w.lineno)
45 f
"Expected {category.__name__} containing {message!r} was not "
46 "emitted. This tutorial's workaround can probably be removed."
53def CreateModel(nlayers=4, nunits=64):
55 model.add(Input(shape=(7,)))
56 model.add(Dense(nunits, activation=
"relu"))
57 for i
in range(1, nlayers):
58 model.add(Dense(nunits, activation=
"relu"))
60 model.add(Dense(1, activation=
"sigmoid"))
61 model.compile(loss=
"binary_crossentropy", optimizer=Adam(learning_rate=0.001), weighted_metrics=[
"accuracy"])
68 inputFile = str(ROOT.gROOT.GetTutorialDir()) +
"/machine_learning/data/Higgs_data.root"
71 sigData = df1.AsNumpy(columns=[
"m_jj",
"m_jjj",
"m_lv",
"m_jlv",
"m_bb",
"m_wbb",
"m_wwbb"])
75 xsig = np.column_stack(list(sigData.values()))
76 data_sig_size = xsig.shape[0]
77 print(
"size of data", data_sig_size)
81 bkgData = df2.AsNumpy(columns=[
"m_jj",
"m_jjj",
"m_lv",
"m_jlv",
"m_bb",
"m_wbb",
"m_wwbb"])
82 xbkg = np.column_stack(list(bkgData.values()))
83 data_bkg_size = xbkg.shape[0]
85 ysig = np.ones(data_sig_size)
86 ybkg = np.zeros(data_bkg_size)
87 inputs_data = np.concatenate((xsig, xbkg), axis=0)
88 inputs_targets = np.concatenate((ysig, ybkg), axis=0)
92 x_train, x_test, y_train, y_test = train_test_split(inputs_data, inputs_targets, test_size=0.50, random_state=1234)
94 return x_train, y_train, x_test, y_test
97def TrainModel(model, x, y, name):
98 model.fit(x, y, epochs=5, batch_size=50)
99 modelFile = name +
".keras"
103 if tuple(
int(p)
for p
in np.__version__.split(
".")[:2]) >= (2, 0):
104 ctx = expect_warning(DeprecationWarning,
"__array__ implementation doesn't accept a copy keyword")
106 ctx = contextlib.nullcontext()
109 model.save(modelFile)
115x_train, y_train, x_test, y_test = PrepareData()
119model1 = TrainModel(CreateModel(4, 64), x_train, y_train,
"Higgs_Model_4L_50")
120model2 = TrainModel(CreateModel(4, 64), x_train, y_train,
"Higgs_Model_4L_200")
121model3 = TrainModel(CreateModel(4, 64), x_train, y_train,
"Higgs_Model_2L_500")
126def GenerateModelCode(modelFile, generatedHeaderFile):
127 model = ROOT.TMVA.Experimental.SOFIE.PyKeras.Parse(modelFile)
129 print(
"Generating inference code for the Keras model from ", modelFile,
"in the header ", generatedHeaderFile)
131 model.Generate(ROOT.TMVA.Experimental.SOFIE.Options.kRootBinaryWeightFile)
133 model.OutputGenerated(generatedHeaderFile,
True)
135 return generatedHeaderFile
138generatedHeaderFile =
"Higgs_Model.hxx"
140if os.path.exists(generatedHeaderFile):
141 print(
"removing existing file", generatedHeaderFile)
142 os.remove(generatedHeaderFile)
144weightFile =
"Higgs_Model.root"
145if os.path.exists(weightFile):
146 print(
"removing existing file", weightFile)
147 os.remove(weightFile)
149GenerateModelCode(model1, generatedHeaderFile)
150GenerateModelCode(model2, generatedHeaderFile)
151GenerateModelCode(model3, generatedHeaderFile)
155ROOT.gInterpreter.Declare(
'#include "' + generatedHeaderFile +
'"')
159session1 = ROOT.TMVA_SOFIE_Higgs_Model_4L_50.Session(
"Higgs_Model.root")
160session2 = ROOT.TMVA_SOFIE_Higgs_Model_4L_200.Session(
"Higgs_Model.root")
161session3 = ROOT.TMVA_SOFIE_Higgs_Model_2L_500.Session(
"Higgs_Model.root")
163hs1 = ROOT.TH1D(
"hs1",
"Signal result 4L 50", 100, 0, 1)
164hs2 = ROOT.TH1D(
"hs2",
"Signal result 4L 200", 100, 0, 1)
165hs3 = ROOT.TH1D(
"hs3",
"Signal result 2L 500", 100, 0, 1)
167hb1 = ROOT.TH1D(
"hb1",
"Background result 4L 50", 100, 0, 1)
168hb2 = ROOT.TH1D(
"hb2",
"Background result 4L 200", 100, 0, 1)
169hb3 = ROOT.TH1D(
"hb3",
"Background result 2L 500", 100, 0, 1)
172def EvalModel(session, x):
173 result = session.infer(x)
177for i
in range(0, x_test.shape[0]):
178 result1 = EvalModel(session1, x_test[i, :])
179 result2 = EvalModel(session2, x_test[i, :])
180 result3 = EvalModel(session3, x_test[i, :])
191def PlotHistos(hs, hb):
192 hs.SetLineColor(
"kRed")
193 hb.SetLineColor(
"kBlue")
213 x = ROOT.std.vector[
"float"](n)
214 w = ROOT.std.vector[
"float"](n)
215 for i
in range(0, n):
216 x[i] = h.GetBinCenter(i + 1)
217 w[i] = h.GetBinContent(i + 1)
221def MakeROCCurve(hs, hb):
222 xs, ws = GetContent(hs)
223 xb, wb = GetContent(hb)
224 roc = ROOT.TMVA.ROCCurve(xs, xb, ws, wb)
225 print(
"ROC integral for ", hs.GetName(), roc.GetROCIntegral())
226 curve = roc.GetROCCurve()
227 curve.SetName(hs.GetName())
233r1, curve1 = MakeROCCurve(hs1, hb1)
234curve1.SetLineColor(
"kRed")
237r2, curve2 = MakeROCCurve(hs2, hb2)
238curve2.SetLineColor(
"kBlue")
241r3, curve3 = MakeROCCurve(hs3, hb3)
242curve3.SetLineColor(
"kGreen")
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...