{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pyarrow.parquet as pq\n", "import numpy as np\n", "import pandas as pd\n", "from tensorflow.keras.layers import *\n", "from tensorflow.keras.layers import Concatenate\n", "from tensorflow.keras.models import Sequential, Model\n", "from tensorflow.keras.optimizers import Adam\n", "from tensorflow.keras.utils import to_categorical\n", "from tensorflow.keras.metrics import AUC\n", "import tensorflow as tf\n", "import warnings\n", "warnings.filterwarnings('ignore')\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "file = 'QCDToGGQQ_IMGjet_RH1all_jet0_run0_n36272.test.snappy.parquet'" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data = pq.read_table(file)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "data = data.to_pandas()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_jetsptm0y
0[[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...112.41109521.0982480.0
1[[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...95.22040614.0306001.0
2[[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...97.00731717.7289681.0
3[[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...82.49031114.7027410.0
4[[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.328483...102.53923819.4562570.0
\n", "
" ], "text/plain": [ " X_jets pt m0 \\\n", "0 [[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0... 112.411095 21.098248 \n", "1 [[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0... 95.220406 14.030600 \n", "2 [[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0... 97.007317 17.728968 \n", "3 [[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0... 82.490311 14.702741 \n", "4 [[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.328483... 102.539238 19.456257 \n", "\n", " y \n", "0 0.0 \n", "1 1.0 \n", "2 1.0 \n", "3 0.0 \n", "4 0.0 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "70.3982162475586" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['pt'].min()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "pt = data['pt'].to_numpy()\n", "m0 = data['m0'].to_numpy()\n", "y = data['y'].to_numpy()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "X_jets = data['X_jets'].to_numpy()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "X = np.zeros((36272,3,125,125))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "for i in range(0,36272):\n", " for j in range(0,3):\n", " for k in range(0,125):\n", " for l in range(0,125):\n", " X[i][j][k][l] = X_jets[i][j][k][l]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "del data\n", "del X_jets" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "y = to_categorical(y, num_classes=2)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(36272,)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pt.shape" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "\n", "input1 = Input(shape=(3,125,125))\n", "input2 = Input(shape=(1,))\n", "input3 = Input(shape=(1,))\n", "x1 = Conv2D(3, (5,5), activation='relu', input_shape=(3, 125, 125), data_format='channels_first', padding='same')(input1)\n", "x1 = MaxPooling2D((5,5), data_format='channels_first')(x1)\n", "x1 = Flatten()(x1)\n", "x1 = Dense(12, activation='relu')(x1)\n", "x2 = Dense(4, activation='relu')(input2)\n", "x3 = Dense(4, activation='relu')(input3)\n", "\n", "x = Concatenate(axis=1)([x1, x2, x3])\n", "output = Dense(2, activation='softmax')(x)\n", "model = Model(inputs=[input1, input2, input3], outputs=output)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"model\"\n", "__________________________________________________________________________________________________\n", " Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", " input_1 (InputLayer) [(None, 3, 125, 125 0 [] \n", " )] \n", " \n", " conv2d (Conv2D) (None, 3, 125, 125) 228 ['input_1[0][0]'] \n", " \n", " max_pooling2d (MaxPooling2D) (None, 3, 25, 25) 0 ['conv2d[0][0]'] \n", " \n", " flatten (Flatten) (None, 1875) 0 ['max_pooling2d[0][0]'] \n", " \n", " input_2 (InputLayer) [(None, 1)] 0 [] \n", " \n", " input_3 (InputLayer) [(None, 1)] 0 [] \n", " \n", " dense (Dense) (None, 12) 22512 ['flatten[0][0]'] \n", " \n", " dense_1 (Dense) (None, 4) 8 ['input_2[0][0]'] \n", " \n", " dense_2 (Dense) (None, 4) 8 ['input_3[0][0]'] \n", " \n", " concatenate (Concatenate) (None, 20) 0 ['dense[0][0]', \n", " 'dense_1[0][0]', \n", " 'dense_2[0][0]'] \n", " \n", " dense_3 (Dense) (None, 2) 42 ['concatenate[0][0]'] \n", " \n", "==================================================================================================\n", "Total params: 22,798\n", "Trainable params: 22,798\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] }, { "data": { "image/png": "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8cdGkpk0aZJH3y+++MJ07drVVFZW1ll/YWGh6du3r8nIyDBVVVVez6enpxtJZvny5R7te/fuNWFhYT4P7Tk5OfV6H38dd2POLrSXlpYS2gEAaD6yWB7TRN566y1JqnXXkg8++EBTp0716Dds2DCPPmFhYUpJSVFZWZn++c9/eh2jX79+Hl/HxcVJkvbt2+duS0lJ0SWXXKJFixapqKjI3T5nzhxNnTq1zvXdx44dU2pqqi688EItXrxYwcHBXn0+/PBDSVJqaqpHe6dOndS7d+9aj9sUOnXqJEkqLCys1+v8ddzP1v79+yVJTqdT7dq1a/BxAACAPRDam0BFRYWKi4vVokULRUZGNrhfTEyMJCk/P9/ruaioKI+vQ0NDJf28Z/nJ/t//+38qLS1135C4bds2/fvf/9b48eNrramqqkrp6enq3Lmz/vKXv9QaHCsqKnT06FG1aNFCLVu29Hq+Q4cOtR67KQwaNEiS9M0335z1a/x13Ouj5t6C5ORkOZ3OczoWAACwHqG9CYSFhSkqKkrl5eU6evRog/v99NNPkqTY2NgG15KRkaG4uDi99NJLqqio0HPPPacJEybU+Y+JiRMnqqKiQllZWR6fCMfHx2vt2rXuuiMjI1VeXq6SkhKvYxw8eLDB9dbXxIkTFRISouXLl5+23/3336+goCBt2bLFb8f9bFVXV+vll1+WJN19990NPgcAAGAfhPYmctNNN0mS3n//fa/nLrnkEt13330e/d577z2PPhUVFfrkk0/kcrm8lqDUR0hIiKZMmaIDBw7oueee05IlS3TvvffW2vfxxx/Xpk2b9PbbbyssLOy0x61Z9lOzTKZGYWGhtm7d2uB666t379567LHH9NVXX+n111+vtc/WrVv12muvafTo0brgggsk+e+4n40HH3xQOTk5uummm864FSYAAPATVq+q9wfnsntMx44dzbvvvmuOHDlidu/ebX73u9+ZmJgY88MPP3j0q9nF5MiRIx67mCxYsMDjuDU3RJaVlXm0z5w500gy69ev96rlyJEjJioqyjgcDjNu3Lha633jjTfcNy7W9cjOznb337Fjh2nTpo3H7jGbNm0yqamppkOHDj67EbXGAw88YJxOp5k5c6bZunWrqaioMHv27DELFy40HTt2NAMGDDAlJSXu/v467sZ434h64sQJ89NPP5kVK1aYa6+91kgyd955pyktLa33OBrDjagAANgQu8ecjYaGmMLCQjN16lTTvXt343Q6TceOHc3NN99stm3bdtp+UVFRJjU11XzyySfuPtnZ2V5hbtasWcYY49U+bNgwr1pmzJhhJJm8vLxaax02bFi9w+PWrVvNjTfeaFq1auXe+vDdd981KSkp7tfcdddd9RqzhoZ2Y4zJyckxt956q4mLizNOp9NERkaa/v37mxdeeMFUVFR49ffHcY+IiPB63uFwmKioKJOQkGB+97vfmXXr1jVo/GoQ2gEAsJ0shzHGnPvn9c1bzRKDmj94g6bjcDi0dOlSjR492upSAhbXOwAAtrOMNe0AAACAzRHaAQAAAJsjtAMAAAA2R2gHAAAAbI7QDgAAANgcoR0AAACwOUI7AAAAYHOEdgAAAMDmCO0AAACAzRHaAQAAAJsjtAMAAAA2R2gHAAAAbI7QDgAAANgcoR0AAACwOUI7AAAAYHOEdgAAAMDmCO0AAACAzYVYXYC/2LNnj7KysqwuIyBkZ2dbXUJA27Nnj7p06WJ1GQAA4CQOY4yxugi7S09P1/Lly60uA/CZUaNGadmyZVaXAQAAfraM0A7bGj16tCTxGw4AABDolrGmHQAAALA5QjsAAABgc4R2AAAAwOYI7QAAAIDNEdoBAAAAmyO0AwAAADZHaAcAAABsjtAOAAAA2ByhHQAAALA5QjsAAABgc4R2AAAAwOYI7QAAAIDNEdoBAAAAmyO0AwAAADZHaAcAAABsjtAOAAAA2ByhHQAAALA5QjsAAABgc4R2AAAAwOYI7QAAAIDNEdoBAAAAmyO0AwAAADZHaAcAAABsjtAOAAAA2ByhHQAAALA5QjsAAABgc4R2AAAAwOYI7QAAAIDNEdoBAAAAmyO0AwAAADZHaAcAAABsjtAOAAAA2ByhHQAAALC5EKsLACTpyy+/VF5enkfb999/L0lasGCBR3ufPn3Uv39/n9UGAABgNUI7bOHAgQOaOHGigoODFRT08y+AjDGSpHvuuUeSVF1drRMnTuidd96xrE4AAAArOExNMgIsVFlZqXbt2unIkSOn7RcZGanCwkKFhob6qDIAAADLLWNNO2zB6XTq5ptvPm0YdzqdGjNmDIEdAAAEHEI7bGPMmDE6fvx4nc9XVlbqlltu8WFFAAAA9sDyGNhGdXW1OnXqpJ9++qnW59u3b6/8/Hz3mncAAIAAwfIY2EdQUJDGjh1b6/KX0NBQ3XbbbQR2AAAQkEhAsJW6lsgcP35cY8aMsaAiAAAA67E8BrYTHx+vnTt3erR169ZNu3btsqYgAAAAa7E8BvYzduxYOZ1O99ehoaG64447LKwIAADAWnzSDtvZsWOHevXq5dG2detW9e7d26KKAAAALMUn7bCf+Ph49enTRw6HQw6HQ3369CGwAwCAgEZohy2NGzdOwcHBCg4O1rhx46wuBwAAwFIsj4Et7du3T3FxcTLG6Mcff1SXLl2sLgkAAMAqy0JObcnKylJGRoYVxQC1iouLs7oEQEuXLtXo0aOtLgMAEKC8QnuNpUuX+rIOwMvHH38sh8OhlJQUZWRkaOrUqUpOTra6LAQgPsgAAFitztDOJ0qwWkpKiiSpbdu2ysjIUHJyMtclLEFoBwBYrc7QDlitbdu2VpcAAABgC+weAwAAANgcoR0AAACwOUI7AAAAYHOEdgAAAMDmCO0AAACAzRHaAQAAAJsjtAMAAAA2R2gHAAAAbI7QDgAAANgcoR0AAACwOUI7AAAAYHOEdgAAAMDmCO02MnfuXDkcDjkcDnXp0sXqciRJhw4d0vz583XttdeqTZs2crlc6tWrlzIzM5WXl3dWx1iyZIn7vFq0aNHEFUslJSXu96t5ZGdnn/F1M2bM8HjNk08+2aR1tmzZ0qtOh8OhoKAgtW/fXjfeeKNyc3ObtIbmcM3VNo5BQUGKjo5WYmKiJk2apHXr1llwJgAANB5Cu41Mnz5dxhglJiZ6PVdSUqJevXpp+PDhPq1pxowZmjx5stLS0rR582YVFRXp9ddf14YNG5SUlKQVK1ac8Rg333yzjDFKSUnxQcU/hzhjjNavX+9umz179mlfU1RUpPnz50uSMjMzZYzRww8/3KR1lpSUuGtMS0uTMUbGGB06dEgLFixQdna2rrrqKn388cdNVkNzuOZqG8fKykpt2bJFTzzxhLZs2aLLLrtMd9xxh0pLS316LgAANBZCu58wxqi6ulrV1dU+f+8777xTU6ZMUWxsrMLDwzVw4EC9+eabOnHihO6//36f11MfLpdL3bp10wcffKCvvvqqzn7z5s1TXFycDyurW1RUlG666SY9//zzqqys1NSpUy2pw5+vueDgYMXExCgtLU2ffvqp7r//fi1atEhjxoyRMcYHZwAAQOMitPuJyMhI7dy5U++//75P33fhwoV67bXXvNoTExPlcrm0c+dOW4egoKAgPfDAA5JU53KXw4cP69VXX9XMmTN9WdoZXXPNNZKkTZs26fDhwz5//+Z0zT399NO64oor9M4772jJkiWNVSoAAD5DaEeDHDt2TGVlZbr44ovlcDisLue07rjjDnXu3FnvvPOOvvnmG6/nX3zxRf3qV79Sz549LaiubicHU7uPsS+cyzXncDh0zz33SJJeeeWVpigPAIAmdc6hfcWKFR43gP3www/KyMhQZGSk2rZtq1tvvVWHDh3Srl27dMMNNygyMlIdO3bUhAkTdPToUY9jVVVVaenSpbruuusUGxsrl8ulhIQEvfDCCx6/oh8wYIDHe44dO1aSNGTIEI/2s/108tSb8XJzc5WSkqLIyEiFh4frmmuu0erVq71eV1RUpGnTpqlnz54KDQ1VdHS0rr/+eq1ateqc+p5pjMvLy2tt37VrlzIyMtS6dWu1bdtWw4cP186dO72Ot2XLFt14442KiopSeHi4Lr/8cr377rse4zd+/PjT1rRs2TJJ0qxZs057/IiICA0cOFBffPHFGc+zqYSFhWnGjBkyxug//uM/PJ4rKSnRH//4Rz300EN1vt6q6/Kzzz6TJF100UWKioqSxDUn1X7NnY0BAwZIktauXavKysoGHQMAAMuYUyxdutTU0nxGaWlpRpIZOXKk+eqrr0xJSYn561//aiSZ66+/3qSlpZn169ebo0ePmvnz5xtJ5r777vM4xsqVK40k84c//MEcPHjQFBQUmBdffNEEBQWZ6dOne/TdsGGDiYiIMImJiaakpMQYY0x5ebm54oorzN///vd612+MMYmJiSYiIsIkJyebNWvWmJKSEpObm2v69OljQkNDzWeffebuu3//ftO9e3cTExNjVq5caYqLi83WrVvNyJEjjcPhMH/6058a1Lemjs6dO9c5xmVlZbW2p6Wluev+6KOPjMvlMv369fPou337dtO6dWvTuXNn869//cscPXrUfPvtt2bIkCGmffv2Jiws7IzjlJ+fb2JiYsz48eO9nqvt+N98840ZOnSoOe+8887q+LWRZJYuXVqv16xfv95EREQYY4wpLS01MTExJigoyGzevNnd5+mnnzajR482xhjz3//930aSyczM9DhOU16X69evd3/vahQXF5t//OMfpkOHDsbpdJqPPvrIGMM1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XGVlpdavX6/Y2FhFRkbqf/7nfzR//nwdPnxYy5cvV69evayOCDRolHagEahatLpx40b9/e9/V0REhKZNm6brr7+eRasALsvJkyeVkpKiLl26aMSIETp79qxWrlyp3NxcJSUlqVWrVlZHBDwCpR1oZKKjo5WWlqa8vDyNGjVKTz31lDp16qTk5GQdO3bM6ngAGohvvvlGM2bMUPv27fXHP/5Rw4cP165du5SVlaX4+Hg1adLE6oiAR6G0A43U+YtWH3nkEb322mvq0KEDi1YB1OjcuXNKT09XTEyMoqKi9NVXX+n555/X4cOHtXTpUnXv3t3qiIDHorQDjVybNm2UnJysw4cPV1u0umnTJqvjAbCBwsJCLVq0SF26dNGkSZPk7++vrKws7d69W3PmzFHTpk2tjgh4PEo7AEnVF60eP35cAwcOZNEq0Ijl5OQoMTFRYWFhevnll3XPPffowIEDyszM1LBhw+RwOKyOCDQalHYAbqoWrW7atOmCi1bPnDljdUQAV9HZs2e1fPly3XTTTerTp492796t1157TQcPHtTChQsVFhZmdUSgUaK0A6hR1aLV3NzcaotWjx8/bnU8AFfQ/v37NX/+fHXo0EHTp09Xt27dtHHjRm3btk3Tp0+Xv7+/1RGBRo3SDuCiunbt6lq0OnPmTL322mtq3769EhMTlZeXZ3U8AHVUdW71CRMm6Prrr9d///d/a9asWcrPz1daWpoGDBhgdUQA/4fSDuCSVS1aPXjwoF599VV9/fXXuuGGGxQbG6vs7Gyr4wG4RKdOnVJqaqp69uypmJgYFRQU6P3339ehQ4eUnJysa665xuqIAH6D0g6g1po1a6bp06drz549ysjI0LFjxzRgwABFR0crPT2dRauATeXl5WnOnDlq166d5s6dq+joaP3jH//Qhg0bFB8fL29vb6sjAqgBpR1AnVUtWs3Oztbf//53tWzZUgkJCYqMjGTRKmATlZWVyszMVExMjLp3765169ZpwYIFOnTokJYuXaoePXpYHRHAJaC0A7gioqOjlZmZqby8PP3Lv/wLi1YBi/38889atGiRIiIiNGbMGEnShx9+qLy8PCUlJally5YWJwRQG5R2AFfUddddp5SUFP3www+aOXOm/vznPys8PFwzZszQ3r17rY4HeLycnBzNmDFDnTp10gsvvKC4uDh9//33ysrKUmxs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", "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.summary()\n", "tf.keras.utils.plot_model(model)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "model.compile(loss=\"categorical_crossentropy\", optimizer=Adam(learning_rate=0.0005), metrics=[AUC()])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "1021/1021 [==============================] - 14s 14ms/step - loss: 6.1948 - auc: 0.5858 - val_loss: 2.0117 - val_auc: 0.6429\n", "Epoch 2/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 1.3758 - auc: 0.6577 - val_loss: 0.8610 - val_auc: 0.6683\n", "Epoch 3/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.7029 - auc: 0.7002 - val_loss: 0.6296 - val_auc: 0.7243\n", "Epoch 4/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.6042 - auc: 0.7456 - val_loss: 0.6179 - val_auc: 0.7396\n", "Epoch 5/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.5899 - auc: 0.7592 - val_loss: 0.5967 - val_auc: 0.7645\n", "Epoch 6/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.5832 - auc: 0.7657 - val_loss: 0.5872 - val_auc: 0.7658\n", "Epoch 7/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.5770 - auc: 0.7714 - val_loss: 0.5954 - val_auc: 0.7581\n", "Epoch 8/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.5753 - auc: 0.7734 - val_loss: 0.5790 - val_auc: 0.7739\n", "Epoch 9/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.5692 - auc: 0.7786 - val_loss: 0.5873 - val_auc: 0.7703\n", "Epoch 10/10\n", "1021/1021 [==============================] - 12s 12ms/step - loss: 0.5630 - auc: 0.7851 - val_loss: 0.5882 - val_auc: 0.7710\n" ] } ], "source": [ "with tf.device('/gpu:0'):\n", " model.fit([X, pt, m0], y, epochs=10, batch_size=32, validation_split=0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Train AUC Score: 0.785\n", "\n", "Validation AUC Score: 0.771" ] } ], "metadata": { "interpreter": { "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" }, "kernelspec": { "display_name": "Python 3.8.10 64-bit", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }