diff --git a/Streamlit/base_app.py b/Streamlit/base_app.py index c27e4b4c..d1dfd1d9 100644 --- a/Streamlit/base_app.py +++ b/Streamlit/base_app.py @@ -29,11 +29,17 @@ import pandas as pd # Vectorizer -#news_vectorizer = open("streamlit/tfidfvect.pkl","rb") -#test_cv = joblib.load(news_vectorizer) # loading your vectorizer from the pkl file +news_vectorizer = open("vectorizer.pkl","rb") +test_cv = joblib.load(news_vectorizer) # loading your vectorizer from the pkl file # Load your raw data -#raw = pd.read_csv("streamlit/train.csv") +raw = pd.read_csv("https://raw.githubusercontent.com/Jana-Liebenberg/2401PTDS_Classification_Project/main/Data/processed/train.csv", encoding="utf-8") + +# Load your machine learning models +# Example: Replace 'model1.pkl' and 'model2.pkl' with your actual model file paths +models = { + "Model 1": joblib.load("best_model.pkl") +} # The main function where we will build the actual app def main(): @@ -53,7 +59,7 @@ def main(): if selection == "Information": st.info("General Information") # You can read a markdown file from supporting resources folder - st.markdown("Some information here") + st.markdown("This app uses machine learning models to classify news articles into predefined categories.") # Building out the predication page @@ -62,18 +68,22 @@ def main(): # Creating a text box for user input news_text = st.text_area("Enter Text","Type Here") - if st.button("Classify"): + if st.button("Classify"): + if news_text: # Transforming user input with vectorizer vect_text = test_cv.transform([news_text]).toarray() - # Load your .pkl file with the model of your choice + make predictions - # Try loading in multiple models to give the user a choice - predictor = joblib.load(open(os.path.join("streamlit/Logistic_regression.pkl"),"rb")) - prediction = predictor.predict(vect_text) - - # When model has successfully run, will print prediction - # You can use a dictionary or similar structure to make this output - # more human interpretable. - st.success("Text Categorized as: {}".format(prediction)) + + # Get predictions from each model + predictions = {model_name: model.predict(vect_text)[0] for model_name, model in models.items()} + + # Display predictions + st.subheader("Model Predictions:") + for model_name, category in predictions.items(): + st.write(f"**{model_name}:** {category}") + # Show success message with categorized text + st.success("Text Categorized as: {}".format(", ".join(predictions.values()))) + else: + st.warning("Please enter an article for classification.") # Required to let Streamlit instantiate our web app. if __name__ == '__main__': diff --git a/Streamlit/best_model.pkl b/Streamlit/best_model.pkl new file mode 100644 index 00000000..764dfa43 Binary files /dev/null and b/Streamlit/best_model.pkl differ diff --git a/Streamlit/kelly.ipynb b/Streamlit/kelly.ipynb new file mode 100644 index 00000000..b564b509 --- /dev/null +++ b/Streamlit/kelly.ipynb @@ -0,0 +1,1257 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "40d42af3-0d36-4fed-ade8-5c189469bd8b", + "metadata": {}, + "source": [ + "

Classification Project: Newspaper Articles

" + ] + }, + { + "cell_type": "markdown", + "id": "a4d699a7-050f-498c-a58f-8b8917905cf1", + "metadata": {}, + "source": [ + "

PROJECT OVERVIEW

" + ] + }, + { + "cell_type": "markdown", + "id": "0c22ed09-70b7-47bd-b81d-483344afa3bb", + "metadata": {}, + "source": [ + ">The key goal of this classification project is for our team to develop machine learning models that can automatically classify newspaper articles. This project is an end-to-end project covering all stages, from loading and preprocessing data to training models, evaluating them, and deploying the solution as a web app using Streamlit." + ] + }, + { + "cell_type": "markdown", + "id": "a830a160-194a-47a3-b888-e76eda1ee776", + "metadata": {}, + "source": [ + "

IMPORTING PACKAGES

" + ] + }, + { + "cell_type": "markdown", + "id": "72bc717e-0601-441a-adcd-a96530c25810", + "metadata": {}, + "source": [ + "> This project will utilise the packages below to efficiently load, clean, analyse and visualise the newspaper article data. The packages are imported and necessary libraries are downloaded below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e73e73b6-d9d1-45a8-9aed-f1908111f145", + "metadata": {}, + "outputs": [], + "source": [ + "# Importing Pandas for data manipulation and analysis\n", + "import pandas as pd\n", + "\n", + "# Importing NumPy for numerical operations\n", + "import numpy as np\n", + "\n", + "# Importing Matplotlib for data visualization\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Importing Seaborn for advanced data visualization\n", + "import seaborn as sns\n", + "\n", + "# Importing IPython.display for displaying rich media in Jupyter Notebooks\n", + "from IPython.display import display, Image\n", + "\n", + "# Importing nltk for tokenization, lemmatization, and text preprocessing\n", + "import nltk \n", + "\n", + "# Importing re for regular expressions to clean and manipulate text\n", + "import re\n", + "\n", + "# Importing string for handling common string operations, such as removing punctuation\n", + "import string\n", + "\n", + "# Importing nltk.corpus to improve text processing\n", + "from nltk.corpus import stopwords\n", + "\n", + "# Importing nltk.tokenize to split text into words or sentences for NLP tasks\n", + "from nltk.tokenize import word_tokenize, TreebankWordTokenizer\n", + "\n", + "# Importing nltk.stem to converts words to their root forms, improving text understanding\n", + "from nltk.stem import WordNetLemmatizer\n", + "\n", + "# Convert text to numerical vectors\n", + "from sklearn.feature_extraction.text import TfidfVectorizer \n", + "\n", + "# Splitting data\n", + "from sklearn.model_selection import train_test_split \n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "344af896-aabd-4703-b9f7-7bcf0793d4b5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to\n", + "[nltk_data] C:\\Users\\kelly\\AppData\\Roaming\\nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n", + "[nltk_data] Downloading package punkt_tab to\n", + "[nltk_data] C:\\Users\\kelly\\AppData\\Roaming\\nltk_data...\n", + "[nltk_data] Package punkt_tab is already up-to-date!\n", + "[nltk_data] Downloading package stopwords to\n", + "[nltk_data] C:\\Users\\kelly\\AppData\\Roaming\\nltk_data...\n", + "[nltk_data] Package stopwords is already up-to-date!\n", + "[nltk_data] Downloading package wordnet to\n", + "[nltk_data] C:\\Users\\kelly\\AppData\\Roaming\\nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nltk.download(['punkt','punkt_tab','stopwords','wordnet'])" + ] + }, + { + "cell_type": "markdown", + "id": "fd9ce86b-af85-49da-847b-af99ed6f0591", + "metadata": {}, + "source": [ + "

DATA LOADING

" + ] + }, + { + "cell_type": "markdown", + "id": "c086f70a-7ec8-4d82-a919-9e8b5dd101e1", + "metadata": {}, + "source": [ + "> When the required packages are imported, for loading a CSV file, this Project will utilise Pandas to load the data." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "23b26a61-f885-4289-9b76-719e36939eb3", + "metadata": {}, + "outputs": [], + "source": [ + "# Load training and testing datasets\n", + "train_df = pd.read_csv(\"https://raw.githubusercontent.com/Jana-Liebenberg/2401PTDS_Classification_Project/main/Data/processed/train.csv\", encoding=\"utf-8\")\n", + "test_df = pd.read_csv(\"https://raw.githubusercontent.com/Jana-Liebenberg/2401PTDS_Classification_Project/main/Data/processed/test.csv\", encoding=\"utf-8\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dd1b96ba-8e6f-4b36-829d-682ca5591500", + "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", + "
headlinesdescriptioncontenturlcategory
0RBI revises definition of politically-exposed ...The central bank has also asked chairpersons a...The Reserve Bank of India (RBI) has changed th...https://indianexpress.com/article/business/ban...business
1NDTV Q2 net profit falls 57.4% to Rs 5.55 cror...NDTV's consolidated revenue from operations wa...Broadcaster New Delhi Television Ltd on Monday...https://indianexpress.com/article/business/com...business
\n", + "
" + ], + "text/plain": [ + " headlines \\\n", + "0 RBI revises definition of politically-exposed ... \n", + "1 NDTV Q2 net profit falls 57.4% to Rs 5.55 cror... \n", + "\n", + " description \\\n", + "0 The central bank has also asked chairpersons a... \n", + "1 NDTV's consolidated revenue from operations wa... \n", + "\n", + " content \\\n", + "0 The Reserve Bank of India (RBI) has changed th... \n", + "1 Broadcaster New Delhi Television Ltd on Monday... \n", + "\n", + " url category \n", + "0 https://indianexpress.com/article/business/ban... business \n", + "1 https://indianexpress.com/article/business/com... business " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "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", + "
headlinesdescriptioncontenturlcategory
0NLC India wins contract for power supply to Ra...State-owned firm NLC India Ltd (NLCIL) on Mond...State-owned firm NLC India Ltd (NLCIL) on Mond...https://indianexpress.com/article/business/com...business
1SBI Clerk prelims exams dates announced; admit...SBI Clerk Prelims Exam: The SBI Clerk prelims ...SBI Clerk Prelims Exam: The State Bank of Indi...https://indianexpress.com/article/education/sb...education
\n", + "
" + ], + "text/plain": [ + " headlines \\\n", + "0 NLC India wins contract for power supply to Ra... \n", + "1 SBI Clerk prelims exams dates announced; admit... \n", + "\n", + " description \\\n", + "0 State-owned firm NLC India Ltd (NLCIL) on Mond... \n", + "1 SBI Clerk Prelims Exam: The SBI Clerk prelims ... \n", + "\n", + " content \\\n", + "0 State-owned firm NLC India Ltd (NLCIL) on Mond... \n", + "1 SBI Clerk Prelims Exam: The State Bank of Indi... \n", + "\n", + " url category \n", + "0 https://indianexpress.com/article/business/com... business \n", + "1 https://indianexpress.com/article/education/sb... education " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Display first few rows of the Dataframes as tables\n", + "display(train_df.head(2))\n", + "display(test_df.head(2))\n" + ] + }, + { + "cell_type": "markdown", + "id": "39df45e6-3e02-4ffe-9ad8-c52f018c2b99", + "metadata": {}, + "source": [ + "

DATA CLEANING AND TEXT PREPROCESSING

