{ "cells": [ { "cell_type": "code", "execution_count": 11, "id": "ac13a243-5c5f-4896-86f9-6d0a89e3a7e4", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import string\n", "import nltk\n", "import tensorflow.keras as tf\n", "from nltk.corpus import stopwords\n", "from nltk.tokenize import word_tokenize\n", "from gensim.models import Word2Vec\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "from tensorflow.keras.layers import Embedding, Conv1D, MaxPooling1D, Flatten, Dense\n", "from tensorflow.keras.models import Sequential" ] }, { "cell_type": "markdown", "id": "4fcd50b4-0c45-4430-bd9a-3b363fa5ef53", "metadata": {}, "source": [ "## Pobieranie danych i preprocessing " ] }, { "cell_type": "code", "execution_count": 12, "id": "a3bff1c2-bc03-417a-85de-3962c7a64794", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5447\n", "Mindaugas Budzinauskas wierzy w odbudowę formy Kevina Johnsona. Czy ktoś opuści Polpharmę? Mindaugas Budzinauskas w rozmowie z WP SportoweFakty opowiada o transferze Kevina Johnsona, ewentualnych odejściach z Polpharmy i kolejnym meczu PLK z Anwilem. - Potrzebowaliśmy takiego gracza, jak Johnson - podkreśla szkoleniowiec starogardzian. 1\n", "Mundial 2018. Były reprezentant Anglii trenerem Filipin Po niemal trzech latach przerwy Terry Butcher powraca na ławkę trenerską. Były obrońca reprezentacji Anglii został nowym selekcjonerem Filipin. 1\n", "(98132,) \n", "(5452,) \n", "(5447,) \n" ] } ], "source": [ "data = pd.read_csv(r'C:\\Users\\obses\\olympic-games-medals-19862018\\sport-text-classification-ball-ISI-public\\train\\train.tsv', sep='\\t', header=None)\n", "polish_stopwords = pd.read_csv(r'C:\\Users\\obses\\olympic-games-medals-19862018\\sport-text-classification-ball-ISI-public\\train\\polish.stopwords.txt', header=None)\n", "\n", "X_test = pd.read_csv(r'C:\\Users\\obses\\olympic-games-medals-19862018\\sport-text-classification-ball-ISI-public\\dev-0\\in.tsv', sep='\\t', header=None)\n", "Y_test = pd.read_csv(r'C:\\Users\\obses\\olympic-games-medals-19862018\\sport-text-classification-ball-ISI-public\\dev-0\\expected.tsv', sep='\\t', header=None)\n", "X_A_test = pd.read_csv(r'C:\\Users\\obses\\olympic-games-medals-19862018\\sport-text-classification-ball-ISI-public\\test-A\\in.tsv', sep='\\t', header=None)\n", "\n", "X_train = data[data.columns[1]]\n", "Y_train = data[data.columns[0]]\n", "X_A_test = X_A_test[X_A_test.columns[0]]\n", "\n", "print(len(X_A_test))\n", "\n", "X_test = X_test[X_test.columns[0]]\n", "Y_test = Y_test[Y_test.columns[0]]\n", "\n", "print(X_train[0], Y_train[0])\n", "print(X_test[0], Y_test[0])\n", "\n", "def preprocess(text):\n", " text = text.lower()\n", " text = ''.join([word for word in text if word not in string.punctuation])\n", " tokens = word_tokenize(text)\n", " tokens = [word for word in tokens if word not in polish_stopwords]\n", " return ' '.join(tokens)\n", "\n", "X_train = X_train.apply(preprocess)\n", "print(X_train.shape, type(X_train))\n", "\n", "X_test = X_test.apply(preprocess)\n", "print(X_test.shape, type(X_test))\n", "\n", "X_A_test = X_A_test.apply(preprocess)\n", "print(X_A_test.shape, type(X_A_test))" ] }, { "cell_type": "code", "execution_count": 13, "id": "37652a35-e672-470d-9884-27c3b2b9f6c5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fen 9 zapowiedź walki róża gumienna vs katarzyna posiadała wideo podczas fight exclusive night 9 zmierzą się również kobiety w walce pań na zasadach k1 rękawice skrzyżują róża gumienna i katarzyna posiadała\n" ] } ], "source": [ "# Train the Word2Vec model\n", "print(X_train[2])\n", "sentences = [sentence.split() for sentence in X_train]\n", "w2v_model = Word2Vec(sentences, window=5, min_count=5, workers=4)" ] }, { "cell_type": "code", "execution_count": 14, "id": "922f8b39-db22-49d7-801a-d6298b085959", "metadata": {}, "outputs": [], "source": [ "# Tokenize the text data\n", "tokenizer = Tokenizer()\n", "tokenizer.fit_on_texts(X_train)\n", "tokenizer2 = Tokenizer()\n", "tokenizer2.fit_on_texts(X_test)\n", "tokenizer3 = Tokenizer()\n", "tokenizer3.fit_on_texts(X_A_test)" ] }, { "cell_type": "code", "execution_count": 15, "id": "ae8bed11-9fac-42e8-8f34-91d1e85d6c2f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4185, 4360, 1275, 1, 22420, 1084, 3211, 6765, 132, 2718, 1879, 5966, 4185, 4360, 1, 561, 2, 73, 88, 2322, 8, 3405, 3211, 6765, 17260, 44122, 2, 1950, 4, 541, 17, 195, 2, 2645, 12760, 1408, 3430, 31, 3076, 1607, 712, 11581]\n", "[164, 27, 96, 364, 1368, 570, 6057, 9, 1124, 165, 386, 1125, 9744, 9745, 5092, 2, 6058, 14853, 96, 1369, 63, 1368, 58, 134, 4400, 6057]\n" ] } ], "source": [ "X_train = tokenizer.texts_to_sequences(X_train)\n", "X_test = tokenizer2.texts_to_sequences(X_test)\n", "X_A_test = tokenizer3.texts_to_sequences(X_A_test)\n", "print(X_train[0])\n", "print(X_test[0])" ] }, { "cell_type": "code", "execution_count": 16, "id": "b629c46d-abdf-4f93-9c5c-bcf8dfb84868", "metadata": {}, "outputs": [], "source": [ "vocab_size = len(tokenizer.word_index) + 1" ] }, { "cell_type": "code", "execution_count": 17, "id": "31a5843c-6bac-401e-b48d-9af88ab8f7b5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 988 4063 1471 114 5 8198 7541 3 618 12447 4040 119\n", " 1887 397 8988 228 326 13865 52570 4063 1783 7311 13 1\n", " 190 1615 46 19 43 5467 12448 5 2 2167 464 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0]\n", "[ 4 90 1497 694 28 8 180 1 9758 1 105 87 5 1086\n", " 420 297 694 4 21 369 1 3109 304 180 13 23 4407 28\n", " 8 1271 87 5 817 1 9758 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0]\n" ] } ], "source": [ "# Pad the sequences to a fixed length\n", "max_length = 100\n", "X_train = pad_sequences(X_train, maxlen=max_length, padding='post')\n", "X_test = pad_sequences(X_test, maxlen=max_length, padding='post')\n", "X_A_test = pad_sequences(X_A_test, maxlen=max_length, padding='post')\n", "print(X_train[10])\n", "print(X_test[10])" ] }, { "cell_type": "code", "execution_count": 18, "id": "d41d15cc-8d3f-4b8a-a09b-e0bcc4f74b22", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(109453, 100)\n" ] } ], "source": [ "# Create a weight matrix for the embedding layer\n", "embedding_matrix = np.zeros((vocab_size, 100))\n", "for word, i in tokenizer.word_index.items():\n", " if word in w2v_model.wv:\n", " embedding_matrix[i] = w2v_model.wv[word]\n", "print(embedding_matrix.shape)" ] }, { "cell_type": "code", "execution_count": 19, "id": "5d0ca2d1-2826-475c-a0e3-8c716e174aaf", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\obses\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\keras\\src\\layers\\core\\embedding.py:86: UserWarning: Argument `input_length` is deprecated. Just remove it.\n", " warnings.warn(\n" ] } ], "source": [ "from keras.initializers import Constant\n", "from keras.layers import Embedding, Conv1D, GlobalMaxPooling1D, Dense, Dropout\n", "model = Sequential()\n", "\n", "# Define the model\n", "model = Sequential()\n", "\n", "# Embedding layer\n", "model.add(Embedding(\n", " input_dim=vocab_size,\n", " output_dim=100,\n", " embeddings_initializer=Constant(embedding_matrix),\n", " input_length=max_length,\n", " trainable=True # Allow fine-tuning of embeddings\n", "))\n", "\n", "# Add Convolutional layer\n", "model.add(Conv1D(filters=128, kernel_size=5, activation='relu'))\n", "model.add(GlobalMaxPooling1D())\n", "model.add(Dropout(0.5)) #\n", "\n", "model.add(Conv1D(filters=128, kernel_size=5, activation='relu')) #\n", "model.add(GlobalMaxPooling1D()) #\n", "model.add(Dropout(0.5)) #\n", "\n", "# Additional Dense layer with Dropout for regularization\n", "model.add(Dense(units=64, activation='relu'))\n", "model.add(Dropout(0.5))\n", "\n", "# Output layer\n", "model.add(Dense(units=1, activation='sigmoid'))\n", "\n", "# Compile the model\n", "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 23, "id": "96b7acc7-49ab-4855-929d-8dd3fbbbe760", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(98132, 100) (98132,) (5452, 100) (5452,)\n" ] } ], "source": [ "print(X_train.shape,Y_train.shape,X_test.shape,Y_test.shape)" ] }, { "cell_type": "code", "execution_count": 27, "id": "57022ed2-8d2d-4bbe-bdc6-489d99cda59b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "\u001b[1m24533/24533\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1753s\u001b[0m 71ms/step - accuracy: 0.9830 - loss: 0.0604 - val_accuracy: 0.5477 - val_loss: 2.0434\n", "Epoch 2/3\n", "\u001b[1m24533/24533\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1747s\u001b[0m 71ms/step - accuracy: 0.9874 - loss: 0.0461 - val_accuracy: 0.5655 - val_loss: 1.8298\n", "Epoch 3/3\n", "\u001b[1m24533/24533\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1740s\u001b[0m 71ms/step - accuracy: 0.9894 - loss: 0.0409 - val_accuracy: 0.5921 - val_loss: 3.2375\n" ] } ], "source": [ "history = model.fit(X_train, Y_train, epochs=3, batch_size=4, validation_data=(X_test, Y_test) )" ] }, { "cell_type": "code", "execution_count": 33, "id": "e11dd1ad-29ba-4e31-b262-4eb220ebd526", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m171/171\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - accuracy: 0.5817 - loss: 3.4503\n", "Test Accuracy: 59.21%\n", "\u001b[1m171/171\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step\n", "[1 0 1 ... 1 1 1]\n", "[1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 1 0 1]\n", "0.5920763022743947\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAGGCAYAAACqvTJ0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxCklEQVR4nO3deVxU1f/H8fcMwgAquLFp5Ja57wtii1oWLpnaZra4pPWtzDTrW5qZ2SKZmVZafuurUt9ySUvr12ZmorllapaWWe6agjsoyiJzf3+MjAwMOKMwA8Pr+Xjc5J577rmfMxfz8OHcc02GYRgCAAAAAAAAPMjs7QAAAAAAAABQ9pCUAgAAAAAAgMeRlAIAAAAAAIDHkZQCAAAAAACAx5GUAgAAAAAAgMeRlAIAAAAAAIDHkZQCAAAAAACAx5GUAgAAAAAAgMeRlAIAAAAAAIDHkZQCUCKYTCa98MILbp+3Z88emUwmJSQkFHlMAAAAZVFxj8sSExNlMpmUmJh4SfEB8B0kpQDYJSQkyGQyyWQyadWqVfmOG4ah6OhomUwm3XLLLV6IEAAAoGxgXAagLCApBSCfwMBAzZkzJ1/5ihUrdODAAVksFi9EBQAAUPYwLgPgy0hKAcine/fuWrBggc6dO+dQPmfOHLVu3VqRkZFeiqzsSEtL83YIAACgBGBcBsCXkZQCkE+/fv107NgxLV261F6WmZmphQsX6p577nF6Tlpamp588klFR0fLYrGofv36ev3112UYhkO9jIwMPfHEEwoLC1PFihV166236sCBA07b/Oeff/TAAw8oIiJCFotFjRs31qxZsy6pT8ePH9dTTz2lpk2bqkKFCgoJCVG3bt3066+/5qubnp6uF154QVdffbUCAwMVFRWl2267TTt37rTXsVqtevPNN9W0aVMFBgYqLCxMXbt21YYNGyQVvqZC3nUaXnjhBZlMJv3xxx+65557VLlyZV177bWSpN9++00DBw5UnTp1FBgYqMjISD3wwAM6duyY089r8ODBql69uiwWi2rXrq1HHnlEmZmZ2rVrl0wmk6ZMmZLvvDVr1shkMmnu3LnufqwAAKCY+eK4rCALFixQ69atFRQUpGrVqum+++7TP//841AnKSlJgwYN0hVXXCGLxaKoqCj16tVLe/bssdfZsGGD4uLiVK1aNQUFBal27dp64IEHijRWAEWjnLcDAFDy1KpVS7GxsZo7d666desmSfrmm2+UkpKiu+++W2+99ZZDfcMwdOutt2r58uUaPHiwWrRooSVLlujf//63/vnnH4dEyJAhQ/TRRx/pnnvuUYcOHfTDDz+oR48e+WJITk5W+/btZTKZ9NhjjyksLEzffPONBg8erNTUVI0YMcKtPu3atUuLFy/WnXfeqdq1ays5OVn/+c9/1LFjR/3xxx+qXr26JCk7O1u33HKLli1bprvvvlvDhw/XqVOntHTpUm3dulV169aVJA0ePFgJCQnq1q2bhgwZonPnzunHH3/UunXr1KZNG7diy3HnnXeqXr16mjBhgn3QuHTpUu3atUuDBg1SZGSkfv/9d7333nv6/ffftW7dOplMJknSwYMH1a5dO508eVIPPfSQGjRooH/++UcLFy7UmTNnVKdOHV1zzTX6+OOP9cQTTzhc9+OPP1bFihXVq1evS4obAAAUH18clzmTkJCgQYMGqW3btoqPj1dycrLefPNNrV69Wr/88osqVaokSbr99tv1+++/a9iwYapVq5YOHz6spUuXat++ffb9m2++WWFhYRo1apQqVaqkPXv26LPPPrvsGAEUAwMAzps9e7Yhyfj555+NadOmGRUrVjTOnDljGIZh3HnnnUbnzp0NwzCMmjVrGj169LCft3jxYkOS8fLLLzu0d8cddxgmk8nYsWOHYRiGsXnzZkOS8eijjzrUu+eeewxJxrhx4+xlgwcPNqKiooyjR4861L377ruN0NBQe1y7d+82JBmzZ88utG/p6elGdna2Q9nu3bsNi8VivPjii/ayWbNmGZKMN954I18bVqvVMAzD+OGHHwxJxuOPP15gncLiytvXcePGGZKMfv365aub08/c5s6da0gyVq5caS/r37+/YTabjZ9//rnAmP7zn/8Ykoxt27bZj2VmZhrVqlUzBgwYkO88AADgPb48Llu+fLkhyVi+fLlhGLbxSHh4uNGkSRPj7Nmz9npffvmlIcl4/vnnDcMwjBMnThiSjEmTJhXY9qJFi+yfG4CSj8f3ADh111136ezZs/ryyy916tQpffnllwVOEf/666/l5+enxx9/3KH8ySeflGEY+uabb+z1JOWrl/e3a4Zh6NNPP1XPnj1lGIaOHj1q3+Li4pSSkqJNmza51R+LxSKz2fa/vOzsbB07dkwVKlRQ/fr1Hdr69NNPVa1aNQ0bNixfGzmzkj799FOZTCaNGzeuwDqX4uGHH85XFhQUZP86PT1dR48eVfv27SXJHrfVatXixYvVs2dPp7O0cmK66667FBgYqI8//th+bMmSJTp69Kjuu+++S44bAAAUL18bl+W1YcMGHT58WI8++qgCAwPt5T169FCDBg301VdfSbKNiwICApSYmKgTJ044bStnRtWXX36prKysy4oLQPEjKQXAqbCwMHXp0kVz5szRZ599puzsbN1xxx1O6+7du1fVq1dXxYoVHcobNmxoP57zp9lstj8Cl6N+/foO+0eOHNHJkyf13nvvKSwszGEbNGiQJOnw4cNu9cdqtWrKlCmqV6+eLBaLqlWrprCwMP32229KSUmx19u5c6fq16+vcuUKfrp5586dql69uqpUqeJWDBdTu3btfGXHjx/X8OHDFRERoaCgIIWFhdnr5cR95MgRpaamqkmTJoW2X6lSJfXs2dPhDT4ff/yxatSooRtuuKEIewIAAIqSr43LnMXs7NqS1KBBA/txi8WiiRMn6ptvvlFERISuv/56vfbaa0pKSrLX79ixo26//XaNHz9e1apVU69evTR79mxlZGRcVowAigdrSgEo0D333KMHH3xQSUlJ6tatm/03T8XNarVKku677z4NGDDAaZ1mzZq51eaECRM0duxYPfDAA3rppZdUpUoVmc1mjRgxwn69olTQjKns7OwCz8k9KyrHXXfdpTVr1ujf//63WrRooQoVKshqtapr166XFHf//v21YMECrVmzRk2bNtUXX3yhRx991D6LDAAAlEy+NC67HCNGjFDPnj21ePFiLVmyRGPHjlV8fLx++OEHtWzZUiaTSQsXLtS6dev0f//3f1qyZIkeeOABTZ48WevWrVOFChU8FiuAiyMpBaBAffr00b/+9S+tW7dO8+fPL7BezZo19f333+vUqVMOv5X7888/7cdz/rRarfbZSDm2b9/u0F7OG2Cys7PVpUuXIunLwoUL1blzZ82cOdOh/OTJk6pWrZp9v27duvrpp5+UlZUlf39/p23VrVtXS5Ys0fHjxwucLVW5cmV7+7nl/KbPFSdOnNCyZcs0fvx4Pf/88/byv//+26FeWFiYQkJCtHXr1ou22bVrV4WFhenjjz9WTEyMzpw5o/vvv9/lmAAAgHf40rjMWcw51847e3v79u324znq1q2rJ598Uk8++aT+/vtvtWjRQpMnT9ZHH31kr9O+fXu1b99er7zyiubMmaN7771X8+bN05AhQ4qlDwAuDb8aB1CgChUq6N1339ULL7ygnj17Flive/fuys7O1rRp0xzKp0yZIpPJZH9TTM6fed8SM3XqVId9Pz8/3X777fr000+dJlqOHDnidl/8/PzyvQZ5wYIF+V4zfPvtt+vo0aP5+iLJfv7tt98uwzA0fvz4AuuEhISoWrVqWrlypcPxd955x62Yc7eZI+/nZTab1bt3b/3f//2fNmzYUGBMklSuXDn169dPn3zyiRISEtS0aVOP/nYTAABcGl8al+XVpk0bhYeHa8aMGQ6P2X3zzTfatm2b/Y2AZ86cUXp6usO5devWVcWKFe3nnThxIt/YqUWLFpLEI3xACcRMKQCFKmiadm49e/ZU586dNWbMGO3Zs0fNmzfXd999p88//1wjRoywr1XQokUL9evXT++8845SUlLUoUMHLVu2TDt27MjX5quvvqrly5crJiZGDz74oBo1aqTjx49r06ZN+v7773X8+HG3+nHLLbfoxRdf1KBBg9ShQwdt2bJFH3/8serUqeNQr3///vrwww81cuRIrV+/Xtddd53S0tL0/fff69FHH1WvXr3UuXNn3X///Xrrrbf0999/2x+l+/HHH9W5c2c99thjkmyvWX711Vc1ZMgQtWnTRitXrtRff/3lcswhISH2tRKysrJUo0YNfffdd9q9e3e+uhMmTNB3332njh076qGHHlLDhg116NAhLViwQKtWrXKY4t+/f3+99dZbWr58uSZOnOjW5wgAALzHV8Zlefn7+2vixIkaNGiQOnbsqH79+ik5OVlvvvmmatWqpSeeeEKS9Ndff+nGG2/UXXfdpUaNGqlcuXJatGiRkpOTdffdd0uSPvjgA73zzjvq06eP6tatq1OnTun9999XSEiIunfvfllxAigGXnnnH4ASKferhwuT99XDhmEYp06dMp544gmjevXqhr+/v1GvXj1j0qRJhtVqdah39uxZ4/HHHzeqVq1qlC9f3ujZs6exf//+fK8eNgzDSE5ONoYOHWpER0cb/v7+RmRkpHHjjTca7733nr2Oq68eTk9PN5588kkjKirKCAoKMq655hpj7dq1RseOHY2OHTs61D1z5owxZswYo3bt2vbr3nHHHcbOnTvtdc6dO2dMmjTJaNCg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gwMAAPAlzZs317Rp0/TWW285lE+bNk3NmjVzuZ2VK1dq0qRJ2rhxow4dOqRFixapd+/eBdZPTExU586d85UfOnRIkZGRLl8XAACgKLmdlBo4cGAxhAEAAOD7XnvtNfXo0UPff/+9YmNjJUlr167V/v379fXXX7vcTlpampo3b64HHnhAt912m8vnbd++XSEhIfb98PBw14MHAAAoYm6/4mX27NlasGBBvvIFCxbogw8+KJKgAAAAfFHHjh31119/qU+fPjp58qROnjyp2267Tb///rv+97//udxOt27d9PLLL6tPnz5uXT88PFyRkZH2jbf9AQAAb3J7JBIfH69q1arlKw8PD9eECROKJCgAAABfVb16db3yyiv69NNP9emnn+rll1/WiRMnNHPmzGK/dosWLRQVFaWbbrpJq1evLvbrAQAAFMbtx/f27dun2rVr5yuvWbOm9u3bVyRBAQAAoOhERUVpxowZatOmjTIyMvTf//5XnTp10k8//aRWrVo5PScjI0MZGRn2/dTUVE+FCwAAygi3k1Lh4eH67bffVKtWLYfyX3/9VVWrVi2quAAAAFBE6tevr/r169v3O3TooJ07d2rKlCkFPjYYHx+v8ePHeypEAABQBrn9+F6/fv30+OOPa/ny5crOzlZ2drZ++OEHDR8+XHfffXdxxAgAAIAi1q5dO+3YsaPA46NHj1ZKSop9279/vwejAwAAZYHbM6Veeukl7dmzRzfeeKPKlbOdbrVa1b9/f9aUAgAAcOJib8g7efKkZwLJZfPmzYqKiirwuMVikcVi8WBEAACgrHE7KRUQEKD58+fr5Zdf1ubNmxUUFKSmTZuqZs2axREfAABAqRcaGnrR4/3793e5vdOnTzvMctq9e7c2b96sKlWq6Morr9To0aP1zz//6MMPP5QkTZ06VbVr11bjxo2Vnp6u//73v/rhhx/03XffXVqHAAAAioDbSakc9erVU7169YoyFgAAAJ80e/bsIm1vw4YN6ty5s31/5MiRkqQBAwYoISFBhw4dcngBTWZmpp588kn9888/Cg4OVrNmzfT99987tAEAAOBpJsMwDHdOuP3229WuXTs988wzDuWvvfaafv75Zy1YsKBIAyxqqampCg0NVUpKikJCQrwdDgAAKOEYO9jwOQAAAFe5Om5we6HzlStXqnv37vnKu3XrppUrV7rbHAAA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn import metrics\n", "loss, accuracy = model.evaluate(X_test, Y_test)\n", "print(f'Test Accuracy: {accuracy*100:.2f}%')\n", "predictions = model.predict(X_test)\n", "\n", "binary_predictions = (predictions > 0.5).astype(int)\n", "\n", "binary_predictions = binary_predictions.flatten()\n", "\n", "print(binary_predictions)\n", "\n", "print(binary_predictions[:20])\n", "results = metrics.accuracy_score(Y_test, binary_predictions)\n", "print(results)\n", "\n", "# Plot training history\n", "import matplotlib.pyplot as plt\n", "\n", "# Plot training & validation accuracy values\n", "plt.figure(figsize=(12, 4))\n", "plt.subplot(1, 2, 1)\n", "plt.plot(history.history['accuracy'])\n", "plt.plot(history.history['val_accuracy'])\n", "plt.title('Model accuracy')\n", "plt.ylabel('Accuracy')\n", "plt.xlabel('Epoch')\n", "plt.legend(['Train', 'Validation'], loc='upper left')\n", "\n", "# Plot training & validation loss values\n", "plt.subplot(1, 2, 2)\n", "plt.plot(history.history['loss'])\n", "plt.plot(history.history['val_loss'])\n", "plt.title('Model loss')\n", "plt.ylabel('Loss')\n", "plt.xlabel('Epoch')\n", "plt.legend(['Train', 'Validation'], loc='upper left')\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 34, "id": "b126f1f0-1077-4e86-a71c-e351addad912", "metadata": {}, "outputs": [], "source": [ "filename = \"out.tsv\"\n", "\n", "# Open the file in write mode\n", "with open(filename, 'w') as file:\n", " # Loop through each element in the array\n", " for value in binary_predictions:\n", " # Write each element on a new line\n", " file.write(f\"{value}\\n\")" ] }, { "cell_type": "code", "execution_count": 35, "id": "676f55b8-c1bc-44f9-8486-b1fd84c83992", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TSV file 'out.tsv' created successfully.\n" ] } ], "source": [ "print(f\"TSV file '{filename}' created successfully.\")" ] }, { "cell_type": "code", "execution_count": 36, "id": "a57c39a7-baeb-4060-8cc0-78f79a71167b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m171/171\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step\n", "5447\n", "[1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1] 5447\n" ] } ], "source": [ "predictions2 = model.predict(X_A_test)\n", "print(len(X_A_test))\n", "binary_predictions2 = (predictions2 > 0.5).astype(int)\n", "\n", "binary_predictions2 = binary_predictions2.flatten()\n", "\n", "print(binary_predictions2[:20], len(binary_predictions2))\n" ] }, { "cell_type": "code", "execution_count": 37, "id": "2b05df7c-8d0f-4d3e-9411-b690c69c0baf", "metadata": {}, "outputs": [], "source": [ "filename = \"outA.tsv\"\n", "\n", "# Open the file in write mode\n", "with open(filename, 'w') as file:\n", " # Loop through each element in the array\n", " for value in binary_predictions2:\n", " # Write each element on a new line\n", " file.write(f\"{value}\\n\")" ] } ], "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.0" } }, "nbformat": 4, "nbformat_minor": 5 }