{ "cells": [ { "cell_type": "code", "execution_count": 6, "id": "0fbbb46c-1a00-4585-9ecd-a490a46e8b99", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "go.obo: fmt(1.2) rel(2025-03-16) 43,544 Terms\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Melvin\\anaconda3\\envs\\protein_env\\lib\\site-packages\\sklearn\\base.py:380: InconsistentVersionWarning: Trying to unpickle estimator MultiLabelBinarizer from version 1.1.3 when using version 1.6.1. This might lead to breaking code or invalid results. Use at your own risk. For more info please refer to:\n", "https://scikit-learn.org/stable/model_persistence.html#security-maintainability-limitations\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ProtBERT Fmax=0.6611 Thr=0.45 AuPRC=0.6951 Smin=13.4386\n", " ProtBERT-BFD Fmax=0.6588 Thr=0.46 AuPRC=0.6991 Smin=13.5461\n", " ESM-2 Fmax=0.6378 Thr=0.35 AuPRC=0.6850 Smin=14.4083\n", " Ensemble Fmax=0.6880 Thr=0.37 AuPRC=0.7334 Smin=12.7141\n" ] } ], "source": [ "# %%\n", "import numpy as np, joblib, math\n", "from sklearn.metrics import precision_recall_curve, auc\n", "from goatools.obo_parser import GODag\n", "\n", "GO_FILE = \"go.obo\"\n", "dag = GODag(GO_FILE)\n", "\n", "# y_true + GO terms (referência ProtBERT)\n", "test_pb = joblib.load(\"embeddings/test_protbert.pkl\")\n", "y_true = test_pb[\"labels\"] # (1724, 597) ← ground-truth\n", "go_ref = list(test_pb[\"go_terms\"]) # ordem exacta das colunas\n", "\n", "n_go = len(go_ref) # 597\n", "\n", "# Carregar predições\n", "y_pb = np.load(\"predictions/mf-protbert-pam1.npy\") # 1724×597\n", "y_bfd = np.load(\"predictions/mf-protbertbfd-pam1.npy\") # 1724×597\n", "y_esm0 = np.load(\"predictions/mf-esm2.npy\") # 1724×602\n", "\n", "# Remapear ESM-2 para ordem ProtBERT\n", "mlb_esm = joblib.load(\"data/mlb.pkl\") # 602 GO terms\n", "idx_map = [list(mlb_esm.classes_).index(t) for t in go_ref]\n", "y_esm = y_esm0[:, idx_map] # 1724×597\n", "\n", "# Garantir shapes iguais\n", "assert (y_true.shape == y_pb.shape == y_bfd.shape\n", " == y_esm.shape == (1724, n_go)), \"Ainda há desalinhamento!\"\n", "\n", "# Métricas\n", "THR = np.linspace(0,1,101)\n", "def fmax(y_t,y_p):\n", " best,thr = 0,0\n", " for t in THR:\n", " y_b = (y_p>=t).astype(int)\n", " tp = (y_t*y_b).sum(1); fp=((1-y_t)*y_b).sum(1); fn=(y_t*(1-y_b)).sum(1)\n", " f1 = 2*tp/(2*tp+fp+fn+1e-8); m=f1.mean()\n", " if m>best: best,thr = m,t\n", " return best,thr\n", "\n", "def auprc(y_t,y_p):\n", " p,r,_ = precision_recall_curve(y_t.ravel(), y_p.ravel()); return auc(r,p)\n", "\n", "def smin(y_t,y_p,thr,alpha=0.5):\n", " y_b=(y_p>=thr).astype(int)\n", " ic=-(np.log((y_t+y_b).sum(0)+1e-8)-np.log((y_t+y_b).sum()+1e-8))\n", " ru=np.logical_and(y_b, np.logical_not(y_t))*ic\n", " mi=np.logical_and(y_t, np.logical_not(y_b))*ic\n", " return np.sqrt((alpha*ru.sum(1))**2 + ((1-alpha)*mi.sum(1))**2).mean()\n", "\n", "def show(name,y_p):\n", " f,thr=fmax(y_true,y_p)\n", " print(f\"{name:>13s} Fmax={f:.4f} Thr={thr:.2f} \"\n", " f\"AuPRC={auprc(y_true,y_p):.4f} Smin={smin(y_true,y_p,thr):.4f}\")\n", "\n", "show(\"ProtBERT\", y_pb)\n", "show(\"ProtBERT-BFD\", y_bfd)\n", "show(\"ESM-2\", y_esm)\n", "show(\"Ensemble\", (y_pb + y_bfd + y_esm)/3)\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "f1807404-c2ce-48d0-b87c-a7e0fecc1728", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/50\n", "19/19 [==============================] - 1s 12ms/step - loss: 0.3895 - val_loss: 0.0855\n", "Epoch 2/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0879 - val_loss: 0.0704\n", "Epoch 3/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0625 - val_loss: 0.0567\n", "Epoch 4/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0553 - val_loss: 0.0526\n", "Epoch 5/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0508 - val_loss: 0.0484\n", "Epoch 6/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0468 - val_loss: 0.0452\n", "Epoch 7/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0433 - val_loss: 0.0428\n", "Epoch 8/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0407 - val_loss: 0.0409\n", "Epoch 9/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0387 - val_loss: 0.0395\n", "Epoch 10/50\n", "19/19 [==============================] - 0s 10ms/step - loss: 0.0369 - val_loss: 0.0382\n", "Epoch 11/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0352 - val_loss: 0.0367\n", "Epoch 12/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0339 - val_loss: 0.0359\n", "Epoch 13/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0328 - val_loss: 0.0352\n", "Epoch 14/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0315 - val_loss: 0.0344\n", "Epoch 15/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0305 - val_loss: 0.0341\n", "Epoch 16/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0296 - val_loss: 0.0336\n", "Epoch 17/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0291 - val_loss: 0.0332\n", "Epoch 18/50\n", "19/19 [==============================] - 0s 8ms/step - loss: 0.0282 - val_loss: 0.0331\n", "Epoch 19/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0273 - val_loss: 0.0329\n", "Epoch 20/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0269 - val_loss: 0.0329\n", "Epoch 21/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0264 - val_loss: 0.0324\n", "Epoch 22/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0257 - val_loss: 0.0325\n", "Epoch 23/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0253 - val_loss: 0.0324\n", "Epoch 24/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0246 - val_loss: 0.0322\n", "Epoch 25/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0247 - val_loss: 0.0323\n", "Epoch 26/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0241 - val_loss: 0.0321\n", "Epoch 27/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0236 - val_loss: 0.0323\n", "Epoch 28/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0233 - val_loss: 0.0324\n", "Epoch 29/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0228 - val_loss: 0.0325\n", "Epoch 30/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0227 - val_loss: 0.0323\n", "Epoch 31/50\n", "19/19 [==============================] - 0s 9ms/step - loss: 0.0219 - val_loss: 0.0325\n", "27/27 [==============================] - 0s 2ms/step\n", "\n", " STACKING (GPU-Keras MLP)\n", "Fmax = 0.6956\n", "Thr. = 0.37\n", "AuPRC = 0.7591\n", "Smin = 12.2272\n" ] } ], "source": [ "# %%\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Dropout\n", "from tensorflow.keras.optimizers import Adam\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import precision_recall_curve, auc\n", "import numpy as np\n", "import math\n", "\n", "# Preparar dados para stacking\n", "# (já com y_pb, y_bfd, y_esm com shape (1724, 597))\n", "X_stack = np.concatenate([y_pb, y_bfd, y_esm], axis=1) # (1724, 597*3)\n", "y_stack = y_true.copy() # (1724, 597)\n", "\n", "# Divisão treino/validação\n", "X_train, X_val, y_train, y_val = train_test_split(X_stack, y_stack, test_size=0.3, random_state=42)\n", "\n", "# Modelo MLP (usa GPU automaticamente se disponível)\n", "from tensorflow.keras.callbacks import EarlyStopping\n", "\n", "model = Sequential([\n", " Dense(512, activation=\"relu\", input_shape=(X_train.shape[1],)),\n", " Dropout(0.3),\n", " Dense(256, activation=\"relu\"),\n", " Dropout(0.3),\n", " Dense(y_stack.shape[1], activation=\"sigmoid\")\n", "])\n", "\n", "model.compile(optimizer=Adam(1e-3), loss=\"binary_crossentropy\")\n", "\n", "model.fit(X_train, y_train, validation_data=(X_val, y_val),\n", " epochs=50, batch_size=64, verbose=1,\n", " callbacks=[EarlyStopping(patience=5, restore_best_weights=True)])\n", "\n", "# Prever com stacking\n", "y_pred_stack = model.predict(X_stack, batch_size=64)\n", "\n", "# Métricas\n", "THR = np.linspace(0, 1, 101)\n", "def fmax(y_t, y_p):\n", " best, thr = 0, 0\n", " for t in THR:\n", " y_b = (y_p >= t).astype(int)\n", " tp = (y_t * y_b).sum(1); fp = ((1 - y_t) * y_b).sum(1); fn = (y_t * (1 - y_b)).sum(1)\n", " f1 = 2 * tp / (2 * tp + fp + fn + 1e-8); m = f1.mean()\n", " if m > best: best, thr = m, t\n", " return best, thr\n", "\n", "def auprc(y_t, y_p):\n", " p, r, _ = precision_recall_curve(y_t.ravel(), y_p.ravel())\n", " return auc(r, p)\n", "\n", "def smin(y_t, y_p, thr, alpha=0.5):\n", " y_b = (y_p >= thr).astype(int)\n", " ic = -(np.log((y_t + y_b).sum(0) + 1e-8) - np.log((y_t + y_b).sum() + 1e-8))\n", " ru = np.logical_and(y_b, np.logical_not(y_t)) * ic\n", " mi = np.logical_and(y_t, np.logical_not(y_b)) * ic\n", " return np.sqrt((alpha * ru.sum(1))**2 + ((1 - alpha) * mi.sum(1))**2).mean()\n", "\n", "f, thr = fmax(y_stack, y_pred_stack)\n", "print(f\"\\n STACKING (GPU-Keras MLP)\")\n", "print(f\"Fmax = {f:.4f}\")\n", "print(f\"Thr. = {thr:.2f}\")\n", "print(f\"AuPRC = {auprc(y_stack, y_pred_stack):.4f}\")\n", "print(f\"Smin = {smin(y_stack, y_pred_stack, thr):.4f}\")\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "2fac1b06-2695-4c94-855e-24e5bd993e1c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Modelo guardado em models/\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Melvin\\anaconda3\\envs\\protein_env\\lib\\site-packages\\keras\\src\\engine\\training.py:3000: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.\n", " saving_api.save_model(\n" ] } ], "source": [ "model.save(\"models/ensemble_stack.h5\")\n", "model.save(\"models/ensemble_stack.keras\")\n", "print(\"Modelo guardado em models/\")" ] }, { "cell_type": "code", "execution_count": 10, "id": "00695029-3d24-4803-a6e1-8ac5fd70b710", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "🔎 STACKING (MLP) — Avaliação completa\n", "Fmax = 0.6956\n", "Thr. = 0.37\n", "AuPRC = 0.7591\n", "Smin = 12.2272\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAk/lJREFUeJzs3Xd4U3X/xvF3kibde0Ipe++NiAgoCG5cIC5AURy4cPL4U0B9RHHh1scBbhFFRUEQUVAR2SAglE2ZHZS2dLdJfn+ERkoLtHSctL1f13UuktPk5E57aM8n32VyOp1OREREREREKsBsdAAREREREan5VFiIiIiIiEiFqbAQEREREZEKU2EhIiIiIiIVpsJCREREREQqTIWFiIiIiIhUmAoLERERERGpMBUWIiIiIiJSYSosRERERESkwlRYiIjUEDNmzMBkMrFq1SqjowBVk2fUqFE0btz4tI/bvXs3JpOJGTNmlOm4X375JWFhYWRmZlYsYBXq378/7du3P+3jGjduzKhRo6o+kIeaP38+AQEBJCcnGx1FRE6gwkJEqkTRRWdp26OPPmp0PI9QdHFclm337t1Gx62x7HY7EydO5O677yYgIMC9Pz8/n1deeYUuXboQFBRESEgI7dq147bbbmPLli3ux/35559MmjSJtLQ0A9J7lqLzccyYMaV+/bHHHnM/JiUlxb1/1KhRxb73pTnxd4aPjw8tW7Zk3LhxJCYmuh83ZMgQmjdvzpQpUyrnTYlIpfEyOoCI1G5PPvkkTZo0KbavLJ/K1gWRkZF8/PHHxfa9+OKL7Nu3j5dffrnEY+XMfP/998THx3PbbbcV23/VVVfx448/MmLECG699VYKCgrYsmULP/zwA2effTatW7cGXIXF5MmTGTVqFCEhIQa8g+Li4+Mxm437XNDHx4evv/6aN998E5vNVuxrn3/+OT4+PuTm5p7x8Yt+Z+Tm5vLHH3/w1ltvMW/ePDZu3Iifnx8AY8eO5cEHH2Ty5MkEBgZW6P2ISOVRYSEiVerCCy+ke/fuRsfwSP7+/txwww3F9n3xxRccOXKkxP6Kcjqd5Obm4uvrW6nHrQmmT59Onz59iI2Nde9buXIlP/zwA//973/5z3/+U+zxr7/+uke3Tnh7exv6+kOGDGHOnDn8+OOPXH755e79f/75J7t27eKqq67i66+/PuPjH/87Y8yYMYSHh/PSSy/x3XffMWLECMBVFN59993MmjWLm2++uWJvSEQqjbpCiYihTCYT48aNY9asWbRt2xZfX1969+7Nhg0bAHjnnXdo3rw5Pj4+9O/fv0SXoN9//51rrrmGhg0b4u3tTVxcHPfffz85OTnuxyQlJREZGUn//v1xOp3u/du3b8ff35/hw4efNN9XX32FyWRiyZIlJb72zjvvYDKZ2LhxIwCHDh1i9OjRNGjQAG9vb+rVq8fll19e6d2Y8vLyGD9+PJGRkfj7+3PFFVeU6G/euHFjLrnkEhYsWED37t3x9fXlnXfeASAtLY377ruPuLg4vL29ad68Oc899xwOh6PYMb744gu6detGYGAgQUFBdOjQgVdeeeWM8gC8+eabtGvXDm9vb+rXr89dd91Vpgv4tLQ0Ro0aRXBwMCEhIYwcObLMF/65ubnMnz+fgQMHFtu/Y8cOAPr06VPiORaLhfDwcAAmTZrEQw89BECTJk1KdE2bPn065513HlFRUXh7e9O2bVveeuutUrP8+OOP9OvXz/397NGjB5999tkp8//000/4+fkxYsQICgsLgZJjLIq6EC1duvS0PweHw8GkSZOoX78+fn5+DBgwgH/++adc4zZiY2M599xzS2T/9NNP6dChQ6W3SJ533nkA7Nq1y70vKiqKjh078t1331Xqa4lIxajFQkSqVHp6erG+1gARERHF7v/+++/MmTOHu+66C4ApU6ZwySWX8PDDD/Pmm29y5513cuTIEaZOncrNN9/ML7/84n7urFmzyM7O5o477iA8PJwVK1bw2muvsW/fPmbNmgW4LkLeeustrrnmGl577TXuueceHA4Ho0aNIjAwkDfffPOk+S+++GICAgL48ssv6devX7GvzZw5k3bt2rkvpK666io2bdrE3XffTePGjUlKSmLhwoUkJCSUaUByWd19992EhoYyceJEdu/ezbRp0xg3bhwzZ84s9rj4+HhGjBjB2LFjufXWW2nVqhXZ2dn069eP/fv3M3bsWBo2bMiff/7JhAkTOHjwINOmTQNg4cKFjBgxgvPPP5/nnnsOgM2bN7N06VLuvffecueZNGkSkydPZuDAgdxxxx3Ex8fz1ltvsXLlSpYuXYrVai31vTqdTi6//HL++OMPbr/9dtq0acM333zDyJEjy/S9Wr16Nfn5+XTt2rXY/kaNGgGui+E+ffrg5VX6n8Mrr7ySrVu38vnnn/Pyyy+7z92irmlvvfUW7dq147LLLsPLy4vvv/+eO++8E4fD4T6fwXXxf/PNN9OuXTsmTJhASEgIa9euZf78+Vx33XWlvvYPP/zA1VdfzfDhw/nggw+wWCynfK9l+TlMmDCBqVOncumllzJ48GDWr1/P4MGDy9116brrruPee+8lMzOTgIAACgsLmTVrFuPHj69QN6jSFBWBRcVekW7duvHtt99W6muJSAU5RUSqwPTp051AqdvxAKe3t7dz165d7n3vvPOOE3DGxMQ4MzIy3PsnTJjgBIo9Njs7u8RrT5kyxWkymZx79uwptn/EiBFOPz8/59atW53PP/+8E3B+++23p30vI0aMcEZFRTkLCwvd+w4ePOg0m83OJ5980ul0Op1HjhxxAs7nn3/+tMc7lYsvvtjZqFGjUr9W9D0dOHCg0+FwuPfff//9TovF4kxLS3Pva9SokRNwzp8/v9gxnnrqKae/v79z69atxfY/+uijTovF4kxISHA6nU7nvffe6wwKCir2ns80T1JSktNmszkvuOACp91udz/u9ddfdwLODz74wL1v5MiRxd7/t99+6wScU6dOde8rLCx09u3b1wk4p0+fftJ8TqfT+d577zkB54YNG4rtdzgczn79+jkBZ3R0tHPEiBHON954o8Q543Q63efK8eddkdLOv8GDBzubNm3qvp+WluYMDAx09urVy5mTk1MiR5F+/fo527Vr53Q6nc6vv/7aabVanbfeemux75nT6frZjhw50n2/rD+HQ4cOOb28vJxDhw4tdrxJkyY5gWLHPBnAeddddzlTU1OdNpvN+fHHHzudTqdz7ty5TpPJ5Ny9e7dz4sSJTsCZnJzsft7IkSOd/v7+pzx20fv4+eefncnJyc69e/c6v/jiC2d4eLjT19fXuW/fvmKPf+aZZ5yAMzEx8bS5RaR6qCuUiFSpN954g4ULFxbbTnT++ecX+0S/V69egKsF4PiBmUX7d+7c6d53/JiBrKwsUlJSOPvss3E6naxdu7bY67z++usEBwdz9dVX8/jjj3PjjTcW6yN+MsOHDycpKYnFixe793311Vc4HA53NypfX19sNhuLFy/myJEjpz1mRdx2222YTCb3/b59+2K329mzZ0+xxzVp0oTBgwcX2zdr1iz69u1LaGgoKSkp7m3gwIHY7XZ+++03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tVamchcWWVlZxVoqiqSmpuLt7V0poaRiirpBdWoQgsWsRWBEREREilzWqT6tYwI5mlvIO7/tNDpOrVLuwqJv37589NFH7vsmkwmHw8HUqVMZMGBApYaTM7M2QQO3RUREREpjNpt48IJWAExfuoukjFyDE9UeXuV9wtSpUzn//PNZtWoV+fn5PPzww2zatInU1FSWLl1aFRmlnIqmmtXAbREREZGSzm8TRdeGIaxJSOO1X7bz1ND2RkeqFcrdYtG+fXu2bt3KOeecw+WXX05WVhZXXnkla9eupVmzZlWRUcohI7eAbUmZgAZui4iIiJTGZDLx8JDWAHy+IoE9h7MMTlQ7lKvFoqCggCFDhvD222/z2GOPVVUmqYC/96bjdEKDUF8iAzXmRaRS+fjAr7/+e1tERGqss5qGc27LSH7bmszUBfG8cV1XoyPVeOVqsbBarfz9999VlUUqwb/jK9QNSqTSWSzQv79rs1iMTiMiIhU04cLWmEww9++DrN6TanScGq/cXaFuuOEG3n///arIIpVgbdH4CnWDEhERETmlNvWCGN49DoCnftiM0+k0OFHNVu7B24WFhXzwwQf8/PPPdOvWDX9//2Jff+mllyotnJSP0+nUjFAiVamgAP73P9ft224Dq9XYPCIiUmHjL2jJnPUHWLc3je//PshlneobHanGKndhsXHjRrp2dfVB27p1a7GvmUxaM8FICanZHMkuwGYx07Z+kNFxRGqf/HwYN851e9QoFRYiIrVAVKAPd/RrxosLt/Lcj1u4oG00PlZ1dz0T5S4sfi0auCgep2hhvHaxQXh76T+EiIiISFmM6duUz1YksD8th+lLd3NHf810eibKPcbiePv27WPfvn2VlUUqyN0NKk4Dt0VERETKytdm4aHBrkXz3vh1OymZeQYnqpnKXVg4HA6efPJJgoODadSoEY0aNSIkJISnnnoKh8NRFRmljIoGbnfW+AoRERGRchnaOZYOscFk5hUy7eetp3+ClFDuwuKxxx7j9ddf59lnn2Xt2rWsXbuWZ555htdee43HH3+8KjJKGeQW2PnnQAagGaFEREREystsNvF/F7cB4LPlCWxLPGpwopqn3IXFhx9+yHvvvccdd9xBx44d6dixI3feeSfvvvsuM2bMqIKIUhYb96dT6HASEeBNg1Bfo+OIiIiI1Di9moYzuF00Dic8M2+z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7pymTJmiqKgoBQcHq0uXLvwNaYLc7Ys333xTd955p5o3b66YmBhNmzZNly5d8lG18LZt27ZpxIgRio6OlsPh0JdffvmP62RmZqpPnz4KDg5W586dlZaW5vU6azDUS3p6ujmdTvvwww/thx9+sCeffNJat25tp06dqnN+VlaWBQQE2IIFC+zAgQP20ksvWVBQkO3fv9/HlcOb3O2LcePG2ZIlSywnJ8fy8vLs0UcftVatWtnPP//s48rhLe72RLWCggK75ZZbbNCgQfbggw/6plj4hLs98ccff1i/fv1s+PDhtn37disoKLDMzEzLzc31ceXwJnf7YsWKFRYcHGwrVqywgoIC27hxo0VFRdm0adN8XDm8JSMjw1JSUmz16tUmydasWXPV+UeOHLEWLVrY9OnT7cCBA7Z48WILCAiwDRs2+KZgMyNY1FP//v1typQprveVlZUWHR1tr7/+ep3zx4wZYw888ECNsQEDBthTTz3l1TrhW+72RW0VFRUWFhZmH330kbdKhI/VpycqKips4MCBtmzZMpswYQLBoolxtyfeeecd69Spk5WVlfmqRPiBu30xZcoUGzp0aI2x6dOnW3x8vFfrhH9cS7B4/vnnrUePHjXGxo4da8OGDfNiZTVxKVQ9lJWVKTs7WwkJCa6xZs2aKSEhQTt37qxznZ07d9aYL0nDhg274nw0PvXpi9ouXryo8vJy3XTTTd4qEz5U356YPXu22rVrpyeeeMIXZcKH6tMTa9euVVxcnKZMmaLIyEjdddddmjdvniorK31VNrysPn0xcOBAZWdnuy6XOnLkiDIyMjR8+HCf1IyGpyEcawb6bEtNyJkzZ1RZWanIyMga45GRkfrxxx/rXKeoqKjO+UVFRV6rE75Vn76obebMmYqOjr7siwGNU316Yvv27frggw+Um5vrgwrha/XpiSNHjuibb77R+PHjlZGRoUOHDmny5MkqLy9XamqqL8qGl9WnL8aNG6czZ87onnvukZmpoqJCkyZN0osvvuiLktEAXelYs7i4WKWlpWrevLnXa+CMBdBAzJ8/X+np6VqzZo1CQkL8XQ78oKSkRImJiVq6dKkiIiL8XQ4aiKqqKrVr107vv/+++vbtq7FjxyolJUXvvvuuv0uDH2VmZmrevHl6++239d1332n16tVat26d5syZ4+/ScAPjjEU9REREKCAgQKdO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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# %%\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import precision_recall_curve, auc\n", "\n", "# Funções métricas\n", "THR = np.linspace(0.01, 0.99, 99)\n", "\n", "def fmax(y_t, y_p):\n", " best, thr = 0, 0\n", " for t in THR:\n", " y_b = (y_p >= t).astype(int)\n", " tp = (y_t * y_b).sum(1)\n", " fp = ((1 - y_t) * y_b).sum(1)\n", " fn = (y_t * (1 - y_b)).sum(1)\n", " f1 = 2 * tp / (2 * tp + fp + fn + 1e-8)\n", " m = f1.mean()\n", " if m > best:\n", " best, thr = m, t\n", " return best, thr\n", "\n", "def auprc(y_t, y_p):\n", " p, r, _ = precision_recall_curve(y_t.ravel(), y_p.ravel())\n", " return auc(r, p)\n", "\n", "def smin(y_t, y_p, thr, alpha=0.5):\n", " y_b = (y_p >= thr).astype(int)\n", " ic = -(np.log((y_t + y_b).sum(0) + 1e-8) - np.log((y_t + y_b).sum() + 1e-8))\n", " ru = np.logical_and(y_b, np.logical_not(y_t)) * ic\n", " mi = np.logical_and(y_t, np.logical_not(y_b)) * ic\n", " return np.sqrt((alpha * ru.sum(1))**2 + ((1 - alpha) * mi.sum(1))**2).mean()\n", "\n", "# Avaliação\n", "f, thr = fmax(y_stack, y_pred_stack)\n", "print(f\"\\n🔎 STACKING (MLP) — Avaliação completa\")\n", "print(f\"Fmax = {f:.4f}\")\n", "print(f\"Thr. = {thr:.2f}\")\n", "print(f\"AuPRC = {auprc(y_stack, y_pred_stack):.4f}\")\n", "print(f\"Smin = {smin(y_stack, y_pred_stack, thr):.4f}\")\n", "\n", "# Gráfico Fmax vs Threshold\n", "fmax_scores = []\n", "for t in THR:\n", " y_b = (y_pred_stack >= t).astype(int)\n", " tp = (y_stack * y_b).sum(1)\n", " fp = ((1 - y_stack) * y_b).sum(1)\n", " fn = (y_stack * (1 - y_b)).sum(1)\n", " f1 = 2 * tp / (2 * tp + fp + fn + 1e-8)\n", " fmax_scores.append(f1.mean())\n", "\n", "plt.figure(figsize=(8, 5))\n", "plt.plot(THR, fmax_scores, label=\"F1 médio (Fmax)\")\n", "plt.axvline(thr, color=\"red\", linestyle=\"--\", label=f\"Threshold ótimo = {thr:.2f}\")\n", "plt.xlabel(\"Threshold\")\n", "plt.ylabel(\"F1-score médio\")\n", "plt.title(\"Fmax vs Threshold (Stacking MLP)\")\n", "plt.legend()\n", "plt.grid(True)\n", "plt.tight_layout()\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "id": "ee9f9472-0b22-4ceb-ab09-7d925349e237", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.16" } }, "nbformat": 4, "nbformat_minor": 5 }