\n" + ] + }, + { + "cell_type": "markdown", + "id": "599b9afc-199a-45c6-8f7d-45ebb2c44a74", + "metadata": {}, + "source": [ + "> Text cleaning is essential for improving model accuracy. We'll look into standardizing text by converting everything to lowercase, removing punctuation and special characters, splitting text into individual words for further processing and removing common words that don't add much meaning." + ] + }, + { + "cell_type": "markdown", + "id": "773bd76a-4efd-42e8-8481-716a2165ed82", + "metadata": {}, + "source": [ + "Let's start by printing a list of all categories that are present in this dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5c2cdca8-7aee-4155-bb44-2a785573ab2e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['business', 'sports', 'entertainment', 'education', 'technology']\n" + ] + } + ], + "source": [ + "# Print list of unique newspaper categories\n", + "category_labels = list(train_df.category.unique())\n", + "print(category_labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f0597312-d23f-499c-8e28-93b58cee11a4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAIbCAYAAAAKOIF4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABa8ElEQVR4nO3de1hNaf8/8PfWudRW0YmUlEPkMBhkHiIKOQxmMDxhHIZBhJweD2IMw4w0cjZGYTAeI2OMyXnMOKvEoDGYEGpySGeVun9/+LZ+tsqx9tpa79d17etq3+tea3/W3tF73+tea6mEEAJEREREClZJ7gKIiIiI5MZARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEBCA8PBwqlUp6GBsbw87ODu3bt8eCBQuQkpJSbJ3g4GCoVKpXep3s7GwEBwfj119/faX1SnotZ2dndOvW7ZW28yKbN29GaGhoictUKhWCg4PL9PXK2sGDB9G8eXOYmZlBpVJh586dz+3/zz//YNq0afDw8EDlypVhbGwMNzc3jB8/HleuXHnl17906RKCg4Nx/fr119uBt4yXlxcaNmxYJtsq+jcYHR1dJtt7eptK+TzozejLXQCRLlm/fj3q1auH/Px8pKSk4OjRo1i4cCG++uorfP/99+jYsaPUd/jw4ejcufMrbT87Oxtz5swB8OSPyct6ndd6HZs3b8aFCxcQGBhYbNmJEydQo0aNcq/hdQkh0LdvX9SpUwe7du2CmZkZ6tatW2r/06dPo1u3bhBCYOzYsWjdujUMDQ1x+fJlbNq0Ce+++y5SU1NfqYZLly5hzpw58PLygrOz8xvuERFpEwMR0VMaNmyI5s2bS8/79OmDCRMm4L333kPv3r1x5coV2NraAgBq1KhR7gEhOzsbpqamWnmtF2nVqpWsr/8id+7cwYMHD9CrVy94e3s/t296ejp69uwJY2NjHD9+XOO99fLywsiRI7F9+/byLllWOTk5MDExkbsMIp3BQ2ZEL1CzZk0sXrwYGRkZWL16tdRe0mGsQ4cOwcvLC9bW1jAxMUHNmjXRp08fZGdn4/r166hWrRoAYM6cOdLhuSFDhmhsLzY2Fh988AEsLS1Ru3btUl+rSGRkJBo1agRjY2O4uLhg6dKlGstLO2zw66+/QqVSSYfvvLy88PPPP+PGjRsahw+LlHTI7MKFC+jZsycsLS1hbGyMJk2aICIiosTX2bJlC2bMmAEHBwdYWFigY8eOuHz5culv/FOOHj0Kb29vmJubw9TUFJ6envj555+l5cHBwVKomTp1KlQq1XNHaNauXYvk5GQsWrSo1KD5wQcfSD9HR0ejf//+cHZ2homJCZydnfHRRx/hxo0bUp/w8HB8+OGHAID27dtL7194eLjU58CBA/D29oaFhQVMTU3Rpk0bHDx4sNhr//jjj2jUqBGMjIzg4uKCr7/+usTfgUePHmH69OmoVasWDA0NUb16dYwZMwYPHz7U6Fd0eHXHjh1o2rQpjI2NMWfOHHh7e6NevXp49h7fQgi4urrCz8+v1PfwZb3Me/e01NRUfPzxx7CysoKZmRm6d++Ov//+u1i/l30vn3X27Fl069YNNjY2MDIygoODA/z8/HDr1q033ld6uzEQEb2Erl27Qk9PD7/99lupfa5fvw4/Pz8YGhri22+/RVRUFL744guYmZkhLy8P9vb2iIqKAgAMGzYMJ06cwIkTJzBz5kyN7fTu3Ruurq743//+h1WrVj23rri4OAQGBmLChAmIjIyEp6cnxo8fj6+++uqV93HFihVo06YN7OzspNpOnDhRav/Lly/D09MTFy9exNKlS7Fjxw64u7tjyJAhWLRoUbH+//nPf3Djxg188803WLNmDa5cuYLu3bujoKDguXUdOXIEHTp0QFpaGtatW4ctW7bA3Nwc3bt3x/fffw/gySHFHTt2AAACAgJw4sQJREZGlrrNffv2QU9PD927d3+ZtwbXr19H3bp1ERoair1792LhwoVISkpCixYtcO/ePQCAn58f5s+fDwBYvny59P4VhYpNmzbBx8cHFhYWiIiIwLZt22BlZQVfX1+NP+RRUVHo3bs3rK2t8f3332PRokXYsmVLsaAphMD777+Pr776Cv7+/vj5558xceJEREREoEOHDsjNzdXoHxsbi8mTJ2PcuHGIiopCnz59MH78eFy+fLlYkPjll19w7do1jBkz5qXenzd97542bNgwVKpUSZrPdvr0aXh5eWmEvJd9L5+VlZWFTp064Z9//sHy5cuxf/9+hIaGombNmsjIyHjjfaW3nCAisX79egFAnDlzptQ+tra2on79+tLz2bNni6f/CW3fvl0AEHFxcaVu4+7duwKAmD17drFlRdubNWtWqcue5uTkJFQqVbHX69Spk7CwsBBZWVka+5aQkKDR7/DhwwKAOHz4sNTm5+cnnJycSqz92br79+8vjIyMxM2bNzX6denSRZiamoqHDx9qvE7Xrl01+m3btk0AECdOnCjx9Yq0atVK2NjYiIyMDKnt8ePHomHDhqJGjRqisLBQCCFEQkKCACC+/PLL525PCCHq1asn7OzsXtivNI8fPxaZmZnCzMxMfP3111L7//73v2LvqRBCZGVlCSsrK9G9e3eN9oKCAtG4cWPx7rvvSm0tWrQQjo6OIjc3V2rLyMgQ1tbWGr8DUVFRAoBYtGiRxja///57AUCsWbNGanNychJ6enri8uXLxV7fxcVF9OzZU6O9S5cuonbt2tJ7W5p27dqJBg0aPLfPs0p774p+T3v16qXR/9ixYwKAmDdvnhDi1d7LZ3/3o6OjBQCxc+fOV6qZlIEjREQvSTxzWOFZTZo0gaGhIT755BNERESUOMz/Mvr06fPSfRs0aIDGjRtrtA0YMADp6emIjY19rdd/WYcOHYK3tzccHR012ocMGYLs7Oxio0s9evTQeN6oUSMAKPXQCfDkG/2pU6fwwQcfoHLlylK7np4e/P39cevWrZc+7PYmMjMzMXXqVLi6ukJfXx/6+vqoXLkysrKyEB8f/8L1jx8/jgcPHmDw4MF4/Pix9CgsLETnzp1x5swZZGVlISsrC9HR0Xj//fdhaGgorV+5cuVio1mHDh0CAOmQa5EPP/wQZmZmxUZKGjVqhDp16mi0VapUCWPHjsXu3btx8+ZNAMC1a9cQFRWF0aNHv/JZlCV51fdu4MCBGs89PT3h5OSEw4cPA3j597Ikrq6usLS0xNSpU7Fq1SpcunTpjfePKg4GIqKXkJWVhfv378PBwaHUPrVr18aBAwdgY2ODMWPGoHbt2qhduza+/vrrV3ote3v7l+5rZ2dXatv9+/df6XVf1f3790usteg9evb1ra2tNZ4bGRkBeDK5tzSpqakQQrzS67yMmjVr4u7du6X+4XzWgAEDsGzZMgwfPhx79+7F6dOncebMGVSrVu259Rf5559/ADyZl2RgYKDxWLhwIYQQePDggbS/RRP3n/Zs2/3796Gvry/NSyuiUqlgZ2dX7H0p7fdq6NChMDExkQ7PLl++HCYmJhg6dOgL9+tlvOp7V9rvdNH+vOx7WRK1Wo0jR46gSZMm+M9//oMGDRrAwcEBs2fPRn5+fpnsL729eJYZ0Uv4+eefUVBQ8MJT5f/1r3/hX//6FwoKChAdHY2wsDAEBgbC1tYW/fv3f6nXepVv5cnJyaW2FQUQY2NjACg2p6Sk+RuvwtraGklJScXa79y5AwCoWrXqG20fACwtLVGpUqUyfx1fX1/s27cPP/300ws/l7S0NOzevRuzZ8/GtGnTpPbc3NxS//A+q6jGsLCwUs/Ws7W1RX5+PlQqlfRH/2nPftbW1tZ4/Pgx7t69qxGKhBBITk5GixYtNPqX9nulVqsxePBgfPPNNwgKCsL69esxYMAAVKlS5aX27Xle570r7Xfa1dUVwMu/l6Xx8PDA1q1bIYTA+fPnER4ejrlz58LExESjRlIejhARvcDNmzcRFBQEtVqNkSNHvtQ6enp6aNmyJZYvXw4A0uGrlxkVeRUXL17EuXPnNNo2b94Mc3NzvPPOOwAgnW11/vx5jX67du0qtj0jI6OXrs3b2xuHDh2SgkmRDRs2wNTUtExO0zczM0PLli2xY8cOjboKCwuxadMm1KhRo9hhoJcxbNgw2NnZYcqUKbh9+3aJfYomaatUKgghpM+uyDfffFNsQnhpn2+bNm1QpUoVXLp0Cc2bNy/xYWhoCDMzMzRv3hw7d+5EXl6etH5mZiZ2796tsc2iSwts2rRJo/2HH35AVlbWCy898LRx48bh3r17+OCDD/Dw4UOMHTv2pdd9nld574p89913Gs+PHz+OGzduSF9GXva9fJnaGjdujCVLlqBKlSrlfoiZdB9HiIiecuHCBWlOQkpKCn7//XesX78eenp6iIyMLHZ44mmrVq3CoUOH4Ofnh5o1a+LRo0f49ttvAUC6oKO5uTmcnJzw448/wtvbG1ZWVqhateprX8TPwcEBPXr0QHBwMOzt7bFp0ybs378fCxcuhKmpKQCgRYsWqFu3LoKCgvD48WNYWloiMjISR48eLbY9Dw8P7NixAytXrkSzZs1QqVIljesyPW327NnYvXs32rdvj1mzZsHKygrfffcdfv75ZyxatAhqtfq19ulZCxYsQKdOndC+fXsEBQXB0NAQK1aswIULF7Bly5bXmueiVqvx448/olu3bmjatKnGhRmvXLmCTZs24dy5c+jduzcsLCzQtm1bfPnll9JndeTIEaxbt67YKErRVZvXrFkDc3NzGBsbo1atWrC2tkZYWBgGDx6MBw8e4IMPPoCNjQ3u3r2Lc+fO4e7du1i5ciUAYO7cufDz84Ovry/Gjx+PgoICfPnll6hcubLGqEqnTp3g6+uLqVOnIj09HW3atMH58+cxe/ZsNG3aFP7+/i/9ftSpUwedO3fGL7/8gvfee6/YvLTnSU9PL/GaTdWqVUO7du1e+r0rEh0djeHDh+PDDz9EYmIiZsyYgerVq2P06NEAnsynetn38lm7d+/GihUr8P7778PFxQVCCOzYsQMPHz5Ep06dXnqfqYKSazY3kS4pOhul6GFoaChsbGxEu3btxPz580VKSkqxdZ498+vEiROiV69ewsnJSRgZGQlra2vRrl07sWvXLo31Dhw4IJo2bSqMjIwEADF48GCN7d29e/eFryXEkzOH/Pz8xPbt20WDBg2EoaGhcHZ2FiEhIcXW/+uvv4SPj4+wsLAQ1apVEwEBAeLnn38udkbUgwcPxAcffCCqVKkiVCqVxmuihLPj/vjjD9G9e3ehVquFoaGhaNy4sVi/fr1Gn6KzzP73v/9ptBedFfZs/5L8/vvvokOHDsLMzEyYmJiIVq1aiZ9++qnE7b3MWWZFkpOTxdSpU0WDBg2EqampMDIyEq6urmLkyJHijz/+kPrdunVL9OnTR1haWgpzc3PRuXNnceHCBeHk5CR9fkVCQ0NFrVq1hJ6eXrH9O3LkiPDz8xNWVlbCwMBAVK9eXfj5+RV7byIjI4WHh4cwNDQUNWvWFF988YUYN26csLS01OiXk5Mjpk6dKpycnISBgYGwt7cXn376qUhNTdXoV/S78jzh4eECgNi6detLv3/t2rXT+Hfz9KNdu3av9N4V/Rvct2+f8Pf3F1WqVBEmJiaia9eu4sqVK8Ve+2Xey2fPMvvzzz/FRx99JGrXri1MTEyEWq0W7777rggPD3/pfaaKSyXEC06dISIiWeXn56NJkyaoXr069u3bVy6v0adPH5w8eRLXr1+HgYFBubwGkS7jITMiIh0zbNgwdOrUCfb29khOTsaqVasQHx//ymcsvkhubi5iY2Nx+vRpREZGIiQkhGGIFIuBiIhIx2RkZCAoKAh3796FgYEB3nnnHezZs0fj5sJlISkpCZ6enrCwsMDIkSMREBBQptsnepvwkBkREREpHk+7JyIiIsVjICIiIiLFYyAiIiIixeOk6pdUWFiIO3fuwNzcvExueEhERETlTwiBjIwMODg4oFKl0seBGIhe0p07d4rd1ZuIiIjeDomJiahRo0apyxmIXpK5uTmAJ2+ohYWFzNUQERHRy0hPT4ejo6P0d7w0DEQvqegwmYWFBQMRERHRW+ZF0104qZqIiIgUj4GIiIiIFI+BiIiIiBSPgYiIiIgUj4GIiIiIFI+BiIiIiBSPgYiIiIgUj4GIiIiIFI+BiIiIiBSPgYiIiIgUj4GIiIiIFI+BiIiIiBSPgYiIiIgUj4GIiIiIFI+BiIiIiBRPX+4CSNOjiYvkLuGNGYdMkbsEIiKiV8IRIiIiIlI8BiIiIiJSPAYiIiIiUjwGIiIiIlI8BiIiIiJSPAYiIiIiUjwGIiIiIlI8BiIiIiJSPAYiIiIiUjwGIiIiIlI8BiIiIiJSPAYiIiIiUjwGIiIiIlI8BiIiIiJSPAYiIiIiUjwGIiIiIlI8BiIiIiJSPAYiIiIiUjwGIiIiIlI8BiIiIiJSPAYiIiIiUjwGIiIiIlI8WQPRb7/9hu7du8PBwQEqlQo7d+4ste/IkSOhUqkQGhqq0Z6bm4uAgABUrVoVZmZm6NGjB27duqXRJzU1Ff7+/lCr1VCr1fD398fDhw/LfoeIiIjorSRrIMrKykLjxo2xbNmy5/bbuXMnTp06BQcHh2LLAgMDERkZia1bt+Lo0aPIzMxEt27dUFBQIPUZMGAA4uLiEBUVhaioKMTFxcHf37/M94eIiIjeTvpyvniXLl3QpUuX5/a5ffs2xo4di71798LPz09jWVpaGtatW4eNGzeiY8eOAIBNmzbB0dERBw4cgK+vL+Lj4xEVFYWTJ0+iZcuWAIC1a9eidevWuHz5MurWrVs+O0dERERvDZ2eQ1RYWAh/f39MnjwZDRo0KLY8JiYG+fn58PHxkdocHBzQsGFDHD9+HABw4sQJqNVqKQwBQKtWraBWq6U+REREpGyyjhC9yMKFC6Gvr49x48aVuDw5ORmGhoawtLTUaLe1tUVycrLUx8bGpti6NjY2Up+S5ObmIjc3V3qenp7+OrtAREREbwGdHSGKiYnB119/jfDwcKhUqldaVwihsU5J6z/b51kLFiyQJmGr1Wo4Ojq+Ug1ERET09tDZQPT7778jJSUFNWvWhL6+PvT19XHjxg1MmjQJzs7OAAA7Ozvk5eUhNTVVY92UlBTY2tpKff75559i2797967UpyTTp09HWlqa9EhMTCy7nSMiIiKdorOByN/fH+fPn0dcXJz0cHBwwOTJk7F3714AQLNmzWBgYID9+/dL6yUlJeHChQvw9PQEALRu3RppaWk4ffq01OfUqVNIS0uT+pTEyMgIFhYWGg8iIiKqmGSdQ5SZmYmrV69KzxMSEhAXFwcrKyvUrFkT1tbWGv0NDAxgZ2cnnRmmVqsxbNgwTJo0CdbW1rCyskJQUBA8PDyks87q16+Pzp07Y8SIEVi9ejUA4JNPPkG3bt14hhkREREBkDkQRUdHo3379tLziRMnAgAGDx6M8PDwl9rGkiVLoK+vj759+yInJwfe3t4IDw+Hnp6e1Oe7777DuHHjpLPRevTo8cJrHxEREZFyqIQQQu4i3gbp6elQq9VIS0sr18NnjyYuKrdta4txyBS5SyAiIgLw8n+/dXYOEREREZG2MBARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeLpy10Aka6K/PYduUt4Y72GxspdAhHRW4EjRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeLIGot9++w3du3eHg4MDVCoVdu7cKS3Lz8/H1KlT4eHhATMzMzg4OGDQoEG4c+eOxjZyc3MREBCAqlWrwszMDD169MCtW7c0+qSmpsLf3x9qtRpqtRr+/v54+PChFvaQiIiI3gayBqKsrCw0btwYy5YtK7YsOzsbsbGxmDlzJmJjY7Fjxw789ddf6NGjh0a/wMBAREZGYuvWrTh69CgyMzPRrVs3FBQUSH0GDBiAuLg4REVFISoqCnFxcfD39y/3/SMiIqK3g76cL96lSxd06dKlxGVqtRr79+/XaAsLC8O7776LmzdvombNmkhLS8O6deuwceNGdOzYEQCwadMmODo64sCBA/D19UV8fDyioqJw8uRJtGzZEgCwdu1atG7dGpcvX0bdunXLdyeJiIhI571Vc4jS0tKgUqlQpUoVAEBMTAzy8/Ph4+Mj9XFwcEDDhg1x/PhxAMCJEyegVqulMAQArVq1glqtlvqUJDc3F+np6RoPIiIiqpjemkD06NEjTJs2DQMGDICFhQUAIDk5GYaGhrC0tNToa2tri+TkZKmPjY1Nse3Z2NhIfUqyYMECac6RWq2Go6NjGe4NERER6ZK3IhDl5+ejf//+KCwsxIoVK17YXwgBlUolPX/659L6PGv69OlIS0uTHomJia9XPBEREek8nQ9E+fn56Nu3LxISErB//35pdAgA7OzskJeXh9TUVI11UlJSYGtrK/X5559/im337t27Up+SGBkZwcLCQuNBREREFZNOB6KiMHTlyhUcOHAA1tbWGsubNWsGAwMDjcnXSUlJuHDhAjw9PQEArVu3RlpaGk6fPi31OXXqFNLS0qQ+REREpGyynmWWmZmJq1evSs8TEhIQFxcHKysrODg44IMPPkBsbCx2796NgoICac6PlZUVDA0NoVarMWzYMEyaNAnW1tawsrJCUFAQPDw8pLPO6tevj86dO2PEiBFYvXo1AOCTTz5Bt27deIYZERERAZA5EEVHR6N9+/bS84kTJwIABg8ejODgYOzatQsA0KRJE431Dh8+DC8vLwDAkiVLoK+vj759+yInJwfe3t4IDw+Hnp6e1P+7777DuHHjpLPRevToUeK1j4iIiEiZZA1EXl5eEEKUuvx5y4oYGxsjLCwMYWFhpfaxsrLCpk2bXqtGIiIiqvh0eg4RERERkTYwEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiyXovMyKil9H8xxlyl1Amont+LncJRFQKjhARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeIxEBEREZHiMRARERGR4jEQERERkeLJGoh+++03dO/eHQ4ODlCpVNi5c6fGciEEgoOD4eDgABMTE3h5eeHixYsafXJzcxEQEICq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O3YEAGzatAmOjo44cOAAfH19tb5fREREpFt0eoToWWlpaQAAKysrAEBCQgKSk5Ph4+Mj9TEyMkK7du1w/PhxAEBMTAzy8/M1+jg4OKBhw4ZSn5Lk5uYiPT1d40FEREQV01sTiIQQmDhxIt577z00bNgQAJCcnAwAsLW11ehra2srLUtOToahoSEsLS1L7VOSBQsWQK1WSw9HR8ey3B0iIiLSIW9NIBo7dizOnz+PLVu2FFumUqk0ngshirU960V9pk+fjrS0NOmRmJj4eoUTERGRznsrAlFAQAB27dqFw4cPo0aNGlK7nZ0dABQb6UlJSZFGjezs7JCXl4fU1NRS+5TEyMgIFhYWGg8iIiKqmHQ6EAkhMHbsWOzYsQOHDh1CrVq1NJbXqlULdnZ22L9/v9SWl5eHI0eOwNPTEwDQrFkzGBgYaPRJSkrChQsXpD5ERESkbDp9ltmYMWOwefNm/PjjjzA3N5dGgtRqNUxMTKBSqRAYGIj58+fDzc0Nbm5umD9/PkxNTTFgwACp77BhwzBp0iRYW1vDysoKQUFB8PDwkM46IyIiImXT6UC0cuVKAICXl5dG+/r16zFkyBAAwJQpU5CTk4PRo0cjNTUVLVu2xL59+2Bubi71X7JkCfT19dG3b1/k5OTA29sb4eHh0NPT09auEBERkQ7T6UAkhHhhH5VKheDgYAQHB5fax9jYGGFhYQgLCyvD6oiIiKii0Ok5RERERETawEBEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREiqeoQLRixQrUqlULxsbGaNasGX7//Xe5SyIiIiIdoJhA9P333yMwMBAzZszA2bNn8a9//QtdunTBzZs35S6NiIiIZKaYQBQSEoJhw4Zh+PDhqF+/PkJDQ+Ho6IiVK1fKXRoRERHJTBGBKC8vDzEx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ndjYWAghUKdOHVSuXFl6HDlyRDpkdfnyZbz77rsa6z37PD4+Hm3atNFoa9OmDeLj4zXamjdvrvHc3t4efn5++PbbbwEAu3fvxqNHj/Dhhx8+d1+JSDsYiIhIZ7i5uUGlUhULF0+7ceMGunbtioYNG+KHH35ATEwMli9fDuDJ5OXSFBYWQk9PDzExMYiLi5Me8fHx+PrrrwE8CWTPhjFRwt2NSurzbJuZmVmx9YYPH46tW7ciJycH69evR79+/WBqalpqzUSkPQxERKQzrKys4Ovri+XLl5c42vPw4UNER0fj8ePHWLx4MVq1aoU6dergzp07Gv0MDQ1RUFCg0da0aVMUFBQgJSUFrq6uGg87OzsAQL169XD69GmN9aKjozWe169fH0ePHtVoO378OOrXr//C/evatSvMzMywcuVK/PLLLxg6dOgL1yEi7WAgIiKdsmLFChQUFODdd9/FDz/8gCtXriA+Ph5Lly5F69atUbt2bTx+/BhhYWH4+++/sXHjRqxatUpjG87OzsjMzMTBgwdx7949ZGdno06dOhg4cCAGDRqEHTt2ICEhAWfOnMHChQuxZ88eAEBAQAD27NmDkJAQXLlyBatXr8Yvv/yiMfozefJkhIeHY9WqVbhy5QpCQkKwY8cOBAUFvXDf9PT0MGTIEEyfPh2urq5o3bp12b55RPT6ZJ3BRERUgjt37ogxY8YIJycnYWhoKKpXry569OghDh8+LIQQIiQkRNjb2wsTExPh6+srNmzYIACI1NRUaRujRo0S1tbWAoCYPXu2EOLJROZZs2YJZ2dnYWBgIOzs7ESvXr3E+fPnpfXWrFkjqlevLkxMTMT7778v5s2bJ+zs7DTqW7FihXBxcREGBgaiTp06YsOGDRrLAYjIyMgS9+3atWsCgFi0aNEbv09EVHZUQpRwgJyIiAAAI0aMwJ9//onff/+9TLZ37NgxeHl54datW7C1tS2TbRLRm+OVqomInvLVV1+hU6dOMDMzwy+//IKIiAisWLHijbebm5uLxMREzJw5E3379mUYItIxnENERPSU06dPo1OnTvDw8MCqVauwdOlSDB8+/I23u2XLFtStWxdpaWlYtGhRGVRKRGWJh8yIiIhI8ThCRERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREivf/ADIzVlT7n5JIAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Define a color palette\n", + "colors = sns.color_palette('husl', len(train_df['category'].value_counts()))\n", + "\n", + "# Visualize the distribution of the categories with colored bars\n", + "train_df['category'].value_counts().plot(kind='bar', color=colors)\n", + "plt.xlabel('Category')\n", + "plt.ylabel('Count')\n", + "plt.title('Distribution of Category Labels')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d8a9b578-b9ff-41e6-a8cb-176a3815b0be", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2000, 5)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Shape of the dataset\n", + "train_df.shape\n", + "test_df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8d8b7a2e-1512-472b-886e-40e36e2d71d5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Missing values in dataset:\n", + " headlines 0\n", + "description 0\n", + "content 0\n", + "url 0\n", + "category 0\n", + "dtype: int64\n", + "Missing values in dataset:\n", + " headlines 0\n", + "description 0\n", + "content 0\n", + "url 0\n", + "category 0\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "# Check for missing values\n", + "print(\"Missing values in dataset:\\n\", train_df.isnull().sum())\n", + "print(\"Missing values in dataset:\\n\", test_df.isnull().sum())" + ] + }, + { + "cell_type": "markdown", + "id": "4a4df036-ea5e-4e65-b911-7db0ca3837f9", + "metadata": {}, + "source": [ + "There was no need to handle missing values as there were none" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a568052e-f838-4074-bab2-076aa2577af0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No duplicates found in the dataset.\n" + ] + } + ], + "source": [ + "# Check and remove duplicates\n", + "train_df.drop_duplicates(inplace=True) \n", + "test_df.drop_duplicates(inplace=True)\n", + "\n", + "if train_df.duplicated().any():\n", + " print(\"Duplicates are present in the dataset.\")\n", + "else:\n", + " print(\"No duplicates found in the dataset.\")\n", + "\n", + "if test_df.duplicated().any():\n", + " print(\"Duplicates are present in the dataset.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f4712212-47e3-4d3e-974c-121060f5a69c", + "metadata": {}, + "outputs": [], + "source": [ + "# Define a function to preprocess text data\n", + "def format_data (text):\n", + " \"\"\"\n", + " Function to clean text:\n", + " - Convert to lowercase\n", + " - Replace URLs with a placeholder\n", + " - Remove HTML tags\n", + " - Remove punctuation and numbers\n", + " - Tokenize and remove stopwords\n", + " - Lemmatize words\n", + " \"\"\"\n", + " if isinstance(text, str): \n", + " text = text.lower() # Convert to lowercase\n", + " \n", + " # Replace URLs with placeholder\n", + " text = re.sub(r'http\\S+|www\\S+|https\\S+', 'url-web', text, flags=re.MULTILINE)\n", + " \n", + " # Remove HTML tags\n", + " text = re.sub(r'<.*?>', '', text)\n", + " \n", + " # Remove punctuation and numbers\n", + " text = text.translate(str.maketrans('', '', string.punctuation + '0123456789'))\n", + " \n", + " # Tokenize the text\n", + " tokens = word_tokenize(text)\n", + " \n", + " # Remove stopwords\n", + " tokens = [word for word in tokens if word not in stopwords.words('english')]\n", + " \n", + " # Lemmatize words\n", + " lemmatizer = WordNetLemmatizer()\n", + " tokens = [lemmatizer.lemmatize(word) for word in tokens]\n", + " \n", + " return ' '.join(tokens)\n", + " \n", + " return \"\" # Handle missing or invalid data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3238d931-6132-424c-9c66-3d81c2df0298", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " headlines \\\n", + "0 rbi revise definition politicallyexposed perso... \n", + "1 ndtv q net profit fall r crore impacted lower ... \n", + "2 akasa air ‘ well capitalised ’ grow much faste... \n", + "3 india ’ current account deficit decline sharpl... \n", + "4 state borrowing cost soar highest far fiscal \n", + "\n", + " description \\\n", + "0 central bank also asked chairperson chief exec... \n", + "1 ndtvs consolidated revenue operation r crore r... \n", + "2 initial share sale open public subscription ju... \n", + "3 current account deficit cad per cent gdp usd b... \n", + "4 price shot reflecting overall higher risk aver... \n", + "\n", + " content \n", + "0 reserve bank india rbi changed definition poli... \n", + "1 broadcaster new delhi television ltd monday re... \n", + "2 homegrown server maker netweb technology india... \n", + "3 india ’ current account deficit declined sharp... \n", + "4 state forced pay nose weekly auction debt tues... \n" + ] + } + ], + "source": [ + "# Apply the function to each column in the training dataset\n", + "train_df[\"headlines\"] = train_df[\"headlines\"].apply(format_data)\n", + "train_df[\"description\"] = train_df[\"description\"].apply(format_data)\n", + "train_df[\"content\"] = train_df[\"content\"].apply(format_data)\n", + "\n", + "# Preview the preprocessed data\n", + "print(train_df[[\"headlines\", \"description\", \"content\"]].head())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "d4cfdc97", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " headlines \\\n", + "0 nlc india win contract power supply rajasthan ... \n", + "1 sbi clerk prelim exam date announced admit car... \n", + "2 golden globe michelle yeoh ferrell angela bass... \n", + "3 oneplus nord r part new price cut ’ \n", + "4 adani family ’ partner used ‘ opaque ’ fund in... \n", + "\n", + " description \\\n", + "0 stateowned firm nlc india ltd nlcil monday sai... \n", + "1 sbi clerk prelim exam sbi clerk prelim exam te... \n", + "2 barbie top nominee year followed closely oppen... \n", + "3 new deal make oneplus nord easy purchase r k \n", + "4 citing review file multiple tax haven internal... \n", + "\n", + " content \n", + "0 stateowned firm nlc india ltd nlcil monday sai... \n", + "1 sbi clerk prelim exam state bank indian sbi an... \n", + "2 michelle yeoh ferrell angela bassett amanda se... \n", + "3 review oneplus nord g praised balanced combina... \n", + "4 million dollar invested publicly traded stock ... \n" + ] + } + ], + "source": [ + "# Apply the function to each column in the test dataset\n", + "test_df[\"headlines\"] = test_df[\"headlines\"].apply(format_data)\n", + "test_df[\"description\"] = test_df[\"description\"].apply(format_data)\n", + "test_df[\"content\"] = test_df[\"content\"].apply(format_data)\n", + "\n", + "# Preview the preprocessed test data\n", + "print(test_df[[\"headlines\", \"description\", \"content\"]].head())\n", + "# Combine the text columns into a single column for vectorization" + ] + }, + { + "cell_type": "markdown", + "id": "506c1550", + "metadata": {}, + "source": [ + "

FEATURE ENGENEERING

" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "2ac4773c-a6be-49c8-836c-f772e7d5bef0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y_train shape: (5520,)\n" + ] + } + ], + "source": [ + "import joblib\n", + "from sklearn.feature_extraction.text import CountVectorizer\n", + "\n", + "# Format target variables\n", + "y_train = train_df['category']\n", + "y_test = test_df['category']\n", + "\n", + "print('y_train shape:', y_train.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c00d2ee9-f2b2-4a1a-b747-893a8964776c", + "metadata": {}, + "outputs": [], + "source": [ + "# Defining a function to vectorize data\n", + "def vectorize_data(column):\n", + " # Initialize CountVectorizer with stop_words handling and minimum document frequency\n", + " vect = CountVectorizer(stop_words='english', min_df=0.01) \n", + " X_train = vect.fit_transform(train_df[column]).toarray() # Transform and convert to NumPy array\n", + " X_test = vect.transform(test_df[column]).toarray()\n", + " joblib.dump(vect, 'vectorizer.pkl')\n", + "\n", + " return X_train, X_test" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "56d2b2ff-7f88-48e7-8ab8-f1a3f9785a9c", + "metadata": {}, + "outputs": [], + "source": [ + "# Apply vectorization to each column\n", + "X_headlines_train, X_headlines_test = vectorize_data('headlines')\n", + "X_description_train, X_description_test = vectorize_data('description') \n", + "X_content_train, X_content_test = vectorize_data('content')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "79357e07", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X_headlines_train: (5520, 108)\n", + "X_headlines_test: (2000, 108)\n", + "X_description_train: (5520, 192)\n", + "X_description_test: (2000, 192)\n", + "X_content_train: (5520, 1506)\n", + "X_content_test: (2000, 1506)\n" + ] + } + ], + "source": [ + "# Print results\n", + "print('X_headlines_train:', X_headlines_train.shape)\n", + "print('X_headlines_test:', X_headlines_test.shape)\n", + "print('X_description_train:', X_description_train.shape)\n", + "print('X_description_test:', X_description_test.shape)\n", + "print('X_content_train:', X_content_train.shape)\n", + "print('X_content_test:', X_content_test.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "5da58dcc", + "metadata": {}, + "source": [ + "

TRAINING MODELS

" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c846de84", + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install mlflow when MLflow is not installed\n", + "# Set the tracking URI for MLflow\n", + "import mlflow\n", + "import mlflow.sklearn" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "56f64c18", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mlflow.set_experiment(\"News Category Classification\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ac32d330", + "metadata": {}, + "outputs": [], + "source": [ + "# Import necessary libraries for model training\n", + "from sklearn.naive_bayes import MultinomialNB\n", + "from sklearn.metrics import classification_report, accuracy_score, confusion_matrix\n", + "from sklearn.pipeline import make_pipeline\n", + "from sklearn.linear_model import LogisticRegression \n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.svm import SVC" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "64ffb887", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X_train shape: (5520, 1806)\n", + "X_test shape: (2000, 1806)\n", + "X_train_split shape: (4416, 1806)\n", + "X_val_split shape: (1104, 1806)\n", + "y_train_split shape: (4416,)\n", + "y_val_split shape: (1104,)\n" + ] + } + ], + "source": [ + "# Prepare the data for model training\n", + "#combine all three vectorized columns into a single feature set\n", + "X_train = np.concatenate((X_headlines_train, X_description_train, X_content_train), axis=1)\n", + "X_test = np.concatenate((X_headlines_test, X_description_test, X_content_test), axis=1)\n", + "\n", + "# Print the shape of the training and testing data\n", + "print('X_train shape:', X_train.shape)\n", + "print('X_test shape:', X_test.shape)\n", + "\n", + "# Split the training data into training and validation sets\n", + "X_train_split, X_val_split, y_train_split, y_val_split = train_test_split(X_train, y_train, test_size=0.2, random_state=42)\n", + "\n", + "# Print the shape of the training and validation sets \n", + "print('X_train_split shape:', X_train_split.shape)\n", + "print('X_val_split shape:', X_val_split.shape)\n", + "print('y_train_split shape:', y_train_split.shape)\n", + "print('y_val_split shape:', y_val_split.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "1cb490b2", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the models\n", + "models = {\n", + " 'Logistic Regression': LogisticRegression(max_iter=1000),\n", + " 'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42),\n", + " 'Support Vector Classifier': SVC(kernel='linear', random_state=42),\n", + " 'Naive Bayes': MultinomialNB()\n", + "}\n", + "# Initialize a dictionary to store the results\n", + "results = {}\n" + ] + }, + { + "cell_type": "markdown", + "id": "ef32b136", + "metadata": {}, + "source": [ + "

TRAINING AND EVALUATING MODELS INSIDE MLFLOW

" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "e2073997", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: Logistic Regression\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " business 0.94 0.96 0.95 245\n", + " education 0.99 0.99 0.99 274\n", + "entertainment 1.00 0.99 1.00 178\n", + " sports 0.99 0.99 0.99 137\n", + " technology 0.97 0.96 0.96 270\n", + "\n", + " accuracy 0.97 1104\n", + " macro avg 0.98 0.98 0.98 1104\n", + " weighted avg 0.97 0.97 0.97 1104\n", + "\n", + "Confusion Matrix:\n", + " [[236 2 0 0 7]\n", + " [ 3 270 0 0 1]\n", + " [ 0 0 177 0 1]\n", + " [ 2 0 0 135 0]\n", + " [ 10 1 0 1 258]]\n", + "Accuracy: 0.9746376811594203\n", + "--------------------------------------------------\n", + "Model: Random Forest\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " business 0.96 0.96 0.96 245\n", + " education 0.99 0.99 0.99 274\n", + "entertainment 0.99 0.95 0.97 178\n", + " sports 0.96 0.96 0.96 137\n", + " technology 0.93 0.95 0.94 270\n", + "\n", + " accuracy 0.96 1104\n", + " macro avg 0.97 0.96 0.96 1104\n", + " weighted avg 0.96 0.96 0.96 1104\n", + "\n", + "Confusion Matrix:\n", + " [[235 1 0 0 9]\n", + " [ 0 272 0 1 1]\n", + " [ 0 1 169 1 7]\n", + " [ 2 0 0 132 3]\n", + " [ 7 2 2 3 256]]\n", + "Accuracy: 0.9637681159420289\n", + "--------------------------------------------------\n", + "Model: Support Vector Classifier\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " business 0.95 0.97 0.96 245\n", + " education 0.99 0.99 0.99 274\n", + "entertainment 1.00 0.98 0.99 178\n", + " sports 0.98 0.99 0.98 137\n", + " technology 0.96 0.96 0.96 270\n", + "\n", + " accuracy 0.97 1104\n", + " macro avg 0.98 0.98 0.98 1104\n", + " weighted avg 0.97 0.97 0.97 1104\n", + "\n", + "Confusion Matrix:\n", + " [[237 1 0 0 7]\n", + " [ 1 270 0 0 3]\n", + " [ 0 0 175 2 1]\n", + " [ 2 0 0 135 0]\n", + " [ 9 1 0 1 259]]\n", + "Accuracy: 0.9746376811594203\n", + "--------------------------------------------------\n", + "Model: Naive Bayes\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " business 0.96 0.94 0.95 245\n", + " education 1.00 0.99 0.99 274\n", + "entertainment 0.98 0.99 0.98 178\n", + " sports 0.97 0.97 0.97 137\n", + " technology 0.94 0.96 0.95 270\n", + "\n", + " accuracy 0.97 1104\n", + " macro avg 0.97 0.97 0.97 1104\n", + " weighted avg 0.97 0.97 0.97 1104\n", + "\n", + "Confusion Matrix:\n", + " [[230 0 1 0 14]\n", + " [ 2 271 1 0 0]\n", + " [ 0 0 176 1 1]\n", + " [ 1 0 2 133 1]\n", + " [ 6 1 0 3 260]]\n", + "Accuracy: 0.9692028985507246\n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "# End any active MLflow run\n", + "mlflow.end_run() \n", + "\n", + "# Train and evaluate each model inside MLflow tracking\n", + "results = {}\n", + "\n", + "for model_name, model in models.items():\n", + " with mlflow.start_run(run_name=model_name, nested=True): # Only use nested runs\n", + " # Train the model\n", + " model.fit(X_train_split, y_train_split)\n", + " \n", + " # Make predictions on the validation set\n", + " y_val_pred = model.predict(X_val_split)\n", + " \n", + " # Calculate accuracy and store results\n", + " accuracy = accuracy_score(y_val_split, y_val_pred)\n", + " results[model_name] = accuracy\n", + " \n", + " # Log the model and metrics to MLflow\n", + " mlflow.log_param(\"model_name\", model_name)\n", + " mlflow.log_metric(\"accuracy\", accuracy)\n", + " \n", + " # Print classification report and confusion matrix\n", + " print(f\"Model: {model_name}\")\n", + " print(\"Classification Report:\\n\", classification_report(y_val_split, y_val_pred))\n", + " print(\"Confusion Matrix:\\n\", confusion_matrix(y_val_split, y_val_pred))\n", + " print(\"Accuracy:\", accuracy)\n", + " print(\"-\" * 50)" + ] + }, + { + "cell_type": "markdown", + "id": "0c79be29", + "metadata": {}, + "source": [ + "

SELECTING THE BEST MODEL

" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "32cacfb8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best Model: Logistic Regression\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025/05/05 11:18:12 WARNING mlflow.models.model: Model logged without a signature and input example. Please set `input_example` parameter when logging the model to auto infer the model signature.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best model performance on test set:\n", + "Accuracy: 0.975\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " business 0.97 0.96 0.97 400\n", + " education 0.99 0.99 0.99 400\n", + "entertainment 0.99 0.98 0.99 400\n", + " sports 0.98 0.98 0.98 400\n", + " technology 0.94 0.96 0.95 400\n", + "\n", + " accuracy 0.97 2000\n", + " macro avg 0.98 0.97 0.98 2000\n", + " weighted avg 0.98 0.97 0.98 2000\n", + "\n" + ] + } + ], + "source": [ + "#selecting the best model\n", + "best_model = max(results, key=results.get)\n", + "print(f\"Best Model: {best_model}\")\n", + "\n", + "# Train the best model on the entire training set\n", + "best_model_instance = models[best_model]\n", + "best_model_instance.fit(X_train, y_train) \n", + "\n", + "# Save the best model to MLflow\n", + "with mlflow.start_run():\n", + " mlflow.sklearn.log_model(best_model_instance, \"Best_model\")\n", + "\n", + "# Make predictions on the test set\n", + "y_test_pred = best_model_instance.predict(X_test)\n", + "\n", + "# Evaluate the model on the test set\n", + "accuracy_test = accuracy_score(y_test, y_test_pred)\n", + "mlflow.log_metric(\"test_accuracy\", accuracy_test)\n", + "report_test = classification_report(y_test, y_test_pred) \n", + "\n", + "# Print the test set results\n", + "print(\"Best model performance on test set:\")\n", + "print(f\"Accuracy: {accuracy_test}\")\n", + "print(\"Classification Report:\\n\", report_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b23a6331", + "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", + "
category
0business
1education
2entertainment
3technology
4business
\n", + "
" + ], + "text/plain": [ + " category\n", + "0 business\n", + "1 education\n", + "2 entertainment\n", + "3 technology\n", + "4 business" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Save the model using joblib\n", + "joblib.dump(best_model_instance, 'best_model.pkl')\n", + "\n", + "# Save the predictions to a CSV file\n", + "predictions_df = pd.DataFrame({'category': y_test_pred})\n", + "predictions_df.to_csv('predictions.csv', index=False)\n", + "\n", + "# Display the first few rows of the predictions DataFrame\n", + "display(predictions_df.head()) " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "0674fb87", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxUAAAK7CAYAAACEfKIgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACRO0lEQVR4nOzdZ3SU5fb38d+kTRJSIIGQBELoTaqgFAsdRKWICohHQYoiAtJEgaOAhQBHARVFBRGxgX8Vj1gQpIqA0jtISaiJoSUhJKTezwse5mQEJEMgV0K+n7XutZjrbntmmCR79lVslmVZAgAAAIBr5GY6AAAAAACFG0kFAAAAgDwhqQAAAACQJyQVAAAAAPKEpAIAAABAnpBUAAAAAMgTkgoAAAAAeUJSAQAAACBPSCoAAAAA5AlJBYACa9u2bXriiSdUoUIFeXt7y8/PT7feeqsmT56s06dP39B7b968Wc2aNVNgYKBsNpumTZt23e9hs9k0bty4637dq5kzZ45sNptsNptWrFhxyX7LslS5cmXZbDY1b978mu7x7rvvas6cOS6ds2LFiivGBAAo2DxMBwAAlzNz5kwNGDBA1apV03PPPaeaNWsqIyNDGzZs0Hvvvae1a9dqwYIFN+z+vXv31rlz5zRv3jyVKFFC5cuXv+73WLt2rcqWLXvdr5tb/v7++vDDDy9JHFauXKkDBw7I39//mq/97rvvqmTJkurVq1euz7n11lu1du1a1axZ85rvCwAwg6QCQIGzdu1aPf3002rTpo2+/fZb2e12x742bdpo+PDhWrRo0Q2NYceOHerXr5/at29/w+7RuHHjG3bt3OjWrZs+++wzvfPOOwoICHC0f/jhh2rSpImSkpLyJY6MjAzZbDYFBAQYf00AANeG7k8ACpwJEybIZrPpgw8+cEooLvLy8lLHjh0dj7OzszV58mRVr15ddrtdISEhevzxx3X06FGn85o3b65atWpp/fr1uuuuu+Tr66uKFStq4sSJys7OlvS/rkGZmZmaMWOGo5uQJI0bN87x75wunhMTE+NoW7ZsmZo3b67g4GD5+PioXLlyevDBB5WSkuI45nLdn3bs2KFOnTqpRIkS8vb2Vr169fTxxx87HXOxm9AXX3yhMWPGKDw8XAEBAWrdurX27t2buxdZ0iOPPCJJ+uKLLxxtiYmJ+vrrr9W7d+/LnjN+/Hg1atRIQUFBCggI0K233qoPP/xQlmU5jilfvrx27typlStXOl6/i5Wei7F/8sknGj58uMqUKSO73a79+/df0v3p5MmTioiIUNOmTZWRkeG4/q5du1SsWDE99thjuX6uAIAbi6QCQIGSlZWlZcuWqUGDBoqIiMjVOU8//bSef/55tWnTRt99951eeeUVLVq0SE2bNtXJkyedjo2Li9Ojjz6qf/3rX/ruu+/Uvn17jRo1Sp9++qkk6b777tPatWslSQ899JDWrl3reJxbMTExuu++++Tl5aXZs2dr0aJFmjhxoooVK6b09PQrnrd37141bdpUO3fu1FtvvaVvvvlGNWvWVK9evTR58uRLjh89erQOHTqkWbNm6YMPPtC+ffvUoUMHZWVl5SrOgIAAPfTQQ5o9e7aj7YsvvpCbm5u6det2xef21FNP6csvv9Q333yjLl26aNCgQXrllVccxyxYsEAVK1ZU/fr1Ha/f37uqjRo1SocPH9Z7772nhQsXKiQk5JJ7lSxZUvPmzdP69ev1/PPPS5JSUlL08MMPq1y5cnrvvfdy9TwBAPnAAoACJC4uzpJkde/ePVfH796925JkDRgwwKn9999/tyRZo0ePdrQ1a9bMkmT9/vvvTsfWrFnTateunVObJOuZZ55xahs7dqx1uR+bH330kSXJio6OtizLsr766itLkrVly5Z/jF2SNXbsWMfj7t27W3a73Tp8+LDTce3bt7d8fX2thIQEy7Isa/ny5ZYk695773U67ssvv7QkWWvXrv3H+16Md/369Y5r7dixw7Isy7rtttusXr16WZZlWbfccovVrFmzK14nKyvLysjIsF5++WUrODjYys7Oduy70rkX73f33Xdfcd/y5cud2idNmmRJshYsWGD17NnT8vHxsbZt2/aPzxEAkL+oVAAo1JYvXy5JlwwIvv3221WjRg0tXbrUqT00NFS33367U1udOnV06NCh6xZTvXr15OXlpSeffFIff/yxDh48mKvzli1bplatWl1SoenVq5dSUlIuqZjk7AImXXgeklx6Ls2aNVOlSpU0e/Zsbd++XevXr79i16eLMbZu3VqBgYFyd3eXp6enXnrpJZ06dUrx8fG5vu+DDz6Y62Ofe+453XfffXrkkUf08ccf6+2331bt2rVzfT4A4MYjqQBQoJQsWVK+vr6Kjo7O1fGnTp2SJIWFhV2yLzw83LH/ouDg4EuOs9vtSk1NvYZoL69SpUr65ZdfFBISomeeeUaVKlVSpUqV9Oabb/7jeadOnbri87i4P6e/P5eL409ceS42m01PPPGEPv30U7333nuqWrWq7rrrrsse+8cff6ht27aSLszO9dtvv2n9+vUaM2aMy/e93PP8pxh79eql8+fPKzQ0lLEUAFAAkVQAKFDc3d3VqlUrbdy48ZKB1pdz8Q/r2NjYS/YdP35cJUuWvG6xeXt7S5LS0tKc2v8+bkOS7rrrLi1cuFCJiYlat26dmjRpoiFDhmjevHlXvH5wcPAVn4ek6/pccurVq5dOnjyp9957T0888cQVj5s3b548PT31/fffq2vXrmratKkaNmx4Tfe83ID3K4mNjdUzzzyjevXq6dSpUxoxYsQ13RMAcOOQVAAocEaNGiXLstSvX7/LDmzOyMjQwoULJUktW7aUJMdA64vWr1+v3bt3q1WrVtctroszGG3bts2p/WIsl+Pu7q5GjRrpnXfekSRt2rTpise2atVKy5YtcyQRF82dO1e+vr43bLrVMmXK6LnnnlOHDh3Us2fPKx5ns9nk4eEhd3d3R1tqaqo++eSTS469XtWfrKwsPfLII7LZbPrpp58UFRWlt99+W998802erw0AuH5YpwJAgdOkSRPNmDFDAwYMUIMGDfT000/rlltuUUZGhjZv3qwPPvhAtWrVUocOHVStWjU9+eSTevvtt+Xm5qb27dsrJiZGL774oiIiIjR06NDrFte9996roKAg9enTRy+//LI8PDw0Z84cHTlyxOm49957T8uWLdN9992ncuXK6fz5844Zllq3bn3F648dO1bff/+9WrRooZdeeklBQUH67LPP9MMPP2jy5MkKDAy8bs/l7yZOnHjVY+677z5NmTJFPXr00JNPPqlTp07p9ddfv+y0v7Vr19a8efM0f/58VaxYUd7e3tc0DmLs2LH69ddftXjxYoWGhmr48OFauXKl+vTpo/r166tChQouXxMAcP2RVAAokPr166fbb79dU6dO1aRJkxQXFydPT09VrVpVPXr00MCBAx3HzpgxQ5UqVdKHH36od955R4GBgbrnnnsUFRV12TEU1yogIECLFi3SkCFD9K9//UvFixdX37591b59e/Xt29dxXL169bR48WKNHTtWcXFx8vPzU61atfTdd985xiRcTrVq1bRm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iYHaLuMVAwAAAJAnVCoAAACAHFhR23VUKgAAAIBCaMaMGapTp44CAgIUEBCgJk2a6KeffnLstyxL48aNU3h4uHx8fNS8eXPt3LnT6RppaWkaNGiQSpYsqWLFiqljx446evSoy7GQVAAAAACFUNmyZTVx4kRt2LBBGzZsUMuWLdWpUydH4jB58mRNmTJF06dP1/r16xUaGqo2bdro7NmzjmsMGTJECxYs0Lx587R69WolJyfr/vvvV1ZWlkuxkFQAAAAAOdnczG0u6NChg+69915VrVpVVatW1WuvvSY/Pz+tW7dOlmVp2rRpGjNmjLp06aJatWrp448/VkpKij7//HNJUmJioj788EO98cYbat26terXr69PP/1U27dv1y+//OJSLCQVAAAAQAGRlpampKQkpy0tLe2q52VlZWnevHk6d+6cmjRpoujoaMXFxalt27aOY+x2u5o1a6Y1a9ZIkjZu3KiMjAynY8LDw1WrVi3HMblFUgEAAADk5GYztkVFRSkwMNBpi4qKumKo27dvl5+fn+x2u/r3768FCxaoZs2aiouLkySVLl3a6fjSpUs79sXFxcnLy0slSpS44jG5xexPAAAAQAExatQoDRs2zKnNbrdf8fhq1appy5YtSkhI0Ndff62ePXtq5cqVjv02m/NMVpZlXdL2d7k55u9IKgAAAIAcbC6Obbie7Hb7PyYRf+fl5aXKlStLkho2bKj169frzTff1PPPPy/pQjUiLCzMcXx8fLyjehEaGqr09HSdOXPGqVoRHx+vpk2buhQ33Z8AAACAm4RlWUpLS1OFChUUGhqqJUuWOPalp6dr5cqVjoShQYMG8vT0dDomNjZWO3bscDmpoFIBAAAAFEKjR49W+/btFRERobNnz2revHlasWKFFi1aJJvNpiFDhmjChAmqUqWKqlSpogkTJsjX11c9evSQJAUGBqpPnz4aPny4goODFRQUpBEjRqh27dpq3bq1S7GQVAAAAAA5FZIVtf/66y899thjio2NVWBgoOrUqaNFixapTZs2kqSRI0cqNTVVAwYM0JkzZ9SoUSMtXrxY/v7+jmtMnTpVHh4e6tq1q1JTU9WqVSvNmTNH7u7uLsVisyzLuq7PrgC4s8PKqx+Em8bopU+ZDgH5aEKr902HAOAGcff0NB0C8tHKb1zrXpOfzs38t7F7F+v3qrF75wWVCgAAACAHmxvDjl3FKwYAAAAgT0gqAAAAAOQJ3Z8AAACAnFxc+A1UKgAAAADkEZUKAAAAICcGaruMVwwAAABAnlCpAAAAAHJiTIXLqFQAAAAAyBOSCgAAAAB5UuC6P2VlZWn79u2KjIxUiRIlTIcDAACAIoYVtV1n/BUbMmSIPvzwQ0kXEopmzZrp1ltvVUREhFasWGE2OAAAAABXZTyp+Oqrr1S3bl1J0sKFCxUdHa09e/ZoyJAhGjNmjOHoAAAAUOTY3MxthZTxyE+ePKnQ0FBJ0o8//qiHH35YVatWVZ8+fbR9+3bD0QEAAAC4GuNJRenSpbVr1y5lZWVp0aJFat26tSQpJSVF7u7uhqMDAAAAcDXGB2o/8cQT6tq1q8LCwmSz2dSmTRtJ0u+//67q1asbjg4AAABFjhvrVLjKeFIxbtw41apVS0eOHNHDDz8su90uSXJ3d9cLL7xgODoAAAAAV2M8qZg7d666devmSCYueuSRRzRv3jxDUQEAAKCoshXiAdOmGH/FnnjiCSUmJl7SfvbsWT3xxBMGIgIAAADgCuOVCsuyZLNd2m/t6NGjCgwMNBARAAAAijTGVLjMWFJRv3592Ww22Ww2tWrVSh4e/wslKytL0dHRuueee0yFBwAAACCXjCUVnTt3liRt2bJF7dq1k5+fn2Ofl5eXypcvrwcffNBQdAAAAAByy1hSMXbsWGVlZSkyMlLt2rVTWFiYqVAAAACA/2GgtsuMjqlwd3dX//79tXv3bpNh3BQeuDdcj3Qpq+ASdsUcPqc3Zx7Qtl2XDoBHwVWuX3eV6/uIfCLLSJKSd+/X/qh3dGLxr5Ikr5BgVX9lhEq2vkOegf46/dsG7Rz2qlIOHLrs9Rp++4FC2t6tjd2e0V8Ll+bb88D1x+e7aOH9LjpKBnnpqcci1ejW4rJ7uenI8fOa/M5+/XnwnOnQAJcZT8Nq166tgwcPmg6jUGt5ZykN7ltJc788rN7PbtTWnYl6fVxtlS5lv/rJKDDOH/tLe196Q2vufEhr7nxIp1auU4Mv35FfjcqSpAbz35FvhbLa2HWAVjfpotTDx9Xoh9ly9/W55FrlB/aULCu/nwJuAD7fRQvvd9HhV8xd0yfUUlaWpZGv7FbPwVv07pwYJZ/LNB0aJMlmM7cVUsaTitdee00jRozQ999/r9jYWCUlJTltuLruncvq+yVx+n5xnA4dTdFbsw4o/uR5dW4fbjo0uCD+x+U68fMqndsfo3P7Y/TnuGnKTE5R8dvrqljl8irRqJ52PDteiRt36Ny+aO14drzcixVTWNf7nK7jX7uaKgzupW39xxh6Jrie+HwXLbzfRUePB8roxMl0TZy+X3v2JyvuRJo2bU/U8b/STIcGXBPjU8penOGpY8eOTlPLXpxqNisry1RohYKHh01VK/vr068OO7Wv33xGtWoEGIoKeebmprAu98i9mK8Sft8iN7uXJCn7fI5fNtnZys5IV1CTBjo656sLp/l4q96cN7Rz2CtK/+ukichxHfH5Llp4v4uWO24L0h9bEjR+RFXVvSVQJ0+l6dtFcfr+l3jToQHXxHhSsXz5ctMhFGqBAZ7ycLfpdEKGU/vphAwFF/cyFBWulf8tVdVk+Rdy87YrKzlFm7oPVPKeA7J5eCjl0DFVe3mYtg8aq6xzqaowuJe8Q0NkDy3lOL/m5FFK+H2z4r9fZvBZ4Hrh81208H4XLWGlvdWpXaj+b+Fxffr1MVWv4qfBfSooI9PSzytOmA4PbsY78xQ6xpOKZs2a5en8tLQ0paU5lwqzs9Ll5l60fgD/vfu8zSbRo77wSf4zWqsbPyDP4gEK7dRWdT6YqN/bPabkPQe0qcdg1Znxqtoe/0PZmZk6tXyt4n9e6Tg35L4WCm7WSKubdDH4DHAj8PkuWni/iwY3m7T3QLJmfnahMrUv+pwqRPiqU7tQkgoUSsaTCklKSEjQhx9+qN27d8tms6lmzZrq3bt3rlbUjoqK0vjx453aIqr0VLlqT9yocAuUxKQMZWZZCi7h6dReItBTpxPSDUWFa2VlZCjl4IVfMImbdiiwQS2Vf+Zx7Rg0Vkmbd2p14wfkEeAnNy9PpZ88o6Yr5ytx0w5JUnCzxvKtWE5tYv9wuuatn7+l079t1O/3PJ7vzwd5w+e7aOH9LlpOJWQo5miqU9uhoym6u3GQoYjghCllXWb8FduwYYMqVaqkqVOn6vTp0zp58qSmTJmiSpUqadOmTVc9f9SoUUpMTHTaylZ+NB8iLxgyMy39uf+sbqtfwqm9Yb0S2rGbge6Fns0mNy/nqltmUrLST56Rb6VIBd5aS3/9/65OB96YqV9v76TVjR9wbJK0a+REbXtqVL6Hjrzj81208H4XLTt2J6lcuPPsfWXDffTXCQZqo3AyXqkYOnSoOnbsqJkzZ8rD40I4mZmZ6tu3r4YMGaJVq1b94/l2u112u/NUe0Wt69O8b4/qxWHVtWdfsnbsSVLHe8JUupS3vv3puOnQ4IKq44fqxM+rdP5onDz8iyns4XsVfPftWt+pnyQp9IF2Sj95RqlHjsu/VlXV/M8Y/bVwqU4u/U2SlP7XycsOzj5/9LhSDx3L1+eC64fPd9HC+110/N/3sXpnQi3968EyWv7bKdWo4qcObUrr9fcOmA4N0oX+aXCJ8aRiw4YNTgmFJHl4eGjkyJFq2LChwcgKj2WrTygwwFO9ukcqOMhL0YfO6bnx2/m2o5CxhwSr7oeTZQ8tpczEszq7Y6/Wd+qnk8vWXNgfGqIak16QPSRYaXEndPTz/2p/1AzDUeNG4/NdtPB+Fx179ifr35P26sl/ldPjD0coLv68ps+O1i+rmLkPhZPNssyukFW6dGl98sknatu2rVP7zz//rMcff1x//fWXy9e8s8PKqx+Em8bopU+ZDgH5aEKr902HAOAGcff0vPpBuGms/Kap6RCu6Py3bxm7t3fnwcbunRfGKxXdunVTnz599Prrr6tp06ay2WxavXq1nnvuOT3yyCOmwwMAAEBRw0BtlxlPKl5//XXZbDY9/vjjysy8sDS9p6ennn76aU2cONFwdAAAAACuxnhS4eXlpTfffFNRUVE6cOCALMtS5cqV5evrazo0AAAAFEU2Bmq7ynhScZGvr6+KFy8um81GQgEAAAAUIsY7jGVmZurFF19UYGCgypcvr8jISAUGBurf//63MjIyTIcHAAAA4CqMVyoGDhyoBQsWaPLkyWrSpIkkae3atRo3bpxOnjyp9957z3CEAAAAKFLcjH/vXugYTyq++OILzZs3T+3bt3e01alTR+XKlVP37t1JKgAAAIACznhS4e3trfLly1/SXr58eXl5Fa2VsQEAAFAAMFDbZcZrO88884xeeeUVpaX9b7XQtLQ0vfbaaxo4cKDByAAAAADkhvFKxebNm7V06VKVLVtWdevWlSRt3bpV6enpatWqlbp06eI49ptvvjEVJgAAAIoKFr9zmfGkonjx4nrwwQed2iIiIgxFAwAAAMBVxpOKd999V9nZ2SpWrJgkKSYmRt9++61q1Kihdu3aGY4OAAAAwNUYTyo6deqkLl26qH///kpISFDjxo3l6empkydPasqUKXr66adNhwgAAICihCllXWb8Fdu0aZPuuusuSdJXX32l0qVL69ChQ5o7d67eeustw9EBAAAAuBrjlYqUlBT5+/tLkhYvXqwuXbrIzc1NjRs31qFDhwxHBwAAgCKHKWVdZrxSUblyZX377bc6cuSIfv75Z7Vt21aSFB8fr4CAAMPRAQAAALga40nFSy+9pBEjRqh8+fJq1KiRmjRpIulC1aJ+/fqGowMAAABwNca7Pz300EO68847FRsb61inQpJatWqlBx54wGBkAAAAKJJYp8JlxpMKSQoNDVVoaKhT2+23324oGgAAAACuKBBJBQAAAFBgMFDbZdR2AAAAAOQJlQoAAAAgJxa/cxmvGAAAAIA8IakAAAAAkCd0fwIAAABysBio7TIqFQAAAADyhEoFAAAAkBOL37mMVwwAAABAnpBUAAAAAMgTuj8BAAAAOdH9yWW8YgAAAADyhEoFAAAAkANTyrqOSgUAAACAPCGpAAAAAAqhqKgo3XbbbfL391dISIg6d+6svXv3Oh3Tq1cv2Ww2p61x48ZOx6SlpWnQoEEqWbKkihUrpo4dO+ro0aMuxUJSAQAAAORkczO3uWDlypV65plntG7dOi1ZskSZmZlq27atzp0753TcPffco9jYWMf2448/Ou0fMmSIFixYoHnz5mn16tVKTk7W/fffr6ysrFzHwpgKAAAAoBBatGiR0+OPPvpIISEh2rhxo+6++25Hu91uV2ho6GWvkZiYqA8//FCffPKJWrduLUn69NNPFRERoV9++UXt2rXLVSxUKgAAAICcbDZjW1pampKSkpy2tLS0XIWdmJgoSQoKCnJqX7FihUJCQlS1alX169dP8fHxjn0bN25URkaG2rZt62gLDw9XrVq1tGbNmly/ZCQVAAAAQAERFRWlwMBApy0qKuqq51mWpWHDhunOO+9UrVq1HO3t27fXZ599pmXLlumNN97Q+vXr1bJlS0eiEhcXJy8vL5UoUcLpeqVLl1ZcXFyu46b7EwAAAJCTm7nv3UeNGqVhw4Y5tdnt9queN3DgQG3btk2rV692au/WrZvj37Vq1VLDhg0VGRmpH374QV26dLni9SzLks2FqXVJKgAAAIACwm635yqJyGnQoEH67rvvtGrVKpUtW/Yfjw0LC1NkZKT27dsnSQoNDVV6errOnDnjVK2Ij49X06ZNcx0D3Z8AAACAQsiyLA0cOFDffPONli1bpgoVKlz1nFOnTunIkSMKCwuTJDVo0ECenp5asmSJ45jY2Fjt2LHDpaSCSgUAAACQQ2FZUfuZZ57R559/rv/+97/y9/d3jIEIDAyUj4+PkpOTNW7cOD344IMKCwtTTEyMRo8erZIlS+qBBx5wHNunTx8NHz5cwcHBCgoK0ogRI1S7dm3HbFC5QVIBAAAAFEIzZsyQJDVv3typ/aOPPlKvXr3k7u6u7du3a+7cuUpISFBYWJhatGih+fPny9/f33H81KlT5eHhoa5duyo1NVWtWrXSnDlz5O7unutYSCoAAACAnFxchM4Uy7L+cb+Pj49+/vnnq17H29tbb7/9tt5+++1rjqVwvGIAAAAACiySCgAAAAB5QvcnAAAAIAerkHR/Kkh4xQAAAADkCZUKAAAAIKdCMqVsQUKlAgAAAECeUKkAAAAAcmBMhet4xQAAAADkCUkFAAAAgDyh+xMAAACQEwO1XUalAgAAAECeUKkAAAAAcmKgtstIKlDoRbWZaToE5KPRS/qZDgH5aEKr902HgHxkWdmmQwBwjUjDAAAAAOQJlQoAAAAgB4uB2i6jUgEAAAAgT6hUAAAAADkxUNtlvGIAAAAA8oRKBQAAAJCDJcZUuIpKBQAAAIA8IakAAAAAkCd0fwIAAABysBio7TJeMQAAAAB5QqUCAAAAyIlKhct4xQAAAADkCUkFAAAAgDwxnlT07t1bZ8+evaT93Llz6t27t4GIAAAAUJRZNpuxrbAynlR8/PHHSk1NvaQ9NTVVc+fONRARAAAAAFcYG6idlJQky7JkWZbOnj0rb29vx76srCz9+OOPCgkJMRUeAAAAiiimlHWdsaSiePHistlsstlsqlq16iX7bTabxo8fbyAyAAAAAK4wllQsX75clmWpZcuW+vrrrxUUFOTY5+XlpcjISIWHh5sKDwAAAEVVIR7bYIqxpKJZs2aSpOjoaEVERMjNjTITAAAAUBgZX/wuMjJSCQkJ+uOPPxQfH6/s7Gyn/Y8//rihyAAAAADkhvGkYuHChXr00Ud17tw5+fv7y5aj3GSz2UgqAAAAkK8YqO0646/Y8OHDHWtVJCQk6MyZM47t9OnTpsMDAAAAcBXGKxXHjh3T4MGD5evrazoUAAAAQJYYqO0q45WKdu3aacOGDabDAAAAAHCNjFcq7rvvPj333HPatWuXateuLU9PT6f9HTt2NBQZAAAAgNwwnlT069dPkvTyyy9fss9msykrKyu/QwIAAEARxkBt1xlPKv4+hSwAAACAwsV4UpHT+fPn5e3tbToMAAAAFGWsqO0y47WdrKwsvfLKKypTpoz8/Px08OBBSdKLL76oDz/80HB0AAAAAK7GeFLx2muvac6cOZo8ebK8vLwc7bVr19asWbMMRgYAAICiyJKbsa2wMh753Llz9cEHH+jRRx+Vu7u7o71OnTras2ePwcgAAAAA5IbxpOLYsWOqXLnyJe3Z2dnKyMgwEBEAAAAAVxhPKm655Rb9+uuvl7T/3//9n+rXr28gIgAAABRlls1mbCusjM/+NHbsWD322GM6duyYsrOz9c0332jv3r2aO3euvv/+e9PhAQAAALgK45WKDh06aP78+frxxx9ls9n00ksvaffu3Vq4cKHatGljOjwAAAAUMZbNzdhWWBmvVEhSu3bt1K5dO9NhAAAAALgGBSKpuCg5OfmSFbYDAgIMRQMAAAAgN4wnFdHR0Ro4cKBWrFih8+fPO9oty5LNZlNWVpbB6AAAAFDUWCq8A6ZNMZ5UPProo5Kk2bNnq3Tp0rIV4lHvAAAAQFFkPKnYtm2bNm7cqGrVqpkOBQAAACjUA6ZNMf6K3XbbbTpy5IjpMAAAAABcI+OVilmzZql///46duyYatWqJU9PT6f9derUMRQZAAAAiqLCvAidKcaTihMnTujAgQN64oknHG02m42B2gAAAEAhYTyp6N27t+rXr68vvviCgdoAAABAIWQ8qTh06JC+++47Va5c2XQoAAAAAFPKXgPjA7VbtmyprVu3mg4DAAAAwDUyXqno0KGDhg4dqu3bt6t27dqXDNTu2LGjocgAAABQFDGlrOuMJxX9+/eXJL388suX7GOgNgAAAFDwXVMa9sknn+iOO+5QeHi4Dh06JEmaNm2a/vvf/7p8rezs7CtuJBQAAABAwedyUjFjxgwNGzZM9957rxISEhx/+BcvXlzTpk273vEBAAAA+cqSzdhWWLnc/entt9/WzJkz1blzZ02cONHR3rBhQ40YMeKagli6dKmWLl2q+Ph4ZWdnO+2bPXv2NV0TAAAAQP5wOamIjo5W/fr1L2m32+06d+6cywGMHz9eL7/8sho2bKiwsDDWqQAAAIBRDNR2nctJRYUKFbRlyxZFRkY6tf/000+qWbOmywG89957mjNnjh577DGXzwUAAABgnstJxXPPPadnnnlG58+fl2VZ+uOPP/TFF18oKipKs2bNcjmA9PR0NW3a1OXzAAAAABQMLtd2nnjiCY0dO1YjR45USkqKevTooffee09vvvmmunfv7nIAffv21eeff+7yeQAAAMCNUFgGakdFRem2226Tv7+/QkJC1LlzZ+3du9f5uViWxo0bp/DwcPn4+Kh58+bauXOn0zFpaWkaNGiQSpYsqWLFiqljx446evSoS7Fc0zoV/fr1U79+/XTy5EllZ2crJCTkWi4jSTp//rw++OAD/fLLL6pTp84li99NmTLlmq9dlDxwb7ge6VJWwSXsijl8Tm/OPKBtuxJNh4XrrPM9YercPkyhIXZJUvThFM2Zf1i/bzpjODK4qly/7irX9xH5RJaRJCXv3q/9Ue/oxOJfJUleIcGq/soIlWx9hzwD/XX6tw3aOexVpRw45LhGrbfHK7hFE3mHhSgzOUUJv2/Wnn+/rnN/Rht5Trg++HleND3apayeeqy8/m/hMb09m88wcmflypV65plndNtttykzM1NjxoxR27ZttWvXLhUrVkySNHnyZE2ZMkVz5sxR1apV9eqrr6pNmzbau3ev/P39JUlDhgzRwoULNW/ePAUHB2v48OG6//77tXHjRrm7u+cqFptlWdYNe6a50KJFiyvus9lsWrZsmcvXvLPDyryEVOi0vLOUXhxWXW+8t0/bdyWp0z1hur9tmB57Zr3+OpFmOrwbzuZWdAZTNb0tSNnZlo7Fnpck3dMyRI90LqveQzcr5kiK4ejyx6gl/UyHcF2E3NtCVlaWUg4cliSV+VdnVRzSW6ubdFHy7v1qsnyerIwM7R41SZlJ51RhcC+VanOnVt16v7JSUiVJEb27KnnvQZ0/EivPoEBVGTNQAXWqa3mN1tLfZtIrrCa0et90CPmqqP88d/PI3R8vN5vqlf00fkR1nUvJ0uYdCUUmqVi14E7TIVxR9IH9xu5doVLlaz73xIkTCgkJ0cqVK3X33XfLsiyFh4dryJAhev755yVdqEqULl1akyZN0lNPPaXExESVKlVKn3zyibp16yZJOn78uCIiIvTjjz+qXbt2ubr3NQ3U/qcZmg4ePOjS9ZYvX+5qCPib7p3L6vslcfp+cZwk6a1ZB3T7rSXUuX243p9bNH4wFRVr1p92ejzz00PqfE+YbqnmX2SSiptF/I/OP/v+HDdN5fp2V/Hb68rKyFSJRvW0qsH9St594RfbjmfHq/WhNQrrep+OzvlKknRk9peO81MPH9Of46fprj++k29kGaVEH8m/J4Prhp/nRY+Pt5teHFpNk9/dp8cfLmc6HBQAaWlpSktz/hLBbrfLbrdf9dzExAtVzaCgIEkXZm2Ni4tT27Ztna7VrFkzrVmzRk899ZQ2btyojIwMp2PCw8NVq1YtrVmzJtdJhctf8Q4ZMkTPPvusYxswYICaNGmixMREPfnkk65eDnnk4WFT1cr+Wr/Z+Y/N9ZvPqFaNAENRIT+4uUmt7iolb2937dx71nQ4yAs3N4U9dK/ci/kq4fctcrN7SZKyz+f4pZKdreyMdAU1aXDZS7j7+qjsY12UEn1EqUfj8iNqXGf8PC+ahj5ZSWs3nNbGbXRxK0hMjqmIiopSYGCg0xYVFXX1mC1Lw4YN05133qlatWpJkuLiLvw+KF26tNOxpUuXduyLi4uTl5eXSpQoccVjcsPlSsWzzz572fZ33nlHGzZsyNU1unTpojlz5iggIEBdunT5x2O/+eYbV0MsUgIDPOXhbtPphAyn9tMJGQou7mUoKtxIFSN9NWNSPXl5uSk1NUtjonZRpSik/G+pqibLv5Cbt11ZySna1H2gkvcckM3DQymHjqnay8O0fdBYZZ1LVYXBveQdGiJ7aCmna5R78hFVf3WEPPyKKXnPAf1xf29ZGRlXuCMKMn6eFz0t7yypqhX99ORzW0yHggJk1KhRGjZsmFNbbqoUAwcO1LZt27R69epL9v29l5FlWVddGy43x+R03Tqjt2/fXl9//XWujg0MDHQE+fdM7O/b1aSlpSkpKclpy85Kz9NzKYz+PjLGZpOMDpbBDXP4WKp6D9mk/iO36L+LYjXm2WoqH+FrOixcg+Q/o7W68QNa27y7Ds+cpzofTJRf9UqyMjO1qcdgFatSXm2P/6F2pzYr+O7bFf/zSlnZWU7XOD5voVY36aK1bf6lcwcOqf6n0xyVDhRO/DwvGkKCvTS4T0W9Mu1PpWfwDuN/7Ha7AgICnLarJRWDBg3Sd999p+XLl6ts2bKO9tDQUEm6pOIQHx/vqF6EhoYqPT1dZ86cueIxuXFNsz9dzldffeXov3U1H3300WX/fS2ioqI0fvx4p7aIKj1VrtoTebpuYZGYlKHMLEvBJZxnzSoR6KnTCUUvuSoKMjMtHYu7MFB77/5kVa/ip4fuD9frM8wNKsO1sTIylHLwwkDtxE07FNiglso/87h2DBqrpM07tbrxA/II8JObl6fST55R05Xzlbhph9M1MpOSlZmUrJQDh7Tpj61qc/x3le7YRrH/94OJp4Q84Od50VK1kp+Cintp5uv1HG0e7jbVrRmgB+4NV+uuv90s8y0USpYL39CbZFmWBg0apAULFmjFihWqUKGC0/4KFSooNDRUS5YsUf369SVdWCNu5cqVmjRpkiSpQYMG8vT01JIlS9S1a1dJUmxsrHbs2KHJkyfnOhaXk4r69es7lUIsy1JcXJxOnDihd99919XL5dnlSkT3dP893+MwJTPT0p/7z+q2+iW0at0pR3vDeiW0+vdT/3AmbhY22eTlWXRmwLqp2Wxy83KuMmQmJUuSfCtFKvDWWvrz5beucgkblYpCip/nRcvGbYnq+ewmp7YXBlbR4WOp+nzBURIK5Mozzzyjzz//XP/973/l7+/vqEgEBgbKx8dHNptNQ4YM0YQJE1SlShVVqVJFEyZMkK+vr3r06OE4tk+fPho+fLiCg4MVFBSkESNGqHbt2mrdunWuY3E5qejcubPTYzc3N5UqVUrNmzdX9erVXb2cpAtVji+//FKHDx9WerrztzGbNm26wlkXXG40vJt70fqFOu/bo3pxWHXt2ZesHXuS1PGeMJUu5a1vfzpuOjRcZ0/+K1LrNp1R/Mk0+fq4q9VdpVSvVqBGjN9x9ZNRoFQdP1Qnfl6l80fj5OFfTGEP36vgu2/X+k4XpswNfaCd0k+eUeqR4/KvVVU1/zNGfy1cqpNLf5Mk+ZQvq/CH7tWJpb8p/cRpeYeXVsXhfZWVmqYTPxetabVvJvw8LzpSz2cp+rDzeLjzadlKOptxSTvyn2UVjkrFjBkzJEnNmzd3av/oo4/Uq1cvSdLIkSOVmpqqAQMG6MyZM2rUqJEWL17sWKNCkqZOnSoPDw917dpVqampatWqlebMmZPrNSokF5OKzMxMlS9fXu3atXP00cqrt956S2PGjFHPnj313//+V0888YQOHDig9evX65lnnrku97jZLVt9QoEBnurVPVLBQV6KPnROz43fXiTmNC9qShT30r+HVFNwkJfOncvUgUPnNGL8Dm3YmmA6NLjIHhKsuh9Olj20lDITz+rsjr1a36mfTi5bc2F/aIhqTHpB9pBgpcWd0NHP/6v9UTMc52enpavEHQ1U/pnH5VkiQGnxp3R69QatbfmI0k+cvtJtUcDx8xyAK3Kz3JzNZtO4ceM0bty4Kx7j7e2tt99+W2+//fY1x+Ly4ne+vr7avXu3IiMjr/mmOVWvXl1jx47VI488In9/f23dulUVK1bUSy+9pNOnT2v69OkuX7OoLX5X1BWlxe9w8yx+h9wpaovfFXVFdfG7oqogL363/4C5dWEqV6pw9YMKIJf/GmvUqJE2b9583QI4fPiwmjZtKkny8fHR2bMX5tt/7LHH9MUXX1y3+wAAAAC5YcnN2FZYuTymYsCAARo+fLiOHj2qBg0aqFixYk7769Sp49L1QkNDderUKUVGRioyMlLr1q1T3bp1FR0dnauSDgAAAACzcp1U9O7dW9OmTVO3bt0kSYMHD3bss9lsjgUysrKyrnSJy2rZsqUWLlyoW2+9VX369NHQoUP11VdfacOGDVddGA8AAAC43iwVjoHaBUmuk4qPP/5YEydOVHT09e1j9sEHHyj7/8+b1r9/fwUFBWn16tXq0KGD+vfvf13vBQAAAOD6y3VScbEr0vUaoH3R0aNHFRER4XjctWtXde3aVZZl6ciRIypXrtx1vR8AAADwT6hUuM6l0SC2G7C6YIUKFXTixIlL2k+fPn3JqoAAAAAACh6XBmpXrVr1qonF6dOuzY9+cSzG3yUnJ8vb29ulawEAAADIfy4lFePHj1dgYOB1ufGwYcMkXah+vPjii/L19XXsy8rK0u+//6569epdl3sBAAAAuUX3J9e5lFR0795dISEh1+XGF9e6sCxL27dvl5eXl2Ofl5eX6tatqxEjRlyXewEAAAC4cXKdVFzv8RTLly+XJPXq1Utvv/22/P39r+v1AQAAgGtBpcJ1uR6ofSMWosvMzNSnn36qQ4cOXfdrAwAAAMgfua5UXFxL4rre3MNDkZGRLi+YBwAAAKDgcGlK2Rvh3//+t0aNGuXyrFEAAADAjWBZNmNbYeXSQO0b4a233tL+/fsVHh6uyMhIFStWzGn/pk2bDEUGAAAAIDeMJxWdO3c2HQIAAADgwEBt1xlPKsaOHWs6BAAAAAB5YHxMhSQlJCRo1qxZTmMrNm3apGPHjhmODAAAAEWNJZuxrbAyXqnYtm2bWrdurcDAQMXExKhfv34KCgrSggULdOjQIc2dO9d0iAAAAAD+gfFKxbBhw9SrVy/t27dP3t7ejvb27dtr1apVBiMDAAAAkBvGKxXr16/X+++/f0l7mTJlFBcXZyAiAAAAFGWFuRuSKcYrFd7e3kpKSrqkfe/evSpVqpSBiAAAAAC4wnhS0alTJ7388svKyMiQJNlsNh0+fFgvvPCCHnzwQcPRAQAAoKhh8TvXGU8qXn/9dZ04cUIhISFKTU1Vs2bNVLlyZfn7++u1114zHR4AAACAqzA+piIgIECrV6/WsmXLtGnTJmVnZ+vWW29V69atTYcGAAAAIBeMJxVz585Vt27d1LJlS7Vs2dLRnp6ernnz5unxxx83GB0AAACKmmwGarvMePenJ554QomJiZe0nz17Vk888YSBiAAAAAC4wnilwrIs2WyXZoNHjx5VYGCggYgAAABQlDGlrOuMJRX169eXzWaTzWZTq1at5OHxv1CysrIUHR2te+65x1R4AAAAAHLJWFLRuXNnSdKWLVvUrl07+fn5OfZ5eXmpfPnyTCkLAACAfFeYp3Y1xVhSMXbsWElS+fLl1a1bN3l7e5sKBQAAAEAeGB9T0bNnT0kXZnuKj49Xdna20/5y5cqZCAsAAABALhlPKvbt26fevXtrzZo1Tu0XB3BnZWUZigwAAABFEQO1XWc8qejVq5c8PDz0/fffKyws7LIzQQEAAAAouIwnFVu2bNHGjRtVvXp106EAAAAADNS+BsYXv6tZs6ZOnjxpOgwAAAAA18h4UjFp0iSNHDlSK1as0KlTp5SUlOS0AQAAACjYjHd/at26tSSpZcuWTuMpGKgNAAAAExio7TrjScXy5ctNhwAAAAAgD4x3f2rWrJnc3Nw0c+ZMvfDCC6pcubKaNWumw4cPy93d3XR4AAAAKGIsy2ZsK6yMJxVff/212rVrJx8fH23evFlpaWmSpLNnz2rChAmGowMAAABwNcaTildffVXvvfeeZs6cKU9PT0d706ZNtWnTJoORAQAAoCjKNrgVVsaTir179+ruu+++pD0gIEAJCQn5HxAAAAAAlxhPKsLCwrR///5L2levXq2KFSsaiAgAAACAK4zP/vTUU0/p2Wef1ezZs2Wz2XT8+HGtXbtWI0aM0EsvvWQ6PAAAABQxhXnAtCnGk4qRI0cqMTFRLVq00Pnz53X33XfLbrdrxIgRGjhwoOnwAAAAAFyF8aRCkl577TWNGTNGu3btUnZ2tmrWrCk/Pz/TYQEAAKAIYvE71xWIpEKSfH191bBhQ9NhAAAAAHCR8YHaAAAAAAq3AlOpAAAAAAoCBmq7jkoFAAAAgDyhUgEAAADkwEBt11GpAAAAAJAnVCoAAACAHLIt0xEUPlQqAAAAAOQJSQUAAACAPKH7EwAAAJADA7VdR1KBQs/KzjYdAvLRhFbvmw4B+WjUoidNh4B8NPHeWaZDAHCNSCoAAACAHFj8znWMqQAAAACQJyQVAAAAAPKE7k8AAABADhbrVLiMSgUAAACAPKFSAQAAAOSQzZSyLqNSAQAAACBPSCoAAAAA5AlJBQAAAJCDZdmMba5YtWqVOnTooPDwcNlsNn377bdO+3v16iWbzea0NW7c2OmYtLQ0DRo0SCVLllSxYsXUsWNHHT161OXXjKQCAAAAKITOnTununXravr06Vc85p577lFsbKxj+/HHH532DxkyRAsWLNC8efO0evVqJScn6/7771dWVpZLsTBQGwAAAMihsEwp2759e7Vv3/4fj7Hb7QoNDb3svsTERH344Yf65JNP1Lp1a0nSp59+qoiICP3yyy9q165drmOhUgEAAAAUEGlpaUpKSnLa0tLSrvl6K1asUEhIiKpWrap+/fopPj7esW/jxo3KyMhQ27ZtHW3h4eGqVauW1qxZ49J9SCoAAACAHCzZjG1RUVEKDAx02qKioq7pebRv316fffaZli1bpjfeeEPr169Xy5YtHUlKXFycvLy8VKJECafzSpcurbi4OJfuRfcnAAAAoIAYNWqUhg0b5tRmt9uv6VrdunVz/LtWrVpq2LChIiMj9cMPP6hLly5XPM+yLNlsrg0aJ6kAAAAACgi73X7NScTVhIWFKTIyUvv27ZMkhYaGKj09XWfOnHGqVsTHx6tp06YuXZvuTwAAAEAO2Za57UY6deqUjhw5orCwMElSgwYN5OnpqSVLljiOiY2N1Y4dO1xOKqhUAAAAAIVQcnKy9u/f73gcHR2tLVu2KCgoSEFBQRo3bpwefPBBhYWFKSYmRqNHj1bJkiX1wAMPSJICAwPVp08fDR8+XMHBwQoKCtKIESNUu3Ztx2xQuUVSAQAAAOTg6iJ0pmzYsEEtWrRwPL44FqNnz56aMWOGtm/frrlz5yohIUFhYWFq0aKF5s+fL39/f8c5U6dOlYeHh7p27arU1FS1atVKc+bMkbu7u0uxkFQAAAAAhVDz5s1l/cOiGj///PNVr+Ht7a23335bb7/9dp5iYUwFAAAAgDyhUgEAAADkUFhW1C5IqFQAAAAAyBMqFQAAAEAO2SocA7ULEioVAAAAAPKESgUAAACQA2MqXEelAgAAAECekFQAAAAAyBO6PwEAAAA5FJYVtQsSKhUAAAAA8oRKBQAAAJBDNgO1XWY8qTh37pwmTpyopUuXKj4+XtnZ2U77Dx48aCgyAAAAALlhPKno27evVq5cqccee0xhYWGy2ejDBgAAABQmxpOKn376ST/88IPuuOMO06EAAAAArFNxDYwP1C5RooSCgoJMhwEAAADgGhlPKl555RW99NJLSklJMR0KAAAAIEs2Y1thZbz70xtvvKEDBw6odOnSKl++vDw9PZ32b9q0yVBkAAAAAHLDeFLRuXNn0yEAAAAADkwp6zrjScXYsWNNhwAAAAAgD4wnFRdt3LhRu3fvls1mU82aNVW/fn3TIQEAAADIBeNJRXx8vLp3764VK1aoePHisixLiYmJatGihebNm6dSpUqZDhEAAABFCFPKus747E+DBg1SUlKSdu7cqdOnT+vMmTPasWOHkpKSNHjwYNPhAQAAALgK45WKRYsW6ZdfflGNGjUcbTVr1tQ777yjtm3bGowMAAAARRGVCtcZr1RkZ2dfMo2sJHl6eio7O9tARAAAAABcYTypaNmypZ599lkdP37c0Xbs2DENHTpUrVq1MhgZAAAAgNww3v1p+vTp6tSpk8qXL6+IiAjZbDYdPnxYtWvX1qeffmo6PAAAABQx2VbhXdnaFONJRUREhDZt2qQlS5Zoz549sixLNWvWVOvWrU2HBgAAACAXjCcVF7Vp00Zt2rQxHQYAAACKOAZqu85IUvHWW2/pySeflLe3t956661/PJZpZQEAAICCzUhSMXXqVD366KPy9vbW1KlTr3iczWYjqQAAAEC+olLhOiNJRXR09GX/DQAAAKDwMT6l7Msvv6yUlJRL2lNTU/Xyyy8biAgAAACAK4wnFePHj1dycvIl7SkpKRo/fryBiAAAAFCUZVvmtsLKeFJhWZZstkvnAt66dauCgoIMRAQAAADAFcamlC1RooRsNptsNpuqVq3qlFhkZWUpOTlZ/fv3NxUeAAAAiiiLxe9cZiypmDZtmizLUu/evTV+/HgFBgY69nl5eal8+fJq0qSJqfAAAAAA5JKxpKJnz56SpAoVKqhp06by9PQ0FQoAAACAPDC+onazZs0c/05NTVVGRobT/oCAgPwOqVCpe0ugenSJULVKfioZbNeo13bo13WnTIeFG+yBe8P1SJeyCi5hV8zhc3pz5gFt25VoOizcILzfhV+5px5R5FOPyCeyjCQpedc+7Xv1XZ34eZUkySskWNWjRqhU6zvlWdxfp37doJ1DXlHK/kNO1yneuJ6qvTxUxW+vIysjU0lbd+uP+/sp+3xavj8n5E3ne8LUuX2YQkPskqTowymaM/+wft90xnBkkFin4loYH6idkpKigQMHKiQkRH5+fipRooTThn/m4+2u/dHJmvL+ftOhIJ+0vLOUBvetpLlfHlbvZzdq685EvT6utkqXspsODTcA7/fN4fzROO0Z/bp+a/ygfmv8oE4tX6eG37wjv5qVJUkNv35HvhUitOHBAfr1tgeUeviYGi36SO6+Po5rFG9cT7d/P0snl6zWb00f1uomDynm3c+k7GxTTwt5EH8qTe/NjVa/4VvUb/gWbdqeoKjRNVU+wtd0aMA1MZ5UPPfcc1q2bJneffdd2e12zZo1S+PHj1d4eLjmzp1rOrwCb93G05r5aYxWrT1pOhTkk+6dy+r7JXH6fnGcDh1N0VuzDij+5Hl1bh9uOjTcALzfN4f4H5brxKJVOrcvRuf2xWjvS9OUmZyiEo3qqViV8irRuL52DBynxA3bde7PaO0YOF4efr4K736f4xo1Xx+lmOmf6MB/Zip5136l7D+kuG9+VnZ6xj/cGQXVmvWntW7jGR05nqojx1M189NDSj2fpVuq+ZsODWJK2WthPKlYuHCh3n33XT300EPy8PDQXXfdpX//+9+aMGGCPvvsM9PhAQWKh4dNVSv7a/3m007t6zefUa0adBW82fB+36Tc3BTW9V65F/PVmXWb5Wb3kiTnLkzZ2cpOz1CJOxpIkrxKBalEo3pKP3FKTVd9odZHf1PjpZ849qNwc3OTWt1VSt7e7tq596zpcIBrYnxMxenTp1WhQgVJF8ZPnD594ZfnnXfeqaeffvqq56elpSktzbkvaXZWutzcva5/sIBhgQGe8nC36XSC8zeTpxMyFFyc//M3G97vm4t/rapq+us8uXnblZWcoo0PPaPk3Qdk8/BQSsxRVXt1uLYPeElZ51JVcUgveYeFyDu0lCTJt2KEJKnKiwO1+/nJStq6W2X+1VmNfp6jVfXuv2TsBQqHipG+mjGpnry83JSamqUxUbsUcyTFdFgQYyquhfFKRcWKFRUTEyNJqlmzpr788ktJFyoYxYsXv+r5UVFRCgwMdNqO7qfCgZvb33/Y2WwSP/9uXrzfN4fkvdH6tWFnrbmzmw69/4Xqzp4kvxqVZGVmamO3wSpWtbzanVive5K2KKhZI8X/tFJW1oXxEja3C7+uD8+cr6Mff6OkLbu1e0SUzv0ZrYheD5p8WsiDw8dS1XvIJvUfuUX/XRSrMc9WY0wFCi3jScUTTzyhrVu3SpJGjRrlGFsxdOhQPffcc1c9f9SoUUpMTHTaylZ+9EaHDRiRmJShzCxLwSWcp2AuEeip0wnphqLCjcL7fXOxMjKUcuCwEjfu0N5/T9HZbXtUftDjkqSkTTu1umFn/RzcQEsj7tT6+/vKM7i4UmKOSpLOx56QJCXvPuB0zeTdB+RTjvE1hVVmpqVjcee1d3+y3v8kRvtjkvXQ/byfKJyMd38aOnSo498tWrTQnj17tGHDBlWqVEl169a96vl2u112u/MsKHR9ws0qM9PSn/vP6rb6JbQqx9TBDeuV0OrfmUr4ZsP7fZOz2RzjKS7KTEqWJPlWjlTxBrX059g3JUmpMUd1/thfKla1gtPxxaqW14lFq/InXtxwNtnk5Wn8+16I7k/XwnhS8XflypVTuXLlTIdRaPh4u6lM2P+mHAwr7a3KFYrpbHKm/jrBvOU3o3nfHtWLw6prz75k7diTpI73hKl0KW99+9Nx06HhBuD9vjlUe2Wo4het0vmjcfLwL6bwrvcquNnt+uO+vpKk0AfvUfqJ00o9clwBtaqp5pTRivvvLzr5y2+OaxyY8qGqvjRISdv2KGnrbpV97AH5VauoTd0Gm3payIMn/xWpdZvOKP5kmnx93NXqrlKqVytQI8bvMB0acE2MJxWDBw9W5cqVNXiw8w/F6dOna//+/Zo2bZqZwAqJ6pX99XZUPcfjwX0vzHn+49I4TZi211BUuJGWrT6hwABP9eoeqeAgL0UfOqfnxm8nibxJ8X7fHOylS6renMmyh4UoM/Gszm7fqz/u66uTS9dIkrzDSqnmf16QvXSwzsee0LFP/6t9r73rdI2Ytz6Wu91LNV8fJc+gQJ3dtke/t++tlINHTDwl5FGJ4l7695BqCg7y0rlzmTpw6JxGjN+hDVsTTIcGFe6pXU2xWZbZAk+ZMmX03XffqUED52nxNm3apI4dO+ro0aMuX/PODiuvV3gAAINGLXrSdAjIRxPvnWU6BOSjX/97l+kQrmjWUnP37tvK3L3zwnjHvVOnTikwMPCS9oCAAJ08yYJuAAAAQEFnPKmoXLmyFi1adEn7Tz/9pIoVKxqICAAAAEWZZZnbCivjYyqGDRumgQMH6sSJE2rZsqUkaenSpXrjjTcYTwEAAAAUAsaTit69eystLU2vvfaaXnnlFUlS+fLlNWPGDD3++OOGowMAAEBRk51tOoLCx3hSIUlPP/20nn76aZ04cUI+Pj7y8/MzHRIAAACAXCoQScVFpUqVMh0CAAAAirjCPLbBFONJRYUKFWSz2a64/+DBg/kYDQAAAABXGU8qhgwZ4vQ4IyNDmzdv1qJFi/Tcc8+ZCQoAAABArhlPKp599tnLtr/zzjvasGFDPkcDAACAoo7uT64zvk7FlbRv315ff/216TAAAAAAXIXxSsWVfPXVVwoKCjIdBgAAAIqYbCoVLjOeVNSvX99poLZlWYqLi9OJEyf07rvvGowMAAAAQG4YTyo6d+7s9NjNzU2lSpVS8+bNVb16dTNBAQAAAMg140nF2LFjTYcAAAAAOFhGR2pfeamFgsxIUpGUlJTrYwMCAm5gJAAAAADyykhSUbx48X9c8C6nrKysGxwNAAAA8D9MKes6I0nF8uXLHf+OiYnRCy+8oF69eqlJkyaSpLVr1+rjjz9WVFSUifAAAAAAuMBIUtGsWTPHv19++WVNmTJFjzzyiKOtY8eOql27tj744AP17NnTRIgAAAAAcsn44ndr165Vw4YNL2lv2LCh/vjjDwMRAQAAoCjLzja3FVbGk4qIiAi99957l7S///77ioiIMBARAAAAUPCtWrVKHTp0UHh4uGw2m7799lun/ZZlady4cQoPD5ePj4+aN2+unTt3Oh2TlpamQYMGqWTJkipWrJg6duyoo0ePuhyL8aRi6tSpevfdd1WrVi317dtXffv2Va1atfTOO+9o6tSppsMDAABAEWNZ5jZXnDt3TnXr1tX06dMvu3/y5MmaMmWKpk+frvXr1ys0NFRt2rTR2bNnHccMGTJECxYs0Lx587R69WolJyfr/vvvd3myJOPrVNx7773at2+fZsyYod27d8uyLHXq1En9+/enUgEAAABcQfv27dW+ffvL7rMsS9OmTdOYMWPUpUsXSdLHH3+s0qVL6/PPP9dTTz2lxMREffjhh/rkk0/UunVrSdKnn36qiIgI/fLLL2rXrl2uYzFeqZCk6OhoxcTEKDY2VtOnT9drr72mFStWaPXq1aZDAwAAQBGTbZnb0tLSlJSU5LSlpaW5/Byio6MVFxentm3bOtrsdruaNWumNWvWSJI2btyojIwMp2PCw8NVq1YtxzG5ZTyp+Prrr9WuXTv5+vpq8+bNjhft7NmzmjBhguHoAAAAgPwTFRWlwMBAp+1allmIi4uTJJUuXdqpvXTp0o59cXFx8vLyUokSJa54TG4ZTypeffVVvffee5o5c6Y8PT0d7U2bNtWmTZsMRgYAAADkr1GjRikxMdFpGzVq1DVf7+8LTluWddVFqHNzzN8ZTyr27t2ru++++5L2gIAAJSQk5H9AAAAAKNJMDtS22+0KCAhw2ux2u8vPITQ0VJIuqTjEx8c7qhehoaFKT0/XmTNnrnhMbhlPKsLCwrR///5L2levXq2KFSsaiAgAAAAo3CpUqKDQ0FAtWbLE0Zaenq6VK1eqadOmkqQGDRrI09PT6ZjY2Fjt2LHDcUxuGZ/96amnntKzzz6r2bNny2az6fjx41q7dq1GjBihl156yXR4AAAAKGKsbBfndr2uct/tKDk52enL+ejoaG3ZskVBQUEqV66chgwZogkTJqhKlSqqUqWKJkyYIF9fX/Xo0UOSFBgYqD59+mj48OEKDg5WUFCQRowYodq1aztmg8ot40nFyJEjlZiYqBYtWuj8+fO6++67ZbfbNWLECA0cONB0eAAAAECBtGHDBrVo0cLxeNiwYZKknj17as6cORo5cqRSU1M1YMAAnTlzRo0aNdLixYvl7+/vOGfq1Kny8PBQ165dlZqaqlatWmnOnDlyd3d3KRabZbm6zMaNkZKSol27dik7O1s1a9aUn5/fNV/rzg4rr2NkAABTRi160nQIyEcT751lOgTko1//e5fpEK7o9W+yjd17RBfjoxOuifFKxUW+vr5q2LCh6TAAAABQxBnt/VRIFc5UCAAAAECBUWAqFQAAAEBBUDAGBxQuVCoAAAAA5AmVCgAAACCHbAZVuIxKBQAAAIA8IakAAAAAkCd0fwIAAAByYKC266hUAAAAAMgTKhUAAABADlQqXEelAgAAAECekFQAAAAAyBO6PwEAAAA5ZNP/yWVUKgAAAADkCZUKAAAAIAcr23QEhQ+VCgAAAAB5QqUCAAAAyMFiTIXLqFQAAAAAyBOSCgAAAAB5QvcnAAAAIIdsBmq7jEoFAAAAgDyhUgEAAADkwEBt11GpAAAAAJAnJBUAAAAA8oTuTwAAAEAO2fR+chmVCgAAAAB5clNWKuzFfEyHgHyUnppmOgTkI4t5/oqUiffOMh0C8tGrfw4yHQLy1RbTAVyRRanCZVQqAAAAAOTJTVmpAAAAAK4VM8q6jkoFAAAAgDwhqQAAAACQJ3R/AgAAAHLIZqC2y6hUAAAAAMgTKhUAAABADhYjtV1GpQIAAABAnpBUAAAAAMgTuj8BAAAAOVjZpiMofKhUAAAAAMgTKhUAAABADtkM1HYZlQoAAAAAeUKlAgAAAMiBKWVdR6UCAAAAQJ6QVAAAAADIE7o/AQAAADlkZ9P9yVVUKgAAAADkCZUKAAAAIAfGabuOSgUAAACAPCGpAAAAAJAndH8CAAAAcrAYqO0yKhUAAAAA8oRKBQAAAJBDNiO1XWa8UjFu3DgdOnTIdBgAAAAArpHxpGLhwoWqVKmSWrVqpc8//1znz583HRIAAACKMCvbMrYVVsaTio0bN2rTpk2qU6eOhg4dqrCwMD399NNav3696dAAAAAA5ILxpEKS6tSpo6lTp+rYsWOaPXu2jh07pjvuuEO1a9fWm2++qcTERNMhAgAAALiCApFUXJSdna309HSlpaXJsiwFBQVpxowZioiI0Pz5802HBwAAgCKA7k+uKxBJxcaNGzVw4ECFhYVp6NChql+/vnbv3q2VK1dqz549Gjt2rAYPHmw6TAAAAACXYXxK2Tp16mj37t1q27atPvzwQ3Xo0EHu7u5Oxzz++ON67rnnDEUIAACAoqQQFwyMMZ5UPPzww+rdu7fKlClzxWNKlSql7OzsfIwKAAAAQG4ZTypefPFF0yEAAAAAyAPjScWwYcMu226z2eTt7a3KlSurU6dOCgoKyufIAAAAUBQV5gHTphhPKjZv3qxNmzYpKytL1apVk2VZ2rdvn9zd3VW9enW9++67Gj58uFavXq2aNWuaDhcAAADA3xif/alTp05q3bq1jh8/7lgI79ixY2rTpo0eeeQRHTt2THfffbeGDh1qOlQAAAAUAZZlGdsKK+NJxX/+8x+98sorCggIcLQFBARo3Lhxmjx5snx9ffXSSy9p48aNBqMEAAAAcCXGk4rExETFx8df0n7ixAklJSVJkooXL6709PT8Dg0AAABALhgfU9GpUyf17t1bb7zxhm677TbZbDb98ccfGjFihDp37ixJ+uOPP1S1alWzgQIAAKBIyGagtsuMJxXvv/++hg4dqu7duyszM1OS5OHhoZ49e2rq1KmSpOrVq2vWrFkmwwQAAABwBca7P/n5+WnmzJk6deqUYyaoU6dO6YMPPlCxYsUkSfXq1VO9evXMBgoAAIAiobAM1B43bpxsNpvTFhoa6vQ8xo0bp/DwcPn4+Kh58+bauXPn9X65JBWApOIiPz8/BQUFqWTJkvLz8zMdDgAAAFDg3XLLLYqNjXVs27dvd+ybPHmypkyZounTp2v9+vUKDQ1VmzZtdPbs2eseh/GkIjs7Wy+//LICAwMVGRmpcuXKqXjx4nrllVeUnZ1tOjwAAAAUMVa2ZWxzlYeHh0JDQx1bqVKlLjwHy9K0adM0ZswYdenSRbVq1dLHH3+slJQUff7559f7JTOfVIwZM0bTp0/XxIkTHd2fJkyYoLffflsvvvii6fAAAACAfJOWlqakpCSnLS0t7YrH79u3T+Hh4apQoYK6d++ugwcPSpKio6MVFxentm3bOo612+1q1qyZ1qxZc93jNp5UfPzxx5o1a5aefvpp1alTR3Xr1tWAAQM0c+ZMzZkzx3R4AAAAQL6JiopSYGCg0xYVFXXZYxs1aqS5c+fq559/1syZMxUXF6emTZvq1KlTiouLkySVLl3a6ZzSpUs79l1Pxmd/On36tKpXr35Je/Xq1XX69GkDEQEAAKAou5ZuSNfLqFGjNGzYMKc2u91+2WPbt2/v+Hft2rXVpEkTVapUSR9//LEaN24sSbLZbE7nWJZ1Sdv1YLxSUbduXU2fPv2S9unTp6tu3boGIgIAAADMsNvtCggIcNqulFT8XbFixVS7dm3t27fPMQvU36sS8fHxl1QvrgfjlYrJkyfrvvvu0y+//KImTZrIZrNpzZo1OnLkiH788UfT4QEAAKCIyXZxateCIi0tTbt379Zdd92lChUqKDQ0VEuWLFH9+vUlSenp6Vq5cqUmTZp03e9tvFLRrFkz/fnnn3rggQeUkJCg06dPq0uXLtq7d6/uuusu0+EBAAAABdKIESO0cuVKRUdH6/fff9dDDz2kpKQk9ezZUzabTUOGDNGECRO0YMEC7dixQ7169ZKvr6969Ohx3WMxXqmQpPDwcL322mumwwAAAAAKjaNHj+qRRx7RyZMnVapUKTVu3Fjr1q1TZGSkJGnkyJFKTU3VgAEDdObMGTVq1EiLFy+Wv7//dY/FSFKxbdu2XB9bp06dGxgJAAAA4MzkQG1XzJs37x/322w2jRs3TuPGjbvhsRhJKurVqyebzXbVpchtNpuysrLyKSoAAAAA18JIUhEdHW3itgAAAMBVXe2Lb1zKSFJxsZ8XAAAAgMKvQAzUPnDggKZNm6bdu3fLZrOpRo0aevbZZ1WpUiXToQEAAKCIyS4kYyoKEuNJxc8//6yOHTuqXr16uuOOO2RZltasWaNbbrlFCxcuVJs2bUyHWKDUru6vbh1CVaVCMZUM8tJLr/+p3zYkOB3z+ENldF/LUvL389Du/cl6a/YhHTqaaiZgXFed7wlT5/ZhCg25sAhO9OEUzZl/WL9vOmM4MtwIdW8JVI8uEapWyU8lg+0a9doO/brulOmwcIPw+b55hHV/WOHdH5Z3mXBJUsr+Azr07gc6/etvkiQ3Xx9VHPasSrZqIY/igTp/7LiOffqFYuf9n+MaVcb9WyWaNJJXSCllpaQoafNWHXzjTaVGx5h4SsBVGU8qXnjhBQ0dOlQTJ068pP35558nqfgbH283HTiUokUrTmr88CqX7O/eMUwP3RuqyTMO6mjsef2rS7gmj66mXsO2KfV8toGIcT3Fn0rTe3OjdSz2vCTpnpYhihpdU72HblbMkRTD0eF68/F21/7oZP3wS5wmjL7FdDi4wfh83zzS4/5S9JS3lHr4sCSpdKeOumX6NG18sLtS9h9Q5ReeU/HbG2r3yDE6f+y4gu5ooiovjVJ6/AmdWrZCkpS8c7fiv/9R54/HybN4gCKf6a86s2bo9zb3Sdn8PkfBY3zxu927d6tPnz6XtPfu3Vu7du0yEFHB9seWRH305TGtXn/5b666tC+tz789rtXrzyjmaKomvXtQ3nY3tbojOJ8jxY2wZv1prdt4RkeOp+rI8VTN/PSQUs9n6ZZq13++aZi3buNpzfw0RqvWnjQdCvIBn++bx6kVq3R61WqlxhxWasxhxbw5XVkpKQqoW1uSFFCvjuL+u1CJ6zco7fhxxf7f10re+6f8a9V0XCP2/75W4oZNSjt+XMm79ijmzXfkHR7mqH7gxrKyLWNbYWU8qShVqpS2bNlySfuWLVsUEhKS/wEVYmEhdgWX8NKGbYmOtoxMS1t3n9UtVfmldLNxc5Na3VVK3t7u2rn3rOlwAFxHfL5vIm5uKnVvO7n7+ihpy4V1uhI3blZwi+by+v9/5xS/vaF8ykfq9Oo1l7+Ej7dCu3RS6pGjSouLy6/IAZcY7/7Ur18/Pfnkkzp48KCaNm0qm82m1atXa9KkSRo+fPhVz09LS1NaWppTW3ZWutzcvW5UyAVWieKekqQziRlO7WcSM1S6pN1ESLgBKkb6asakevLyclNqapbGRO2iawRwk+DzffMoVqWy6n8xV252L2WlpGrnoGFKOXBQkrR/wiRVfXmsmqxcrOyMDMmytPfF8UratMXpGuGPdFXF4UPkXsxX5w4c1LY+/WVlZBp4NkUPU8q6znhS8eKLL8rf319vvPGGRo0aJUkKDw/XuHHjNHjw4KueHxUVpfHjxzu1lb+lryrW6ndD4i0M/v45sIkPx83k8LFU9R6ySX5+HmrepKTGPFtNg8Zs4w8P4CbA5/vmkRITow1dusnD31+l2rZStaiXtfXxvko5cFBl/tVDAXVra8fTg3X+eKwCG96qKi+NVvqJk0pY+7vjGn8t/FFn1qyTV6mSKvvE46o5dbI29+glKz3d4DMDLs949yebzaahQ4fq6NGjSkxMVGJioo4ePapnn31WNpvtquePGjXKcd7FrXyNnvkQecFzJuFChSLo/1csLioe6KmERL7ZuFlkZlo6Fndee/cn6/1PYrQ/JlkP3U8fW+BmwOf75mFlZOr84SNK3rlL0VPf1rm9f6rMYz3kZrerwpBBOjDpDZ1asUrn/tyn45/P14mfflbEE487XSMrOVmphw4rccMm7RoyQr4VKqhk65aGnhHwz4xXKnLy93e937/dbpfd7ty1pyh2fZKk2Pg0nTqTrga1A7Q/5sK3Wh7uNtWt4a+Znx8xHB1uFJts8vI0/v0AgBuAz/fNxCY3Ly/ZPDzk5uV5yQxOVlb2hcE0/3wJuXkVzb9x8pvFDFsuM55U/PXXXxoxYoSWLl2q+Pj4S7rpZGVlGYqsYPK2u6lMqLfjcWiIXZUifXU2OVPxp9L1zU9/qUfncB2NS9Ox2PPq8UC4zqdla+lvzG1/M3jyX5Fat+mM4k+mydfHXa3uKqV6tQI1YvwO06HhBvDxdlOZMB/H47DS3qpcoZjOJmfqrxNp/3AmCiM+3zePCkMG6fSvq3U+9i95FPNVqXvvUfHbG2r7k88o69w5JfyxQRWfG6qs82lKO35cgbc1VOlO9+vApDckSd5ly6hU+3Y689taZZw5I3vpEEX0eULZaWk6vepXw88OuDzjSUWvXr10+PBhvfjiiwoLC8tVl6eirFqlYpryUg3H4wGPR0qSfl55QpNnRGved7Hy8nLTs70j5V/swuJ3z0/YyxoVN4kSxb307yHVFBzkpXPnMnXg0DmNGL9DG7YmmA4NN0D1yv56O6qe4/HgvpUlST8ujdOEaXsNRYUbhc/3zcOzZJCqT3pNXqVKKvNsss79+ae2P/mMzqxZJ0naNfx5VRw6WDX+M0EegQFKOx6rmGnTHYvfZaelK7DhrSr7+KPyCAhQ+qlTStywSZsf6amM0yyGmB9YUdt1NsvwCF5/f3/9+uuvqlev3nW7Zqvuf1y3a6HgS0/lG9uihJJ00WK7WncQ3FRe/XOQ6RCQj5rt3mI6hCvqNuKQsXvPfz3S2L3zwnilIiIigpmJAAAAUGDwt6nrjH8FNG3aNL3wwguKiYkxHQoAAACAa2C8UtGtWzelpKSoUqVK8vX1laen83Sop0+fNhQZAAAAgNwwnlRMmzbNdAgAAACAg8VAbZcZTyp69iyaC9UBAAAANwvjSYUkZWdna//+/YqPj1f232Z2ufvuuw1FBQAAgKKISoXrjCcV69atU48ePXTo0KFLRtrbbDYWvwMAAAAKOONJRf/+/dWwYUP98MMPLH4HAAAAFELGk4p9+/bpq6++UuXKlU2HAgAAACjbYqFVVxlfp6JRo0bav3+/6TAAAAAAXCMjlYpt27Y5/j1o0CANHz5ccXFxql279iXrVNSpUye/wwMAAEARxkBt1xlJKurVqyebzeY0MLt3796Of1/cx0BtAAAAoOAzklRER0ebuC0AAABwVVQqXGckqYiMjDRxWwAAAAA3gPGB2lFRUZo9e/Yl7bNnz9akSZMMRAQAAADAFcaTivfff1/Vq1e/pP2WW27Re++9ZyAiAAAAFGWWZRnbCivjSUVcXJzCwsIuaS9VqpRiY2MNRAQAAADAFcYXv4uIiNBvv/2mChUqOLX/9ttvCg8PNxQVAAAAiqrsbBa/c5XxpKJv374aMmSIMjIy1LJlS0nS0qVLNXLkSA0fPtxwdAAAAACuxnhSMXLkSJ0+fVoDBgxQenq6JMnb21vPP/+8Ro0aZTg6AAAAAFdjPKmw2WyaNGmSXnzxRe3evVs+Pj6qUqWK7Ha76dAAAABQBLFOheuMD9S+KC4uTqdPn1alSpVkt9sL9eh3AAAAoCgxXqk4deqUunbtquXLl8tms2nfvn2qWLGi+vbtq+LFi+uNN94wHSIAAACKEMtioLarjFcqhg4dKk9PTx0+fFi+vr6O9m7dumnRokUGIwMAAACQG8YrFYsXL9bPP/+ssmXLOrVXqVJFhw4dMhQVAAAAiirGVLjOeKXi3LlzThWKi06ePMlgbQAAAKAQMJ5U3H333Zo7d67jsc1mU3Z2tv7zn/+oRYsWBiMDAAAAkBvGuz/95z//UfPmzbVhwwalp6dr5MiR2rlzp06fPq3ffvvNdHgAAAAoYuj+5DrjlQo/Pz9t2bJFt99+u9q0aaNz586pS5cu2rx5szw9PU2HBwAAAOAqjFcqKlSooNjYWI0fP96p/dSpUypbtqyysrIMRQYAAICiKJspZV1mvFJxpUXukpOT5e3tnc/RAAAAAHCVsUrFsGHDJF0YmP3SSy85zQCVlZWl33//XfXq1TMUHQAAAIDcMpZUbN68WdKFSsX27dvl5eXl2Ofl5aW6detqxIgRpsIDAABAEcVAbdcZSyqWL18uSXriiSf05ptvKiAgwFQoAAAAAPLA+EDtjz76yHQIAAAAgIOVzUBtVxkfqA0AAACgcDNeqQAAAAAKEsZUuI5KBQAAAIA8IakAAAAAkCd0fwIAAABysFhR22VUKgAAAADkCZUKAAAAIIdsBmq7jEoFAAAAgDwhqQAAAACQJ3R/AgAAAHJgRW3XUakAAAAAkCdUKgAAAIAcWFHbdVQqAAAAAOQJSQUAAACAPKH7EwAAAJADK2q7jkoFAAAAgDyhUgEAAADkwEBt11GpAAAAAAqpd999VxUqVJC3t7caNGigX3/91UgcJBUAAABADlZ2trHNFfPnz9eQIUM0ZswYbd68WXfddZfat2+vw4cP36BX5spIKgAAAIBCaMqUKerTp4/69u2rGjVqaNq0aYqIiNCMGTPyPRaSCgAAAKCASEtLU1JSktOWlpZ2yXHp6enauHGj2rZt69Tetm1brVmzJr/CdbgpB2ovnXe76RDyXVpamqKiojRq1CjZ7XbT4eAG4/0uWni/i5ai/X5vMR1Aviva73fBtXphM2P3HjdunMaPH+/UNnbsWI0bN86p7eTJk8rKylLp0qWd2kuXLq24uLgbHeYlbJZlMbz9JpCUlKTAwEAlJiYqICDAdDi4wXi/ixbe76KF97to4f3G36WlpV1SmbDb7ZckncePH1eZMmW0Zs0aNWnSxNH+2muv6ZNPPtGePXvyJd6LbspKBQAAAFAYXS6BuJySJUvK3d39kqpEfHz8JdWL/MCYCgAAAKCQ8fLyUoMGDbRkyRKn9iVLlqhp06b5Hg+VCgAAAKAQGjZsmB577DE1bNhQTZo00QcffKDDhw+rf//++R4LScVNwm63a+zYsQzyKiJ4v4sW3u+ihfe7aOH9Rl5069ZNp06d0ssvv6zY2FjVqlVLP/74oyIjI/M9FgZqAwAAAMgTxlQAAAAAyBOSCgAAAAB5QlIBAAAAIE9IKm6Q5s2ba8iQITfs+jabTd9+++0Nuz6AgqlXr17q3Lmz6TDwNytWrJDNZlNCQoLpUFS+fHlNmzbNdBhFRkxMjGw2m7Zs2XJT3Ae4ViQVhVRsbKzat29vOgwUAuPGjVO9evVMh1HoXe/X8Vq/eHjzzTc1Z86c6xbHjVSQ/tC+Gc2ZM0fFixe/pH39+vV68skn8z+gQuJGf+kHFFVMKVtIhYaGmg4BBZxlWcrKyjIdBv4mIyNDnp6e13x+YGDgdYwGN6NSpUqZDgFAEUSl4gbKzMzUwIEDVbx4cQUHB+vf//63Ls7ge7nuS8WLF3d8A5menq6BAwcqLCxM3t7eKl++vKKiohzH5jz/Ykn0m2++UYsWLeTr66u6detq7dq1Ttdfs2aN7r77bvn4+CgiIkKDBw/WuXPnHPvfffddValSRd7e3ipdurQeeughx76vvvpKtWvXlo+Pj4KDg9W6dWunc5E7V3odL3ZpGT9+vEJCQhQQEKCnnnpK6enpjnPT0tI0ePBghYSEyNvbW3feeafWr1/v2H/xW+Gff/5ZDRs2lN1u1yeffKLx48dr69atstlsstlsjv9j48aNU7ly5WS32xUeHq7Bgwfn98uRryzL0uTJk1WxYkX5+Piobt26+uqrryT977VbunSpGjZsKF9fXzVt2lR79+6VdOEb4Su9jomJiXryyScd71vLli21detWx30vVjhmz56tihUrym63q2fPnlq5cqXefPNNx/ViYmKUlZWlPn36qEKFCvLx8VG1atX05ptvOj2Pv3d/at68uQYPHqyRI0cqKChIoaGhGjdunNM5NptN77//vu6//375+vqqRo0aWrt2rfbv36/mzZurWLFiatKkiQ4cOOB03sKFC9WgQQN5e3urYsWKGj9+vDIzM52uO2vWLD3wwAPy9fVVlSpV9N1330m68HOpRYsWkqQSJUrIZrOpV69e1/z+5bd/+v8iST/++KOqVq0qHx8ftWjRQjExMU7nX66yNW3aNJUvX96pbfbs2brllltkt9sVFhamgQMHOvZNmTJFtWvXVrFixRQREaEBAwYoOTlZ0oX/s0888YQSExMd/4cuvu9/7/50+PBhderUSX5+fgoICFDXrl31119/XRLrJ598ovLlyyswMFDdu3fX2bNnr/0FLKB69ep12c/erl27dO+998rPz0+lS5fWY489ppMnTzrOy87O1qRJk1S5cmXZ7XaVK1dOr732mtO1Dx48eMXfwRerSj///LNq1KghPz8/3XPPPYqNjXW6x8svv6yyZcvKbrerXr16WrRo0T8+n5UrV+r22293/P954YUXnD6jZ8+e1aOPPqpixYopLCxMU6dOdarUvPzyy6pdu/Yl123QoIFeeukll15bQBZuiGbNmll+fn7Ws88+a+3Zs8f69NNPLV9fX+uDDz6wLMuyJFkLFixwOicwMND66KOPLMuyrP/85z9WRESEtWrVKismJsb69ddfrc8//9xxbM7zo6OjLUlW9erVre+//97au3ev9dBDD1mRkZFWRkaGZVmWtW3bNsvPz8+aOnWq9eeff1q//fabVb9+fatXr16WZVnW+vXrLXd3d+vzzz+3YmJirE2bNllvvvmmZVmWdfz4ccvDw8OaMmWKFR0dbW3bts165513rLNnz97AV/Dm80+vY8+ePS0/Pz+rW7du1o4dO6zvv//eKlWqlDV69GjH+YMHD7bCw8OtH3/80dq5c6fVs2dPq0SJEtapU6csy7Ks5cuXW5KsOnXqWIsXL7b2799vHT161Bo+fLh1yy23WLGxsVZsbKyVkpJi/d///Z8VEBBg/fjjj9ahQ4es33//3fF/82Y1evRoq3r16taiRYusAwcOWB999JFlt9utFStWOF67Ro0aWStWrLB27txp3XXXXVbTpk0ty7KslJSUy76O2dnZ1h133GF16NDBWr9+vfXnn39aw4cPt4KDgx3vy9ixY61ixYpZ7dq1szZt2mRt3brVSkhIsJo0aWL169fPcb3MzEwrPT3deumll6w//vjDOnjwoOPnxvz58x3Po2fPnlanTp0cj5s1a2YFBARY48aNs/7880/r448/tmw2m7V48WLHMZKsMmXKWPPnz7f27t1rde7c2SpfvrzVsmVLa9GiRdauXbusxo0bW/fcc4/jnEWLFlkBAQHWnDlzrAMHDliLFy+2ypcvb40bN87pumXLlrU+//xza9++fdbgwYMtPz8/69SpU1ZmZqb19ddfW5KsvXv3WrGxsVZCQsKNenuvu3/6/3L48GHLbrc7/XwvXbq0Jck6c+aMZVkX3ve6des6XXPq1KlWZGSk4/G7775reXt7W9OmTbP27t1r/fHHH9bUqVOdjl+2bJl18OBBa+nSpVa1atWsp59+2rIsy0pLS7OmTZtmBQQEOP4PXfyZHBkZ6bhOdna2Vb9+fevOO++0NmzYYK1bt8669dZbrWbNmjnuM3bsWMvPz8/q0qWLtX37dmvVqlVWaGio08+fm8XlPntHjx61SpYsaY0aNcravXu3tWnTJqtNmzZWixYtHOeNHDnSKlGihDVnzhxr//791q+//mrNnDnTsqzc/Q7+6KOPLE9PT6t169bW+vXrrY0bN1o1atSwevTo4bjHlClTrICAAOuLL76w9uzZY40cOdLy9PS0/vzzT6f7bN682bIsyzp69Kjl6+trDRgwwNq9e7e1YMECq2TJktbYsWMd1+zbt68VGRlp/fLLL9b27dutBx54wPL397eeffZZy7Is68iRI5abm5v1xx9/OM7ZunWrZbPZrAMHDtyItwA3MZKKG6RZs2ZWjRo1rOzsbEfb888/b9WoUcOyrKsnFYMGDbJatmzpdH5Ol0sqZs2a5di/c+dOS5K1e/duy7Is67HHHrOefPJJp2v8+uuvlpubm5Wammp9/fXXVkBAgJWUlHTJvTZu3GhJsmJiYlx6DeDsn17Hnj17WkFBQda5c+ccbTNmzLD8/PysrKwsKzk52fL09LQ+++wzx/709HQrPDzcmjx5smVZ/0sqvv32W6drX+6PmzfeeMOqWrWqlZ6efh2fYcGVnJxseXt7W2vWrHFq79Onj/XII484XrtffvnFse+HH36wJFmpqamWZV3+dVy6dKkVEBBgnT9/3qm9UqVK1vvvv+84z9PT04qPj3c6plmzZo5f7P9kwIAB1oMPPuh4fLmk4s4773Q657bbbrOef/55x2P9v/buPaqm9P8D+Puk0+l0zqmU7lISJcstpISMShi3cZkMa9SoSDQuI/FlOq4z45JbjEujLI0xK2NlLSZELgtNrkVLKZeQ22TNIEWk8/n9YbV/7Tq6SGM0n9dalvbZz36eZz9n72fvT/t5dgAtWLBAWP7jjz8IAG3btk34bNeuXaSvry8s9+nTh7777jtRvgkJCWRlZfXWfIuLi0kikdCBAweI6P+PyYob7Y9FbcfLvHnztPbv9Q0qrK2taf78+XWuV2JiIpmamgrL8fHxZGRkVC1d5aAiJSWFmjVrRnfu3BHWV1wfKm4k1Wo1GRgYiPr/iIgI6tmzZ53r9jGpeu59++23NGDAAFGagoICISAuKioimUwmBBFV1eUaHB8fTwDo+vXrQpqNGzeShYWFsGxtbU3Lli0T5d2jRw8KCwsTlVMRVPzvf/8jJycn0XG4ceNG4bpRVFREUqmUdu/eLax/8uQJGRgYiPZ/0KBBQrBKRDRjxgzq16+f1n1lrCY8/KkRubu7QyKRCMseHh64du1anca5BwYGIjMzE05OTvj666+RkpJS6zadOnUSfraysgIAFBYWAgAuXLiA7du3Q6lUCv/8/Pyg0WiQn58PX19f2NnZwcHBAV9++SV27tyJ58+fAwA6d+4Mb29vdOzYEWPGjEFsbCweP35cr7Zgtbdj586dYWBgICx7eHiguLgYBQUFuHHjBsrKyuDp6Smsl0qlcHNzQ05Ojqic7t2711qXMWPG4MWLF3BwcEBISAiSkpJEj8ybmuzsbJSWlsLX11d0DuzYsUM05Kemc0ibCxcuoLi4GKampqJ88/PzRfna2dnVeZz75s2b0b17d5iZmUGpVCI2NhZ37typcZvK9a6oe9V6V05jYWEBAKJhDxYWFigtLUVRUZGwb4sXLxbtV0hICB48eCD0DVXzVSgUUKlUNbbZx6C24yUnJ0dr/14fhYWFuH//Pry9vd+a5tixY/D19YWNjQ1UKhUmTJiAv/76q15DT3NycmBrawtbW1vhMxcXFxgbG4v6Dnt7e6hUKmFZ2zHUVF24cAHHjh0TfdfOzs4AIHzfL1++rPG7AmrvPwwMDNCmTRtRmor1RUVFuH//vqiPBwBPT89qfXyFnJwceHh4iI5DT09PFBcX4+7du7h58ybKysrg5uYmrDcyMoKTk5Mon5CQEOzatQulpaUoKyvDzp07MXHixBr3lTFteKL2ByKRSIT5FRXKysqEn11dXZGfn48DBw7gyJEj+Pzzz+Hj4yMa01tV5cmfFZ2MRqMR/p88ebLWcfOtWrWCnp4eLl68iOPHjyMlJQVRUVFYuHAhzp07B2NjYxw+fBhpaWlISUlBTEwM5s+fjzNnzqB169YNaof/kmbNmr21HWtS+VipfPEA3oz7rvqZQqGotS62trbIzc3F4cOHceTIEYSFhWHlypU4ceJEgyYR/1tVnAe///47bGxsROtkMpkQANR0Dr0tXysrKxw/frzauspv5anLdwIAiYmJmDlzJqKjo+Hh4QGVSoWVK1fWeoxU/c4kEkm1emvbt9r6jEWLFmHkyJHVytPX169X2R+b2o6X8PDwWvPQ0dGpsY+Xy+U1bn/79m0MHjwYoaGhWLJkCUxMTHDq1CkEBQWJ8qmNtj5C2+dN8XusK41Gg6FDh2L58uXV1llZWeHmzZt1yqe2/kNbG1c9RurSx9e0rvK1oqbrRmVDhw6FTCZDUlISZDIZXr58iVGjRmnfScZqwEFFI0pPT6+23LZtWzRr1gxmZmaiCVrXrl0T/fYPAAwNDeHv7w9/f3+MHj0aAwcOxN9//w0TE5N618XV1RVXrlyBo6PjW9Po6urCx8cHPj4+UKvVMDY2xtGjRzFy5EhIJBJ4enrC09MTUVFRsLOzQ1JSEmbNmlXvuvyXva0dAeDSpUt48eKFcLORnp4OpVKJli1bwtTUFHp6ejh16hTGjRsH4M0Nyvnz52t9NaKenp7Wp2NyuRzDhg3DsGHDMHXqVDg7OyMrKwuurq7vd6f/BVxcXCCTyXDnzh14eXlVW191grI22trR1dUVDx8+hK6ubrUJuO+S38mTJ9GrVy+EhYXVq26NwdXVFbm5uTX2GbXR09MDgI/uLWS1HS8uLi7VXrRRtb83MzPDw4cPRTd+lf++gEqlgr29PVJTU4UJ7ZWdP38er1+/RnR0NHR03gwqSExMFKV527ldta537txBQUGB8LQiOzsbT58+Rfv27Wvctqmq2m6urq7Ys2cP7O3toatb/baobdu2kMvlSE1NRXBwcKPUydDQENbW1jh16hT69u0rfJ6WliZ60lCZi4sL9uzZIzrG0tLSoFKpYGNjA2NjY0ilUpw9e1b47ouKinDt2jXRca2rq4uAgADEx8dDJpNh7NixoqfmjNUVBxWNqKCgALNmzcLkyZNx8eJFxMTEIDo6GgDQv39/bNiwAe7u7tBoNIiMjBT9FmPNmjWwsrJCly5doKOjg927d8PS0lLrO8nrIjIyEu7u7pg6dSpCQkKgUCiQk5ODw4cPIyYmBvv378fNmzfRt29fNG/eHMnJydBoNHBycsKZM2eQmpqKAQMGwNzcHGfOnMGjR4/+sxekd1VTO16+fBmvXr1CUFAQFixYgNu3b0OtVmPatGnQ0dGBQqHAlClTEBERARMTE7Rq1QorVqzA8+fPERQUVGO59vb2yM/PR2ZmJlq2bAmVSoVdu3ahvLwcPXv2hIGBARISEiCXy2FnZ/cPtcY/S6VSYfbs2Zg5cyY0Gg169+6NoqIipKWlQalU1mm/tbWjj48PPDw8MGLECCxfvhxOTk64f/8+kpOTMWLEiBqHotnb2+PMmTO4desWlEolTExM4OjoiB07duDQoUNo3bo1EhIScO7cuQ/yRDAqKgpDhgyBra0txowZAx0dHVy+fBlZWVlYunRpnfKws7ODRCLB/v37MXjwYMjlciiVykauecPVdryEhoYiOjpa6N8rhpdW1q9fPzx69AgrVqzA6NGjcfDgQRw4cACGhoZCmoULFyI0NBTm5uYYNGgQnj17htOnTyM8PBxt2rTB69evERMTg6FDh+L06dPYvHmzqAx7e3sUFxcjNTVVGD5Z9WbQx8cHnTp1wvjx47F27Vq8fv0aYWFh8PLyqtNQyaao6rk3depUxMbG4osvvkBERARatGiB69ev49dff0VsbCz09fURGRmJOXPmQE9PD56ennj06BGuXLlSa/9bHxEREVCr1WjTpg26dOmC+Ph4ZGZmYufOnVrTh4WFYe3atQgPD8e0adOQm5sLtVqNWbNmQUdHByqVCgEBAcJ1w9zcHGq1Gjo6OtWeXgQHBwvX9NOnT7+3fWL/MR9iIsd/gZeXF4WFhVFoaCgZGhpS8+bNae7cucKEqnv37tGAAQNIoVBQ27ZtKTk5WTRRe+vWrdSlSxdSKBRkaGhI3t7edPHiRSF/aJmoXTF5i4jo8ePHBICOHTsmfHb27Fny9fUlpVJJCoWCOnXqJEwKO3nyJHl5eVHz5s1JLpdTp06dhDfOZGdnk5+fH5mZmZFMJqN27dpRTExM4zVeE1VTO1ZMvo2KiiJTU1NSKpUUHBwsmgD84sULCg8PpxYtWpBMJiNPT0/RGzveNim2tLSURo0aRcbGxgSA4uPjKSkpiXr27EmGhoakUCjI3d1dNEm5KdJoNLRu3TpycnIiqVRKZmZm5OfnRydOnNDadhkZGQSA8vPziUh7OxIRFRUVUXh4OFlbW5NUKiVbW1saP368MDFW24RdIqLc3Fxyd3cnuVwulFNaWkqBgYFkZGRExsbGNGXKFJo7d65oe20TtatO+B4+fDgFBAQIy5X7CyLtfYa2Njh48CD16tWL5HI5GRoakpubm+gtYVXzJRK/cIKIaPHixWRpaUkSiURUp3+7mo4XIqJ9+/aRo6MjyWQy6tOnD8XFxVVrv02bNpGtrS0pFAqaMGECLVu2TDRRm4ho8+bNQhlWVlYUHh4urFu9ejVZWVmRXC4nPz8/2rFjR7UyQkNDydTUlAAIb/2pPFGbiOj27ds0bNgwUigUpFKpaMyYMfTw4UNhfV0mlTcl2s69vLw8+uyzz8jY2Jjkcjk5OzvTjBkzhGt2eXk5LV26lOzs7EgqlVKrVq2EFxnU5RqsbVJ9UlISVb4NKy8vp0WLFpGNjQ1JpVLq3Lmz8NKDt5Vz/Phx6tGjB+np6ZGlpSVFRkYKb5wietM/jRs3jgwMDMjS0pJWr15Nbm5uNHfu3Grt0qdPH3JxcXnXZmWMJERVBtcxxv5xgYGBePLkSbUhFYwxxtj7UlJSAhsbG0RHR4ueshARnJ2dMXnyZB7WzN4ZD39ijDHGGGuCMjIycPXqVbi5ueHp06dYvHgxAGD48OFCmsLCQiQkJODevXv46quvPlRVWRPAQQVjjDHGWBO1atUq5ObmQk9PD926dcPJkyfRokULYb2FhQVatGiBrVu3onnz5h+wpuxjx8OfGGOMMcYYYw3Cf/yOMcYYY4wx1iAcVDDGGGOMMcYahIMKxhhjjDHGWINwUMEYY4wxxhhrEA4qGGOMMcYYYw3CQQVjjP3LLFy4EF26dBGWAwMDMWLEiH+8Hrdu3YJEIkFmZuY/XjZjjLGPCwcVjDFWR4GBgZBIJJBIJJBKpXBwcMDs2bNRUlLSqOWuW7cO27dvr1NaDgQYY4x9CPzH7xhjrB4GDhyI+Ph4lJWV4eTJkwgODkZJSQk2bdokSldWVgapVPpeyjQyMnov+TDGGGONhZ9UMMZYPchkMlhaWsLW1hbjxo3D+PHjsXfvXmHIUlxcHBwcHCCTyUBEePr0KSZNmgRzc3MYGhqif//+uHTpkijPH374ARYWFlCpVAgKCkJpaalofdXhTxqNBsuXL4ejoyNkMhlatWqFZcuWAQBat24NAOjatSskEgn69esnbBcfH4/27dtDX18fzs7O+PHHH0XlnD17Fl27doW+vj66d++OjIyM99hyjDHGmjJ+UsEYYw0gl8tRVlYGALh+/ToSExOxZ88eNGvWDADw6aefwsTEBMnJyTAyMsKWLVvg7e2NvLw8mJiYIDExEWq1Ghs3bkSfPn2QkJCA9evXw8HB4a1lzps3D7GxsVizZg169+6NBw8e4OrVqwDeBAZubm44cuQIOnToAD09PQBAbGws1Go1NmzYgK5duyIjIwMhISFQKBQICAhASUkJhgwZgv79++Pnn39Gfn4+pk+f3sitxxhjrKngoIIxxt7R2bNn8csvv8Db2xsA8OrVKyQkJMDMzAwAcPToUWRlZaGwsBAymQwAsGrVKuzduxe//fYbJk2ahLVr12LixIkIDg4GACxduhRHjhyp9rSiwrNnz7Bu3Tps2LABAQEBAIA2bdqgd+/eACCUbWpqCktLS2G7JUuWIDo6GiNHjgTw5olGdnY2tmzZgoCAAOzcuRPl5eWIi4uDgYEBOnTogLt372LKlCnvu9kYY4w1QTz8iTHG6mH//v1QKpXQ19eHh4cH+vbti5iYGACAnZ2dcFMPABcuXEBxcTFMTU2hVCqFf/n5+bhx4wYAICcnBx4eHqIyqi5XlpOTg5cvXwqBTF08evQIBQUFCAoKEtVj6dKlonp07twZBgYGdaoHY4wxVhk/qWCMsXr45JNPsGnTJkilUlhbW4smYysUClFajUYDKysrHD9+vFo+xsbG71S+XC6v9zYajQbAmyFQPXv2FK2rGKZFRO9UH8YYYwzgoIIxxupFoVDA0dGxTmldXV3x8OFD6Orqwt7eXmua9u3bIz09HRMmTBA+S09Pf2uebdu2hVwuR2pqqjBkqrKKORTl5eXCZxYWFrCxscHNmzcxfvx4rfm6uLggISEBL168EAKXmurBGGOMVcbDnxhjrJH4+PjAw8MDI0aMwKFDh3Dr1i2kpaVhwYIFOH/+PABg+vTpiIuLQ1xcHPLy8qBWq3HlypW35qmvr4/IyEjMmTMHO3bswI0bN5Ceno5t27YBAMzNzSGXy3Hw4EH8+eefePr0KYA3f1Dv+++/x7p165CXl4esrCzEx8dj9erVAIBx48ZBR0cHQUFByM7ORnJyMlatWtXILcQYY6yp4KCCMcYaiUQiQXJyMvr27YuJEyeiXbt2GDt2LG7dugULCwsAgL+/P6KiohAZGYlu3brh9u3btU6O/vbbb/HNN98gKioK7du3h7+/PwoLCwEAurq6WL9+PbZs2QJra2sMHz4cABAcHIyffvoJ27dvR8eOHeHl5YXt27cLr6BVKpXYt28fsrOz0bVrV8yfPx/Lly9vxNZhjDHWlEiIB9IyxhhjjDHGGoCfVDDGGGOMMcYahIMKxhhjjDHGWINwUMEYY4wxxhhrEA4qGGOMMcYYYw3CQQVjjDHGGGOsQTioYIwxxhhjjDUIBxWMMcYYY4yxBuGggjHGGGOMMdYgHFQwxhhjjDHGGoSDCsYYY4wxxliDcFDBGGOMMcYYa5D/A0mLBEq3dhh1AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#confusion matrix visualization\n", + "\n", + "# Create a confusion matrix\n", + "cm = confusion_matrix(y_test, y_test_pred, labels=category_labels)\n", + "\n", + "# Plot the confusion matrix\n", + "plt.figure(figsize=(10, 8))\n", + "sns.heatmap(cm, annot=True, fmt='d', cmap='coolwarm', xticklabels=category_labels, yticklabels=category_labels)\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('True')\n", + "plt.title('Confusion Matrix')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5def9ed5", + "metadata": {}, + "source": [ + "This confusion matrix visually represents the performance of a classification model in categorizing various topics: business, sports, entertainment, education, and technology. The diagonal values show correct classifications, with Education having the greater correctly classified number and only 4 samples being incorrectly classified( one classified as business and 3 classified as technology)\n", + "\n", + "**solutions to misclassifications:**\n", + "Our confusion matrix visualization suggest there is a confusion between certain categories, which may require better feature engineering or tuning of the model." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "43a36521", + "metadata": {}, + "outputs": [], + "source": [ + "# loading saved model and vectorizer and making predictions on new data\n", + "loaded_model = joblib.load(\"best_model.pkl\")\n", + "loaded_vectorizer = joblib.load(\"vectorizer.pkl\")\n", + "\n", + "def predict_category(headlines, description, content):\n", + " \"\"\"\n", + " Function to predict the category of a news article.\n", + " \"\"\"\n", + " headlines = format_data(headlines)\n", + " description = format_data(description)\n", + " content = format_data(content)\n", + "\n", + " # Vectorize input\n", + " X_new = np.concatenate((\n", + " loaded_vectorizer.transform([headlines]).toarray(),\n", + " loaded_vectorizer.transform([description]).toarray(),\n", + " loaded_vectorizer.transform([content]).toarray()\n", + " ), axis=1)\n", + "\n", + " return loaded_model.predict(X_new)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "4154bdea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "^C\n" + ] + } + ], + "source": [ + "# Run MLflow UI to view the experiment results\n", + "!mlflow ui " + ] + }, + { + "cell_type": "markdown", + "id": "a05af281-606b-47a0-b916-3277cd1c7992", + "metadata": {}, + "source": [ + "

CONCLUSION AND INSIGHTS

" + ] + }, + { + "cell_type": "markdown", + "id": "ecb3bd5b-ab4f-4c3b-99d6-cd17fb23a6f0", + "metadata": {}, + "source": [ + "> To conclude, our team built a comprehensive news categorization pipeline, from preprocessing text to training multiple models and evaluating performance using MLflow. The key steps that were taken were: \n", + "\n", + "**1.** Data Preparation – Combined vectorized text features & split into training, validation, and test sets.\n", + "\n", + "**2.** Model Training & Evaluation – Trained Logistic Regression, Random Forest, Naïve Bayes, and SVM, logging accuracy & metrics in MLflow.\n", + "\n", + "**3.** Best Model Selection – Identified the best-performing model dynamically based on validation accuracy.\n", + "\n", + "**4.** Model Deployment – Saved the best model and vectorizer for future predictions using joblib.\n", + "\n", + "**5.** Results Tracking – MLflow logged parameters, accuracy, and confusion matrices, allowing comparison between models.\n", + "\n", + "**6.** Created a Prediction Function – Built a reusable function to classify new articles dynamically.\n", + "\n", + "**Results from MLflow:**\n", + "The \"Test Accuracy\" showed that the best-performing model wasthe Logistic Regression model\n", + ", which achieved strong accuracy, with performance tracked across all trained models.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Streamlit/mlruns/0/meta.yaml b/Streamlit/mlruns/0/meta.yaml new file mode 100644 index 00000000..90c86f03 --- /dev/null +++ b/Streamlit/mlruns/0/meta.yaml @@ -0,0 +1,6 @@ +artifact_location: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/0 +creation_time: 1746429792088 +experiment_id: '0' +last_update_time: 1746429792088 +lifecycle_stage: active +name: Default diff --git a/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/meta.yaml b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/meta.yaml new file mode 100644 index 00000000..7ea802b2 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/artifacts +end_time: 1746436637371 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 0d7abd2ef2804a57b1754adba66adb00 +run_name: Logistic Regression +run_uuid: 0d7abd2ef2804a57b1754adba66adb00 +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746436635202 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/metrics/accuracy b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/metrics/accuracy new file mode 100644 index 00000000..a9789ecb --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/metrics/accuracy @@ -0,0 +1 @@ +1746436637248 0.9746376811594203 0 diff --git a/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/params/model_name b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/params/model_name new file mode 100644 index 00000000..da45759e --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/params/model_name @@ -0,0 +1 @@ +Logistic Regression \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.runName new file mode 100644 index 00000000..da45759e --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.runName @@ -0,0 +1 @@ +Logistic Regression \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/0d7abd2ef2804a57b1754adba66adb00/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/meta.yaml b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/meta.yaml new file mode 100644 index 00000000..15f7e2b7 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/artifacts +end_time: 1746436662299 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 344892be3f9046c6aac8f2ef793402bf +run_name: Naive Bayes +run_uuid: 344892be3f9046c6aac8f2ef793402bf +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746436661807 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/metrics/accuracy b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/metrics/accuracy new file mode 100644 index 00000000..4b69be84 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/metrics/accuracy @@ -0,0 +1 @@ +1746436662256 0.9692028985507246 0 diff --git a/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/params/model_name b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/params/model_name new file mode 100644 index 00000000..a7fb5317 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/params/model_name @@ -0,0 +1 @@ +Naive Bayes \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.runName new file mode 100644 index 00000000..a7fb5317 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.runName @@ -0,0 +1 @@ +Naive Bayes \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/344892be3f9046c6aac8f2ef793402bf/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/meta.yaml b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/meta.yaml new file mode 100644 index 00000000..2f9226a8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/artifacts +end_time: null +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 439ee85dc07c435993ffeb0c7599c4dc +run_name: traveling-shrike-717 +run_uuid: 439ee85dc07c435993ffeb0c7599c4dc +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746431087881 +status: 1 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/metrics/test_accuracy b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/metrics/test_accuracy new file mode 100644 index 00000000..f458cd6e --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/metrics/test_accuracy @@ -0,0 +1 @@ +1746431087953 0.975 0 diff --git a/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.runName new file mode 100644 index 00000000..44f3d928 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.runName @@ -0,0 +1 @@ +traveling-shrike-717 \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/439ee85dc07c435993ffeb0c7599c4dc/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/MLmodel b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/MLmodel new file mode 100644 index 00000000..0b8c615b --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: Best_model +flavors: + python_function: + env: + conda: conda.yaml + virtualenv: python_env.yaml + loader_module: mlflow.sklearn + model_path: model.pkl + predict_fn: predict + python_version: 3.12.4 + sklearn: + code: null + pickled_model: model.pkl + serialization_format: cloudpickle + sklearn_version: 1.4.2 +mlflow_version: 2.21.3 +model_size_bytes: 73043 +model_uuid: 2d4dd98a11a7402f9a2b6016c555f3de +prompts: null +run_id: 4988088e75f54080af8a8be91668eaf9 +utc_time_created: '2025-05-05 09:17:44.253960' diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/conda.yaml b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/conda.yaml new file mode 100644 index 00000000..3524d362 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/conda.yaml @@ -0,0 +1,14 @@ +channels: +- conda-forge +dependencies: +- python=3.12.4 +- pip<=25.1.1 +- pip: + - mlflow==2.21.3 + - cloudpickle==2.2.1 + - lz4==4.3.2 + - numpy==1.26.4 + - psutil==5.9.0 + - scikit-learn==1.4.2 + - scipy==1.13.1 +name: mlflow-env diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/model.pkl b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/model.pkl new file mode 100644 index 00000000..d1d966d3 Binary files /dev/null and b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/model.pkl differ diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/python_env.yaml b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/python_env.yaml new file mode 100644 index 00000000..61532bd5 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.12.4 +build_dependencies: +- pip==25.1.1 +- setuptools==69.5.1 +- wheel==0.43.0 +dependencies: +- -r requirements.txt diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/requirements.txt b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/requirements.txt new file mode 100644 index 00000000..8c28dd75 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts/Best_model/requirements.txt @@ -0,0 +1,7 @@ +mlflow==2.21.3 +cloudpickle==2.2.1 +lz4==4.3.2 +numpy==1.26.4 +psutil==5.9.0 +scikit-learn==1.4.2 +scipy==1.13.1 \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/meta.yaml b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/meta.yaml new file mode 100644 index 00000000..ea390ff4 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/artifacts +end_time: 1746436692194 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 4988088e75f54080af8a8be91668eaf9 +run_name: thundering-newt-13 +run_uuid: 4988088e75f54080af8a8be91668eaf9 +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746436664146 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.log-model.history b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.log-model.history new file mode 100644 index 00000000..bfe44fd0 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.log-model.history @@ -0,0 +1 @@ +[{"run_id": "4988088e75f54080af8a8be91668eaf9", "artifact_path": "Best_model", "utc_time_created": "2025-05-05 09:17:44.253960", "model_uuid": "2d4dd98a11a7402f9a2b6016c555f3de", "flavors": {"python_function": {"model_path": "model.pkl", "predict_fn": "predict", "loader_module": "mlflow.sklearn", "python_version": "3.12.4", "env": {"conda": "conda.yaml", "virtualenv": "python_env.yaml"}}, "sklearn": {"pickled_model": "model.pkl", "sklearn_version": "1.4.2", "serialization_format": "cloudpickle", "code": null}}}] \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.runName new file mode 100644 index 00000000..236cfc96 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.runName @@ -0,0 +1 @@ +thundering-newt-13 \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4988088e75f54080af8a8be91668eaf9/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/meta.yaml b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/meta.yaml new file mode 100644 index 00000000..1cf8950f --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/artifacts +end_time: 1746436661783 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 4db50b0e36da4b558120acc28f9eca15 +run_name: Support Vector Classifier +run_uuid: 4db50b0e36da4b558120acc28f9eca15 +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746436644324 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/metrics/accuracy b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/metrics/accuracy new file mode 100644 index 00000000..c3a70e09 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/metrics/accuracy @@ -0,0 +1 @@ +1746436661722 0.9746376811594203 0 diff --git a/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/params/model_name b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/params/model_name new file mode 100644 index 00000000..f7ff9246 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/params/model_name @@ -0,0 +1 @@ +Support Vector Classifier \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.runName new file mode 100644 index 00000000..f7ff9246 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.runName @@ -0,0 +1 @@ +Support Vector Classifier \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/4db50b0e36da4b558120acc28f9eca15/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/meta.yaml b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/meta.yaml new file mode 100644 index 00000000..422ec394 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/artifacts +end_time: 1746430991253 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 70a859cda6854f51af32a22c6c4e789e +run_name: Support Vector Classifier +run_uuid: 70a859cda6854f51af32a22c6c4e789e +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746430985792 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/metrics/accuracy b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/metrics/accuracy new file mode 100644 index 00000000..61330512 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/metrics/accuracy @@ -0,0 +1 @@ +1746430991223 0.9746376811594203 0 diff --git a/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/params/model_name b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/params/model_name new file mode 100644 index 00000000..f7ff9246 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/params/model_name @@ -0,0 +1 @@ +Support Vector Classifier \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.runName new file mode 100644 index 00000000..f7ff9246 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.runName @@ -0,0 +1 @@ +Support Vector Classifier \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/70a859cda6854f51af32a22c6c4e789e/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/meta.yaml b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/meta.yaml new file mode 100644 index 00000000..8c0f3a53 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/artifacts +end_time: 1746430985788 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 75114b494eb94019897db9a04fd35abe +run_name: Random Forest +run_uuid: 75114b494eb94019897db9a04fd35abe +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746430983287 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/metrics/accuracy b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/metrics/accuracy new file mode 100644 index 00000000..7aad923d --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/metrics/accuracy @@ -0,0 +1 @@ +1746430985766 0.9637681159420289 0 diff --git a/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/params/model_name b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/params/model_name new file mode 100644 index 00000000..53167014 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/params/model_name @@ -0,0 +1 @@ +Random Forest \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.runName new file mode 100644 index 00000000..53167014 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.runName @@ -0,0 +1 @@ +Random Forest \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/75114b494eb94019897db9a04fd35abe/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/MLmodel b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/MLmodel new file mode 100644 index 00000000..16efd7a9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/MLmodel @@ -0,0 +1,21 @@ +artifact_path: Best_model +flavors: + python_function: + env: + conda: conda.yaml + virtualenv: python_env.yaml + loader_module: mlflow.sklearn + model_path: model.pkl + predict_fn: predict + python_version: 3.12.4 + sklearn: + code: null + pickled_model: model.pkl + serialization_format: cloudpickle + sklearn_version: 1.4.2 +mlflow_version: 2.21.3 +model_size_bytes: 73043 +model_uuid: d8eb0a115ae746eeaa35e70ad006d177 +prompts: null +run_id: 78a22df00e284b7599bc7b9ff30f6e1a +utc_time_created: '2025-05-05 07:44:36.871293' diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/conda.yaml b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/conda.yaml new file mode 100644 index 00000000..3524d362 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/conda.yaml @@ -0,0 +1,14 @@ +channels: +- conda-forge +dependencies: +- python=3.12.4 +- pip<=25.1.1 +- pip: + - mlflow==2.21.3 + - cloudpickle==2.2.1 + - lz4==4.3.2 + - numpy==1.26.4 + - psutil==5.9.0 + - scikit-learn==1.4.2 + - scipy==1.13.1 +name: mlflow-env diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/model.pkl b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/model.pkl new file mode 100644 index 00000000..d1d966d3 Binary files /dev/null and b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/model.pkl differ diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/python_env.yaml b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/python_env.yaml new file mode 100644 index 00000000..61532bd5 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/python_env.yaml @@ -0,0 +1,7 @@ +python: 3.12.4 +build_dependencies: +- pip==25.1.1 +- setuptools==69.5.1 +- wheel==0.43.0 +dependencies: +- -r requirements.txt diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/requirements.txt b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/requirements.txt new file mode 100644 index 00000000..8c28dd75 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts/Best_model/requirements.txt @@ -0,0 +1,7 @@ +mlflow==2.21.3 +cloudpickle==2.2.1 +lz4==4.3.2 +numpy==1.26.4 +psutil==5.9.0 +scikit-learn==1.4.2 +scipy==1.13.1 \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/meta.yaml b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/meta.yaml new file mode 100644 index 00000000..fe0990b8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/artifacts +end_time: 1746431087844 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 78a22df00e284b7599bc7b9ff30f6e1a +run_name: sincere-sow-936 +run_uuid: 78a22df00e284b7599bc7b9ff30f6e1a +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746431076820 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.log-model.history b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.log-model.history new file mode 100644 index 00000000..c4a47e16 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.log-model.history @@ -0,0 +1 @@ +[{"run_id": "78a22df00e284b7599bc7b9ff30f6e1a", "artifact_path": "Best_model", "utc_time_created": "2025-05-05 07:44:36.871293", "model_uuid": "d8eb0a115ae746eeaa35e70ad006d177", "flavors": {"python_function": {"model_path": "model.pkl", "predict_fn": "predict", "loader_module": "mlflow.sklearn", "python_version": "3.12.4", "env": {"conda": "conda.yaml", "virtualenv": "python_env.yaml"}}, "sklearn": {"pickled_model": "model.pkl", "sklearn_version": "1.4.2", "serialization_format": "cloudpickle", "code": null}}}] \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.runName new file mode 100644 index 00000000..48a28efb --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.runName @@ -0,0 +1 @@ +sincere-sow-936 \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/78a22df00e284b7599bc7b9ff30f6e1a/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/meta.yaml b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/meta.yaml new file mode 100644 index 00000000..c84ae481 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/artifacts +end_time: 1746436644293 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 8250554e1c594fa09ff949b797401342 +run_name: Random Forest +run_uuid: 8250554e1c594fa09ff949b797401342 +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746436637410 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/metrics/accuracy b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/metrics/accuracy new file mode 100644 index 00000000..9517393b --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/metrics/accuracy @@ -0,0 +1 @@ +1746436644205 0.9637681159420289 0 diff --git a/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/params/model_name b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/params/model_name new file mode 100644 index 00000000..53167014 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/params/model_name @@ -0,0 +1 @@ +Random Forest \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.runName new file mode 100644 index 00000000..53167014 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.runName @@ -0,0 +1 @@ +Random Forest \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8250554e1c594fa09ff949b797401342/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/meta.yaml b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/meta.yaml new file mode 100644 index 00000000..a80f4cd9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/artifacts +end_time: 1746430983270 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 8a3286bbcc1949e1b0e7a359cd10c2cf +run_name: Logistic Regression +run_uuid: 8a3286bbcc1949e1b0e7a359cd10c2cf +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746430982592 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/metrics/accuracy b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/metrics/accuracy new file mode 100644 index 00000000..300aa6e9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/metrics/accuracy @@ -0,0 +1 @@ +1746430983238 0.9746376811594203 0 diff --git a/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/params/model_name b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/params/model_name new file mode 100644 index 00000000..da45759e --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/params/model_name @@ -0,0 +1 @@ +Logistic Regression \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.runName new file mode 100644 index 00000000..da45759e --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.runName @@ -0,0 +1 @@ +Logistic Regression \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/8a3286bbcc1949e1b0e7a359cd10c2cf/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/meta.yaml b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/meta.yaml new file mode 100644 index 00000000..44148066 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/artifacts +end_time: null +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: 9523c20a3b21442eae9fc67342b934ca +run_name: fearless-frog-226 +run_uuid: 9523c20a3b21442eae9fc67342b934ca +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746436692246 +status: 1 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/metrics/test_accuracy b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/metrics/test_accuracy new file mode 100644 index 00000000..0a5aa067 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/metrics/test_accuracy @@ -0,0 +1 @@ +1746436692345 0.975 0 diff --git a/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.runName new file mode 100644 index 00000000..75157dcc --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.runName @@ -0,0 +1 @@ +fearless-frog-226 \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/9523c20a3b21442eae9fc67342b934ca/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/meta.yaml b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/meta.yaml new file mode 100644 index 00000000..bbe50a41 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/artifacts +end_time: 1746429792909 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: d5d0308b5ae44800bbbfb115974eb266 +run_name: aged-grub-700 +run_uuid: d5d0308b5ae44800bbbfb115974eb266 +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746429792833 +status: 4 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.runName new file mode 100644 index 00000000..818694d7 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.runName @@ -0,0 +1 @@ +aged-grub-700 \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/d5d0308b5ae44800bbbfb115974eb266/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/meta.yaml b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/meta.yaml new file mode 100644 index 00000000..96e3737f --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/artifacts +end_time: 1746430991557 +entry_point_name: '' +experiment_id: '813981363149581026' +lifecycle_stage: active +run_id: dee67ae6eb2e4cc3bedd12ea155dc852 +run_name: Naive Bayes +run_uuid: dee67ae6eb2e4cc3bedd12ea155dc852 +source_name: '' +source_type: 4 +source_version: '' +start_time: 1746430991259 +status: 3 +tags: [] +user_id: kelly diff --git a/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/metrics/accuracy b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/metrics/accuracy new file mode 100644 index 00000000..63d0ad06 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/metrics/accuracy @@ -0,0 +1 @@ +1746430991542 0.9692028985507246 0 diff --git a/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/params/model_name b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/params/model_name new file mode 100644 index 00000000..a7fb5317 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/params/model_name @@ -0,0 +1 @@ +Naive Bayes \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.runName b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.runName new file mode 100644 index 00000000..a7fb5317 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.runName @@ -0,0 +1 @@ +Naive Bayes \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.source.name b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.source.name new file mode 100644 index 00000000..7b025773 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.source.name @@ -0,0 +1 @@ +c:\Users\kelly\anaconda3\Lib\site-packages\ipykernel_launcher.py \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.source.type b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.source.type new file mode 100644 index 00000000..0c2c1fe9 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.user b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.user new file mode 100644 index 00000000..4b9268c8 --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/dee67ae6eb2e4cc3bedd12ea155dc852/tags/mlflow.user @@ -0,0 +1 @@ +kelly \ No newline at end of file diff --git a/Streamlit/mlruns/813981363149581026/meta.yaml b/Streamlit/mlruns/813981363149581026/meta.yaml new file mode 100644 index 00000000..93a3002d --- /dev/null +++ b/Streamlit/mlruns/813981363149581026/meta.yaml @@ -0,0 +1,6 @@ +artifact_location: file:///c:/Users/kelly/Desktop/NLP%20Project-cloned/Explora_AI_Team_14_Classification_Project/Streamlit/mlruns/813981363149581026 +creation_time: 1746429792104 +experiment_id: '813981363149581026' +last_update_time: 1746429792104 +lifecycle_stage: active +name: News Category Classification diff --git a/Streamlit/predictions.csv b/Streamlit/predictions.csv new file mode 100644 index 00000000..8abc9cfd --- /dev/null +++ b/Streamlit/predictions.csv @@ -0,0 +1,2001 @@ +category +business +education +entertainment +technology +business +technology +technology +sports +education +entertainment +entertainment +business +education +business +technology +technology +business +sports +entertainment +technology +education +sports +business +education +sports +entertainment +technology +education +technology +technology +sports +education +entertainment +business +technology +business +entertainment +entertainment +business +technology +business +entertainment +sports +business +entertainment +education +education +education +technology +education +entertainment +business +education +technology +sports +sports +sports +education +sports +education +technology +technology +business +education +entertainment +business +sports +technology +sports +business +sports +business +entertainment +education +business +technology +sports +entertainment +business +business +entertainment +sports +sports +technology +education +entertainment +technology +technology +education +entertainment +entertainment +sports +business +technology +business +technology +education +entertainment +business +technology +business +technology +sports +technology +business +entertainment +education +sports +entertainment +entertainment +entertainment +technology +sports +technology +entertainment +technology +education +business +technology +education +sports +business +business +technology +business +technology +entertainment +entertainment +sports +entertainment +entertainment +business +business +education +sports +technology +education +sports +education +technology +entertainment +entertainment +business +entertainment +technology +sports +technology +business +sports +education +sports +technology +education +education +education +sports +education +sports +business +sports +business +technology +sports +business +education +business +education +business +business +education +sports +technology +education +sports +technology +technology +sports +entertainment +technology +sports +sports +education +entertainment +sports +entertainment +sports +education +education +sports +technology +sports +sports +education +business +education +technology +business +technology +technology +business +business +entertainment +technology +entertainment +technology +technology +entertainment +business +technology +sports +sports +education +education +sports +education +business +education +sports +sports +business +business +business +sports +business +sports +business +education +entertainment +sports +sports +entertainment +sports +business +sports +entertainment +business +entertainment +education +education +business +technology +entertainment +entertainment +technology +business +technology +entertainment +business +sports +education +education +entertainment +business +education +education +business +education +education +education +technology +sports +education +education +sports +technology +education +sports +business +business +education +sports +education +entertainment +entertainment +entertainment +business +technology +sports +education +entertainment +technology +technology +business +entertainment +technology +entertainment +sports +entertainment +business +technology +education +education +business +technology +entertainment +sports +sports +business +technology +education +business +technology +education +sports +business +business +sports +sports +technology +sports +technology +business +education +business +business +technology +entertainment +entertainment +business +business +education +entertainment +entertainment +education +technology +education +education +technology +sports +business +sports +entertainment +education +education +entertainment +entertainment +technology +education +sports +technology +sports +sports +sports +sports +business +technology +sports +education +entertainment +entertainment +education +business +business +business +sports +entertainment +sports +sports +education +education +education +technology +education +education +sports +education +entertainment +entertainment +sports +sports +education +entertainment +sports +education +entertainment +entertainment +business +entertainment +entertainment +sports +technology +business +entertainment +technology +education +entertainment +entertainment +sports +education +entertainment +entertainment +technology +education +business +entertainment +technology +technology +entertainment +technology +technology +sports +education +education +education +education +entertainment +technology +entertainment +sports +technology +entertainment +business +entertainment +technology +education +business +sports +entertainment +entertainment +business +technology +education +entertainment +sports +sports +education +business +education +sports +entertainment +education +entertainment +technology +technology +technology +entertainment +education +sports +technology +entertainment +entertainment +business +technology +entertainment +business +education +education +sports +technology +sports +entertainment +business +education +business +business +business +technology +education +business +sports +business +sports +education +business +sports +education +sports +education +education +sports +technology +business +entertainment +education +sports +technology +business +business +technology +entertainment +entertainment +education +sports +business +entertainment +sports +education +technology +technology +education +education +sports +education +sports +sports +education +sports +sports +entertainment +sports +technology +sports +entertainment +sports +business +entertainment +sports +business +entertainment +technology +sports +business +technology +business +entertainment +technology +entertainment +entertainment +entertainment +sports +sports +education +education +entertainment +technology +entertainment +education +business +business +entertainment +business +sports +business +entertainment +entertainment +business +education +technology +entertainment +business +entertainment +technology +education +education +education +business +entertainment +technology +business +entertainment +business +technology +technology +sports +sports +sports +entertainment +education +education +sports +business +technology +technology +entertainment +entertainment +education +business +business +technology +entertainment +sports +technology +sports +sports +technology +business +technology +entertainment +education +sports +business +sports +education +business +sports +entertainment +sports +entertainment +education +entertainment +business +education +business +sports +entertainment +business +education +entertainment +sports +sports +education +technology +business +technology +education +business +sports +education +education +sports +entertainment +technology +technology +technology +technology +business +sports +entertainment +business +business +entertainment +technology +technology +sports +sports +business +entertainment +technology +business +technology +sports +technology +education +technology +entertainment +education +entertainment +education +education +business +sports +technology +entertainment +sports +education +sports +business +sports +entertainment +education +education +business +education +technology +entertainment +entertainment +entertainment +entertainment +technology +business +entertainment +entertainment +technology +education +technology +entertainment +business +education +sports +education +entertainment +entertainment +sports +business +technology +business +sports +technology +technology +education +entertainment +sports +education +sports +sports +education +business +entertainment +technology +business +technology +education +technology +technology +technology +education +sports +technology +entertainment +business +education +business +technology +entertainment +business +education +business +education +technology +sports +education +education +business +technology +technology +sports +education +sports +education +sports +sports +sports +education +business +business +education +technology +business +sports +business +entertainment +sports +education +education +education +technology +sports +entertainment +education +technology +entertainment +business +technology +business +education +business +business +education +education +sports +technology +entertainment +business +sports +entertainment +education +entertainment +sports +business +technology +sports +business +business +education +business +sports +technology +entertainment +business +education +entertainment +education +technology +business +technology +sports +business +sports +business +sports +technology +sports +sports +technology +business +education +entertainment +sports +business +sports +business +entertainment +entertainment +business +education +entertainment +business +education +business +entertainment +sports +sports +sports +business +technology +business +education +education +technology +entertainment +business +technology +entertainment +technology +education +business +business +entertainment +sports +technology +business +entertainment +education +education +sports +business +education +sports +education +education +technology +education +business +sports +education +technology +technology +sports +technology +business +business +business +education +sports +business +sports +technology +business +technology +technology +business +education +entertainment +technology +business +sports +technology +sports +technology +entertainment +education +sports +entertainment +entertainment +entertainment +entertainment +business +sports +entertainment +sports +business +sports +technology +entertainment +business +education +education +entertainment +entertainment +sports +entertainment +entertainment +technology +sports +education +business +entertainment +technology +sports +sports +entertainment +entertainment +sports +entertainment +sports +business +sports +technology +sports +entertainment +technology +entertainment +entertainment +entertainment +business +sports +sports +sports +entertainment +education +technology +business +business +entertainment +technology +technology +education +technology +business +technology +business +sports +entertainment +sports +technology +business +business +technology +entertainment +education +sports +technology +education +business +entertainment +technology +entertainment +business +education +technology +sports +technology +business +business +entertainment +technology +sports +entertainment +education +education +education +entertainment +education +business +business +sports +sports +business +business +education +sports +sports +business +sports +technology +entertainment +sports +technology +technology +technology +technology +sports +education +education +business +entertainment +business +business +entertainment +sports +entertainment +technology +entertainment +business +sports +sports +education +business +technology +entertainment +business +sports +education +sports +sports +technology +business +entertainment +business +business +technology +sports +business +sports +business +education +sports +technology +sports +education +sports +technology +technology +entertainment +sports +business +business +entertainment +entertainment +sports +business +technology +technology +business +sports +education +sports +education +sports +technology +business +entertainment +sports +technology +sports +sports +sports +business +technology +entertainment +entertainment +education +technology +entertainment +business +education +sports +technology +technology +business +technology +entertainment +sports +entertainment +entertainment +business +sports +technology +entertainment +education +entertainment +entertainment +technology +sports +technology +business +sports +technology +technology +sports +sports +sports +entertainment +entertainment +technology +technology +education +education +business +entertainment +education +business +education +technology +sports +education +education +entertainment +education +technology +business +education +entertainment +business +education +business +sports +sports +sports +entertainment +technology +business +sports +business +education +technology +education +entertainment +sports +business +sports +technology +business +business +business +sports +sports +business +technology +business +entertainment +technology +entertainment +education +education +education +sports +entertainment +sports +education +entertainment +sports +education +education +entertainment +sports +entertainment +entertainment +sports +business +sports +technology +entertainment +business +technology +business +business +entertainment +sports +business +technology +technology +business +entertainment +education +entertainment +education +entertainment +entertainment +entertainment +education +education +business +business +education +education +business +technology +entertainment +technology +technology +entertainment +technology +business +education +sports +education +sports +sports +sports +education +entertainment +technology +business +technology +entertainment +sports +entertainment +sports +entertainment +technology +sports +business +sports +technology +entertainment +entertainment +entertainment +education +sports +sports +technology +business +entertainment +technology +business +business +sports +education +education +business +sports +technology +education +technology +education +entertainment +entertainment +sports +technology +technology +sports +sports +business +entertainment +business +education +education +business +education +education +business +entertainment +education +sports +education +sports +business +entertainment +technology +education +entertainment +sports +entertainment +technology +education +education +entertainment +sports +technology +entertainment +sports +technology +entertainment +entertainment +technology +education +sports +business +technology +technology +entertainment +business +business +entertainment +business +technology +entertainment +entertainment +business +entertainment +business +technology +entertainment +education +education +entertainment +technology +sports +education +business +education +sports +technology +business +sports +entertainment +business +education +technology +education +sports +sports +business +sports +education +business +technology +technology +technology +technology +education +education +technology +business +sports +education +technology +sports +sports +entertainment +education +business +technology +education +sports +sports +technology +technology +technology +business +entertainment +business +sports +business +technology +entertainment +business +business +technology +sports +education +education +sports +technology +sports +entertainment +technology +entertainment +education +technology +entertainment +business +sports +education +technology +technology +business +technology +business +education +entertainment +sports +business +entertainment +entertainment +technology +sports +sports +sports +entertainment +entertainment +education +education +sports +technology +technology +technology +education +sports +education +entertainment +business +sports +sports +entertainment +business +education +technology +entertainment +technology +business +technology +entertainment +sports +business +technology +education +entertainment +entertainment +entertainment +education +sports +education +entertainment +technology +education +technology +entertainment +sports +entertainment +business +technology +entertainment +entertainment +technology +entertainment +sports +business +entertainment +education +education +entertainment +business +technology +business +sports +business +entertainment +entertainment +education +sports +education +education +education +sports +entertainment +sports +education +technology +entertainment +sports +education +education +education +business +sports +entertainment +technology +entertainment +education +technology +technology +technology +business +business +technology +education +sports +entertainment +business +entertainment +business +business +technology +education +technology +business +sports +education +education +education +education +education +business +entertainment +business +sports +entertainment +education +sports +technology +technology +entertainment +sports +sports +education +business +education +business +business +technology +entertainment +technology +entertainment +education +education +entertainment +business +technology +business +technology +sports +education +technology +education +sports +business +business +education +business +business +business +technology +education +technology +education +education +technology +sports +entertainment +entertainment +entertainment +sports +education +sports +sports +entertainment +sports +education +business +business +technology +entertainment +business +technology +entertainment +sports +technology +technology +technology +education +business +technology +entertainment +business +technology +technology +technology +education +technology +entertainment +technology +business +education +business +entertainment +entertainment +business +education +entertainment +education +sports +education +sports +entertainment +entertainment +entertainment +business +education +education +entertainment +entertainment +technology +education +technology +technology +technology +entertainment +entertainment +business +sports +business +technology +business +education +sports +business +business +sports +technology +education +entertainment +education +sports +entertainment +business +education +education +entertainment +sports +business +entertainment +business +technology +business +sports +business +education +technology +education +technology +education +entertainment +sports +education +technology +education +business +entertainment +education +sports +entertainment +sports +entertainment +sports +sports +education +entertainment +education +entertainment +sports +technology +technology +sports +technology +technology +technology +entertainment +education +technology +business +technology +education +technology +education +education +entertainment +business +technology +education +education +sports +technology +sports +business +business +technology +technology +sports +business +business +entertainment +education +entertainment +technology +entertainment +business +entertainment +technology +technology +business +sports +entertainment +education +technology +business +entertainment +education +education +business +technology +business +technology +education +technology +entertainment +sports +entertainment +business +education +education +education +business +education +business +technology +sports +entertainment +entertainment +entertainment +entertainment +sports +sports +technology +entertainment +technology +sports +sports +education +entertainment +technology +technology +education +entertainment +entertainment +technology +education +entertainment +sports +technology +business +entertainment +technology +sports +business +education +business +sports +technology +education +technology +education +technology +technology +sports +business +business +technology +education +business +sports +entertainment +entertainment +business +sports +entertainment +sports +business +sports +education +education +entertainment +education +technology +business +education +business +business +entertainment +technology +sports +technology +education +education +education +education +education +business +technology +entertainment +entertainment +business +business +business +technology +business +education +education +sports +business +education +education +education +entertainment +entertainment +sports +education +business +business +education +business +education +technology +technology +technology +technology +business +sports +sports +technology +technology +sports +entertainment +entertainment +technology +sports +business +technology +sports +technology +education +business +education +business +technology +technology +sports +sports +business +education +technology +sports +education +technology +sports +sports +entertainment +education +sports +technology +business +technology +education +entertainment +technology +business +entertainment +technology +technology +sports +technology +entertainment +education +education +technology +business +business +education +business +sports +sports +education +education +education +business +technology +sports +technology +entertainment +business +entertainment +technology +business +education +entertainment +sports +sports +education +entertainment +entertainment +sports +business +education +technology +technology +education +sports +education +sports +education +business +entertainment +education +sports +technology +education +education +business +technology +sports +technology +sports +education +business +sports +technology +entertainment +entertainment +entertainment +education +sports +entertainment +entertainment +entertainment +sports +entertainment +entertainment +education +sports +technology +business +business +technology +business +entertainment +sports +education +sports +entertainment +business +entertainment +sports +sports +entertainment +sports +technology +technology +sports +sports +education +sports +technology +sports +sports +entertainment +entertainment +sports +education +entertainment +technology +technology +education +entertainment +entertainment +business +business +technology +technology +sports +sports +entertainment +technology +education +technology +business +entertainment +business +technology +technology +business +business +sports +entertainment +entertainment +entertainment +technology +technology +education +sports +business +business +education +technology +technology +entertainment +sports +education +sports +education +education +technology +business +entertainment +technology +sports +sports +sports +technology +entertainment +education +business +technology +technology +business +sports +technology +business +education +entertainment +technology +business +business +business +education +business +business +entertainment +technology +entertainment diff --git a/Streamlit/vectorizer.pkl b/Streamlit/vectorizer.pkl new file mode 100644 index 00000000..55be106f Binary files /dev/null and b/Streamlit/vectorizer.pkl differ diff --git a/classification presentation.pdf b/classification presentation.pdf new file mode 100644 index 00000000..da984755 Binary files /dev/null and b/classification presentation.pdf differ