{"cells":[{"cell_type":"markdown","id":"c3d0765e","metadata":{"id":"c3d0765e"},"source":["### Fake News Classification using machine learning\n","**Project Workflow**\n","0. Installing required libraies from requirements.txt for project \n","1. Problem Statement\n","2. Data Collection\n","3. Importing required libraries and installations\n","4. Importing data as csv file\n","5. Exploratory Data Analysis\n","6. Data Preparation and Preprocessing\n"," - Tokenization\n"," - Lower case conversion\n"," - Stopwords\n"," - Lemmatization/Stemming\n","7. Vectorization with TFIDF\n","8. Data splittin into train and test\n","9. Model Building and Evaluation\n"," - 9.1 Cross validation\n"," - 9.2 Training data with best model from cross validation\n"," - 9.3. Evaluating the performance of trained model on test data\n"," - 9.4 Saving and loading model\n","10. Prediction pipeline\n"]},{"cell_type":"markdown","source":["#### 0. Installing required libraies from requirements.txt for project "],"metadata":{"id":"L5r8W5UkBt1x"},"id":"L5r8W5UkBt1x"},{"cell_type":"code","source":["!pip freeze > requirements.txt"],"metadata":{"id":"0OD5ZBRGHsoR","executionInfo":{"status":"ok","timestamp":1683411294453,"user_tz":-60,"elapsed":3121,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"0OD5ZBRGHsoR","execution_count":7,"outputs":[]},{"cell_type":"markdown","id":"bc956f4a","metadata":{"id":"bc956f4a"},"source":["#### 1. Problem Statement\n","The prevalence of fake news on online media platforms is increasingly recognized as a critical concern for society, as it has the potential to manipulate public opinion, incite social unrest, and erode trust in credible news sources. To mitigate the negative impact of fake news, the development of an effective classification system capable of accurately identifying and filtering false news articles from genuine sources is essential. However, building such a system presents numerous challenges, including the multifaceted and intricate nature of news content, the rapid dissemination of fake news through social media channels, and the possibility of biased or incomplete datasets. As such, it is imperative to develop an accurate and reliable fake news classification system leveraging advanced natural language processing (NLP) techniques. By achieving this, we can safeguard the integrity of news and promote public trust in media outlets.\n"]},{"cell_type":"markdown","id":"c76d48fc","metadata":{"id":"c76d48fc"},"source":["#### 2. Data collection\n","The datasets is available on kaggle in the provided link \n","https://www.kaggle.com/c/fake-news/data?select=train.csv\n"]},{"cell_type":"markdown","id":"89f5a900","metadata":{"id":"89f5a900"},"source":["#### 3. Importing required libraries and installations"]},{"cell_type":"code","source":["!pip install catboost"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"2Pv7sgrZeIi1","executionInfo":{"status":"ok","timestamp":1683400206764,"user_tz":-60,"elapsed":5288,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"f685c0c3-5440-475a-f63a-e624c844ea0a"},"id":"2Pv7sgrZeIi1","execution_count":1,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: catboost in /usr/local/lib/python3.10/dist-packages (1.2)\n","Requirement already satisfied: numpy>=1.16.0 in /usr/local/lib/python3.10/dist-packages (from catboost) (1.22.4)\n","Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from catboost) (3.7.1)\n","Requirement already satisfied: graphviz in /usr/local/lib/python3.10/dist-packages (from catboost) (0.20.1)\n","Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from catboost) (1.10.1)\n","Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from catboost) (1.16.0)\n","Requirement already satisfied: pandas>=0.24 in /usr/local/lib/python3.10/dist-packages (from catboost) (1.5.3)\n","Requirement already satisfied: plotly in /usr/local/lib/python3.10/dist-packages (from catboost) (5.13.1)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24->catboost) (2022.7.1)\n","Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24->catboost) (2.8.2)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->catboost) (23.1)\n","Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->catboost) (8.4.0)\n","Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->catboost) (3.0.9)\n","Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->catboost) (1.0.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->catboost) (1.4.4)\n","Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->catboost) (4.39.3)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->catboost) (0.11.0)\n","Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from plotly->catboost) (8.2.2)\n"]}]},{"cell_type":"code","execution_count":45,"id":"9f08e579","metadata":{"id":"9f08e579","executionInfo":{"status":"ok","timestamp":1683405864858,"user_tz":-60,"elapsed":300,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"outputs":[],"source":["import numpy as np\n","import pandas as pd\n","import matplotlib.pyplot as plt\n","import seaborn as sns\n","from typing import Dict\n","import re\n","import os\n","import nltk\n","import joblib\n","from nltk.corpus import stopwords\n","from nltk.stem import PorterStemmer, WordNetLemmatizer\n","from sklearn.neighbors import KNeighborsClassifier\n","from sklearn.model_selection import cross_val_score\n","from sklearn.model_selection import train_test_split\n","from sklearn.metrics import accuracy_score, f1_score, roc_auc_score,classification_report,confusion_matrix\n","import xgboost\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.naive_bayes import GaussianNB\n","from sklearn.ensemble import RandomForestClassifier\n","from sklearn.feature_extraction.text import TfidfVectorizer\n","from sklearn.metrics import accuracy_score, confusion_matrix,classification_report\n","import catboost"]},{"cell_type":"markdown","id":"81cb7d2f","metadata":{"id":"81cb7d2f"},"source":["#### 4. Importing data as csv file"]},{"cell_type":"code","source":["#connect to goole drive\n","from google.colab import drive\n","drive.mount('/content/drive')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eDnbf_8bldN6","executionInfo":{"status":"ok","timestamp":1683396535999,"user_tz":-60,"elapsed":2857,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"ccda467b-b182-484a-c994-25de624ef806"},"id":"eDnbf_8bldN6","execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]}]},{"cell_type":"code","source":["#unzip data file \n","!unzip -q \"/content/drive/MyDrive/Upwork/Fake_news/Data/fake_news_train.csv.zip\""],"metadata":{"id":"mrZlCYl7mJox","executionInfo":{"status":"ok","timestamp":1683394309448,"user_tz":-60,"elapsed":3374,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"mrZlCYl7mJox","execution_count":3,"outputs":[]},{"cell_type":"code","execution_count":3,"id":"5fe790df","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"5fe790df","executionInfo":{"status":"ok","timestamp":1683400220100,"user_tz":-60,"elapsed":2113,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"4e71c45c-cd41-4972-de31-8da244bc8a3e"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id title author \\\n","0 0 House Dem Aide: We Didn’t Even See Comey’s Let... Darrell Lucus \n","1 1 FLYNN: Hillary Clinton, Big Woman on Campus - ... Daniel J. Flynn \n","2 2 Why the Truth Might Get You Fired Consortiumnews.com \n","3 3 15 Civilians Killed In Single US Airstrike Hav... Jessica Purkiss \n","4 4 Iranian woman jailed for fictional unpublished... Howard Portnoy \n","\n"," text label \n","0 House Dem Aide: We Didn’t Even See Comey’s Let... 1 \n","1 Ever get the feeling your life circles the rou... 0 \n","2 Why the Truth Might Get You Fired October 29, ... 1 \n","3 Videos 15 Civilians Killed In Single US Airstr... 1 \n","4 Print \\nAn Iranian woman has been sentenced to... 1 "],"text/html":["\n","
\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtitleauthortextlabel
00House Dem Aide: We Didn’t Even See Comey’s Let...Darrell LucusHouse Dem Aide: We Didn’t Even See Comey’s Let...1
11FLYNN: Hillary Clinton, Big Woman on Campus - ...Daniel J. FlynnEver get the feeling your life circles the rou...0
22Why the Truth Might Get You FiredConsortiumnews.comWhy the Truth Might Get You Fired October 29, ...1
3315 Civilians Killed In Single US Airstrike Hav...Jessica PurkissVideos 15 Civilians Killed In Single US Airstr...1
44Iranian woman jailed for fictional unpublished...Howard PortnoyPrint \\nAn Iranian woman has been sentenced to...1
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "]},"metadata":{},"execution_count":3}],"source":["#Define path to data\n","data_path = \"/content/train.csv\"\n","#read data as dataframe\n","df = pd.read_csv(data_path)\n","df.head()"]},{"cell_type":"code","source":["# set the random state\n","random_state = 42\n","np.random.seed(random_state)"],"metadata":{"id":"LUA9nKiE8Kf9","executionInfo":{"status":"ok","timestamp":1683400264229,"user_tz":-60,"elapsed":331,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"LUA9nKiE8Kf9","execution_count":11,"outputs":[]},{"cell_type":"markdown","id":"537579d9","metadata":{"id":"537579d9"},"source":["#### 5. Exploratory Data Analysis"]},{"cell_type":"code","execution_count":null,"id":"840ee31f","metadata":{"id":"840ee31f","outputId":"f3dab38b-415f-48a3-e3d3-b2e53f8b9eef","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1683244184790,"user_tz":-60,"elapsed":11,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":["(20800, 5)"]},"metadata":{},"execution_count":6}],"source":["#check data shape\n","df.shape"]},{"cell_type":"code","execution_count":null,"id":"3445582c","metadata":{"id":"3445582c","outputId":"646cefe7-d8ca-40db-fe63-1147c31a3240","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1683244184791,"user_tz":-60,"elapsed":10,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","RangeIndex: 20800 entries, 0 to 20799\n","Data columns (total 5 columns):\n"," # Column Non-Null Count Dtype \n","--- ------ -------------- ----- \n"," 0 id 20800 non-null int64 \n"," 1 title 20242 non-null object\n"," 2 author 18843 non-null object\n"," 3 text 20761 non-null object\n"," 4 label 20800 non-null int64 \n","dtypes: int64(2), object(3)\n","memory usage: 812.6+ KB\n"]}],"source":["#check data types of features\n","df.info()"]},{"cell_type":"code","execution_count":7,"id":"81e47852","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"81e47852","executionInfo":{"status":"ok","timestamp":1683396570480,"user_tz":-60,"elapsed":437,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"593d348b-4433-44f0-d6c9-4a65934e72d3"},"outputs":[{"output_type":"stream","name":"stdout","text":["Columns are Index(['title', 'author', 'text', 'label'], dtype='object')\n"]}],"source":["#drop id column\n","df = df.drop(\"id\",axis= 1)\n","print(f\"Columns are {df.columns}\")"]},{"cell_type":"code","execution_count":null,"id":"61fcfed9","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"61fcfed9","executionInfo":{"status":"ok","timestamp":1683244185271,"user_tz":-60,"elapsed":3,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"e5bfbd3f-4800-429c-ee62-02d8896c3b80"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["title 558\n","author 1957\n","text 39\n","label 0\n","dtype: int64"]},"metadata":{},"execution_count":9}],"source":["#check missing values\n","df.isnull().sum()"]},{"cell_type":"code","execution_count":null,"id":"1613f7d3","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"1613f7d3","executionInfo":{"status":"ok","timestamp":1683241692941,"user_tz":-60,"elapsed":8,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"3b87e7c9-f340-43f8-dd76-0960101ce3ef"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["1 10413\n","0 10387\n","Name: label, dtype: int64"]},"metadata":{},"execution_count":8}],"source":["#Check number of classes in label\n","df[\"label\"].value_counts()"]},{"cell_type":"code","execution_count":null,"id":"8149beb7","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":420},"id":"8149beb7","executionInfo":{"status":"ok","timestamp":1683237748981,"user_tz":-60,"elapsed":11,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"091d7f96-b5fe-4fce-8f76-445b49c56e8c"},"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{}}],"source":["#Draw distibution of classes in label to check for imbalance\n","sizes = df[\"label\"].value_counts().values\n","labels = [\"Real news\",\"Fake news\"]\n","\n","fig, ax = plt.subplots()\n","ax.pie(sizes, labels=labels, autopct='%1.1f%%',\n"," pctdistance=1.25, labeldistance=.6)\n","plt.show()\n"]},{"cell_type":"markdown","id":"4ceb6c5e","metadata":{"id":"4ceb6c5e"},"source":["Comment : Data is balanced"]},{"cell_type":"code","execution_count":null,"id":"c1b14704","metadata":{"id":"c1b14704","outputId":"9986f91f-4a67-4580-bdc2-843f9b98ab05"},"outputs":[{"data":{"text/plain":["'Jackie Mason: Hollywood Would Love Trump if He Bombed North Korea over Lack of Trans Bathrooms (Exclusive Video) - Breitbart'"]},"execution_count":22,"metadata":{},"output_type":"execute_result"}],"source":["#Check different titles\n","df[\"title\"][5]"]},{"cell_type":"code","execution_count":null,"id":"60cf9fb5","metadata":{"id":"60cf9fb5","outputId":"baf7b1b1-4837-4491-83a4-7e96a2e12bfe"},"outputs":[{"data":{"text/plain":["'Ever get the feeling your life circles the roundabout rather than heads in a straight line toward the intended destination? [Hillary Clinton remains the big woman on campus in leafy, liberal Wellesley, Massachusetts. Everywhere else votes her most likely to don her inauguration dress for the remainder of her days the way Miss Havisham forever wore that wedding dress. Speaking of Great Expectations, Hillary Rodham overflowed with them 48 years ago when she first addressed a Wellesley graduating class. The president of the college informed those gathered in 1969 that the students needed “no debate so far as I could ascertain as to who their spokesman was to be” (kind of the like the Democratic primaries in 2016 minus the terms unknown then even at a Seven Sisters school). “I am very glad that Miss Adams made it clear that what I am speaking for today is all of us — the 400 of us,” Miss Rodham told her classmates. After appointing herself Edger Bergen to the Charlie McCarthys and Mortimer Snerds in attendance, the bespectacled in granny glasses (awarding her matronly wisdom — or at least John Lennon wisdom) took issue with the previous speaker. Despite becoming the first to win election to a seat in the U. S. Senate since Reconstruction, Edward Brooke came in for criticism for calling for “empathy” for the goals of protestors as he criticized tactics. Though Clinton in her senior thesis on Saul Alinsky lamented “Black Power demagogues” and “elitist arrogance and repressive intolerance” within the New Left, similar words coming out of a Republican necessitated a brief rebuttal. “Trust,” Rodham ironically observed in 1969, “this is one word that when I asked the class at our rehearsal what it was they wanted me to say for them, everyone came up to me and said ‘Talk about trust, talk about the lack of trust both for us and the way we feel about others. Talk about the trust bust.’ What can you say about it? What can you say about a feeling that permeates a generation and that perhaps is not even understood by those who are distrusted?” The “trust bust” certainly busted Clinton’s 2016 plans. She certainly did not even understand that people distrusted her. After Whitewater, Travelgate, the vast conspiracy, Benghazi, and the missing emails, Clinton found herself the distrusted voice on Friday. There was a load of compromising on the road to the broadening of her political horizons. And distrust from the American people — Trump edged her 48 percent to 38 percent on the question immediately prior to November’s election — stood as a major reason for the closing of those horizons. Clinton described her vanquisher and his supporters as embracing a “lie,” a “con,” “alternative facts,” and “a assault on truth and reason. ” She failed to explain why the American people chose his lies over her truth. “As the history majors among you here today know all too well, when people in power invent their own facts and attack those who question them, it can mark the beginning of the end of a free society,” she offered. “That is not hyperbole. ” Like so many people to emerge from the 1960s, Hillary Clinton embarked upon a long, strange trip. From high school Goldwater Girl and Wellesley College Republican president to Democratic politician, Clinton drank in the times and the place that gave her a degree. More significantly, she went from idealist to cynic, as a comparison of her two Wellesley commencement addresses show. Way back when, she lamented that “for too long our leaders have viewed politics as the art of the possible, and the challenge now is to practice politics as the art of making what appears to be impossible possible. ” Now, as the big woman on campus but the odd woman out of the White House, she wonders how her current station is even possible. “Why aren’t I 50 points ahead?” she asked in September. In May she asks why she isn’t president. The woman famously dubbed a “congenital liar” by Bill Safire concludes that lies did her in — theirs, mind you, not hers. Getting stood up on Election Day, like finding yourself the jilted bride on your wedding day, inspires dangerous delusions.'"]},"execution_count":24,"metadata":{},"output_type":"execute_result"}],"source":["#chek different text description of news\n","df[\"text\"][1]"]},{"cell_type":"markdown","id":"ab04641f","metadata":{"id":"ab04641f"},"source":["Comment : only the title of the news with be used for training our model to decrease preprocessing time and reduce model complexity since every text description of news seems too large"]},{"cell_type":"markdown","id":"006c2d2d","metadata":{"id":"006c2d2d"},"source":["#### 6. Data Preparation and preprocessing"]},{"cell_type":"code","execution_count":4,"id":"6bc90c8b","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"6bc90c8b","executionInfo":{"status":"ok","timestamp":1683400236563,"user_tz":-60,"elapsed":318,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"582443c8-8d02-4d7d-dfb2-690b4021a92c"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["(18285, 5)"]},"metadata":{},"execution_count":4}],"source":["#Dropping missing values\n","df = df.dropna().reset_index(drop=True)\n","df.shape"]},{"cell_type":"code","source":["df.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"gySCz1GWnhAY","executionInfo":{"status":"ok","timestamp":1683244193531,"user_tz":-60,"elapsed":6,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"93efd184-5eb4-4f4a-e59e-8a20b40d5da3"},"id":"gySCz1GWnhAY","execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" title author \\\n","0 House Dem Aide: We Didn’t Even See Comey’s Let... Darrell Lucus \n","1 FLYNN: Hillary Clinton, Big Woman on Campus - ... Daniel J. Flynn \n","2 Why the Truth Might Get You Fired Consortiumnews.com \n","3 15 Civilians Killed In Single US Airstrike Hav... Jessica Purkiss \n","4 Iranian woman jailed for fictional unpublished... Howard Portnoy \n","\n"," text label \n","0 House Dem Aide: We Didn’t Even See Comey’s Let... 1 \n","1 Ever get the feeling your life circles the rou... 0 \n","2 Why the Truth Might Get You Fired October 29, ... 1 \n","3 Videos 15 Civilians Killed In Single US Airstr... 1 \n","4 Print \\nAn Iranian woman has been sentenced to... 1 "],"text/html":["\n","
\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
titleauthortextlabel
0House Dem Aide: We Didn’t Even See Comey’s Let...Darrell LucusHouse Dem Aide: We Didn’t Even See Comey’s Let...1
1FLYNN: Hillary Clinton, Big Woman on Campus - ...Daniel J. FlynnEver get the feeling your life circles the rou...0
2Why the Truth Might Get You FiredConsortiumnews.comWhy the Truth Might Get You Fired October 29, ...1
315 Civilians Killed In Single US Airstrike Hav...Jessica PurkissVideos 15 Civilians Killed In Single US Airstr...1
4Iranian woman jailed for fictional unpublished...Howard PortnoyPrint \\nAn Iranian woman has been sentenced to...1
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "]},"metadata":{},"execution_count":11}]},{"cell_type":"code","execution_count":5,"id":"f0b3ac50","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"f0b3ac50","executionInfo":{"status":"ok","timestamp":1683400239526,"user_tz":-60,"elapsed":531,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"81a62e7d-4ff5-4b98-dc29-7c3783409880"},"outputs":[{"output_type":"stream","name":"stderr","text":["[nltk_data] Downloading package wordnet to /root/nltk_data...\n","[nltk_data] Package wordnet is already up-to-date!\n","[nltk_data] Downloading package stopwords to /root/nltk_data...\n","[nltk_data] Package stopwords is already up-to-date!\n"]},{"output_type":"execute_result","data":{"text/plain":["True"]},"metadata":{},"execution_count":5}],"source":["#Downloading wordnet for nltk to avoid error\n","nltk.download('wordnet')\n","nltk.download('stopwords')"]},{"cell_type":"code","execution_count":6,"id":"72962f94","metadata":{"id":"72962f94","executionInfo":{"status":"ok","timestamp":1683400243237,"user_tz":-60,"elapsed":3253,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"outputs":[],"source":["#initialise lemmatization object\n","lm = WordNetLemmatizer()\n","stop_words = set(stopwords.words(\"english\"))\n","def preprocess_text(df,feature):\n"," #initialise corpus to store texts p\n"," corpus = []\n"," for i in range(len(df)):\n"," review = re.sub(\"a-zA-Z0-9\",\" \",df[feature][i])\n"," review = review.lower() #convert to lower case\n"," review = review.split() #Tokenize text\n"," review = [lm.lemmatize(x) for x in review if x not in list(stop_words)] #lemmatize and removing stopwords\n"," review = \" \".join(review) #join as text\n"," corpus.append(review)\n"," \n"," return corpus\n","#preprocess text and get desired document \n","corpus = preprocess_text(df = df,feature = \"title\") "]},{"cell_type":"code","source":["#indexing on corpus\n","corpus[0]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":36},"id":"G38ail2Knwn_","executionInfo":{"status":"ok","timestamp":1683394334150,"user_tz":-60,"elapsed":31,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"e6aca2ec-35ae-4752-9924-74278e16f888"},"id":"G38ail2Knwn_","execution_count":10,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'house dem aide: didn’t even see comey’s letter jason chaffetz tweeted'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":10}]},{"cell_type":"markdown","id":"f1bf195d","metadata":{"id":"f1bf195d"},"source":["#### 7. Vectorization with TFIDF"]},{"cell_type":"code","execution_count":49,"id":"6ac22f36","metadata":{"id":"6ac22f36","executionInfo":{"status":"ok","timestamp":1683405979852,"user_tz":-60,"elapsed":2223,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"outputs":[],"source":["#Convert texts to array using tfidf vectorizer\n","def vectorize(corpus):\n"," tf = TfidfVectorizer(random_state=random_state)\n"," x = tf.fit_transform(corpus).toarray()\n"," return x,tf\n","x,tf = vectorize(corpus)"]},{"cell_type":"code","source":["#save preprocessor\n","# Save the TF-IDF preprocessor using joblib\n","os.chdir(\"/content/drive/MyDrive/Upwork/Fake_news/Artifacts\")\n","joblib.dump(tf, 'tfidf_preprocessor.pkl')\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"v2TM3l2BzpqN","executionInfo":{"status":"ok","timestamp":1683405981843,"user_tz":-60,"elapsed":478,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"c85cca51-4845-421e-d5bd-95c282c1c873"},"id":"v2TM3l2BzpqN","execution_count":50,"outputs":[{"output_type":"execute_result","data":{"text/plain":["['tfidf_preprocessor.pkl']"]},"metadata":{},"execution_count":50}]},{"cell_type":"markdown","id":"0bc0424a","metadata":{"id":"0bc0424a"},"source":["#### 8. Data splitting into train and test"]},{"cell_type":"code","execution_count":12,"id":"5732a186","metadata":{"id":"5732a186","executionInfo":{"status":"ok","timestamp":1683400272809,"user_tz":-60,"elapsed":2671,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"outputs":[],"source":["#split data into training and test using 20 % as test data\n","y = df[\"label\"]\n","x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=random_state,stratify = y)"]},{"cell_type":"code","source":["print(f\"Training data size {len(x_train)}\")\n","print(f\"Test data size {len(x_test)}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"1tm9pAZyvobo","executionInfo":{"status":"ok","timestamp":1683400272811,"user_tz":-60,"elapsed":18,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"943bd264-83a6-4789-f0ae-172789d7911f"},"id":"1tm9pAZyvobo","execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["Training data size 14628\n","Test data size 3657\n"]}]},{"cell_type":"markdown","source":["#### 9. Model building"],"metadata":{"id":"7nDLkBPNv-hZ"},"id":"7nDLkBPNv-hZ"},{"cell_type":"markdown","source":["9.1 Cross validation"],"metadata":{"id":"c34p1KV0wGJt"},"id":"c34p1KV0wGJt"},{"cell_type":"code","source":["#Define a dictionary of models to be used for cross validation\n","models = {\"logistic_regression\":LogisticRegression(),\n"," \"Naive_Bayes\":GaussianNB(),\n"," \"catboost\":catboost.CatBoostClassifier(iterations = 100,random_state=random_state,silent=True)}"],"metadata":{"id":"7HZKADTKzM-5","executionInfo":{"status":"ok","timestamp":1683400460351,"user_tz":-60,"elapsed":501,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"7HZKADTKzM-5","execution_count":18,"outputs":[]},{"cell_type":"code","source":["\n","model_scores = [] # define list to store scores of models\n","model_names = models.keys() #define for names of models\n","\n","def cross_validate(model,x_train:np.ndarray,y_train:np.ndarray,scoring:str):\n"," #Cross validate through every model\n"," cv_results = cross_val_score(model,x_train, y_train, cv=5, scoring=scoring)\n"," mean_accuracy = cv_results.mean()\n"," acc = model_scores.append(mean_accuracy)\n"," return acc\n","#cross validate with logistci regression\n","#cross_validate(model=models[\"logistic_regression\"],x_train=x_train,y_train= y_train,scoring=\"accuracy\")"],"metadata":{"id":"Aiv5b1-Bv9d4","executionInfo":{"status":"ok","timestamp":1683400361423,"user_tz":-60,"elapsed":330,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"Aiv5b1-Bv9d4","execution_count":15,"outputs":[]},{"cell_type":"code","source":["#cross validate with Naive nayes\n","cross_validate(model=models[\"Naive_Bayes\"],x_train=x_train,y_train=y_train,scoring=\"accuracy\")"],"metadata":{"id":"O3Q6QmMK-iAl","executionInfo":{"status":"ok","timestamp":1683396840716,"user_tz":-60,"elapsed":29449,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"O3Q6QmMK-iAl","execution_count":17,"outputs":[]},{"cell_type":"code","source":["#create dataframe for results\n","result_df = pd.DataFrame()\n","result_df[\"model\"] = [\"logistic_regression\",\"Naive Bayes\"]\n","result_df[\"Accuracy\"] = model_scores\n","result_df_sorted = result_df.sort_values(\"Accuracy\",ascending=False)\n","\n","#save dataframe to result folder\n","path_to_result = \"/content/drive/MyDrive/Upwork/Fake_news/Results\"\n","os.chdir(path_to_result)\n","result_df_sorted.to_csv(\"crossval_scores.csv\",index=False)\n","result_df_sorted.head()"],"metadata":{"id":"ctAK2PAcJ-aR","colab":{"base_uri":"https://localhost:8080/","height":112},"executionInfo":{"status":"ok","timestamp":1683396840720,"user_tz":-60,"elapsed":29,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"d1e7615c-e4d9-4c5d-e0bd-3856ecf58699"},"id":"ctAK2PAcJ-aR","execution_count":18,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" model Accuracy\n","0 logistic_regression 0.916735\n","1 Naive Bayes 0.646158"],"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","
modelAccuracy
0logistic_regression0.916735
1Naive Bayes0.646158
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "]},"metadata":{},"execution_count":18}]},{"cell_type":"code","source":["#cross validate with xgboost\n","cb_score = cross_validate(model=models[\"catboost\"],x_train=x_train,y_train=y_train,scoring=\"accuracy\") "],"metadata":{"id":"EME2qywu86x8","executionInfo":{"status":"ok","timestamp":1683401395710,"user_tz":-60,"elapsed":841384,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"EME2qywu86x8","execution_count":19,"outputs":[]},{"cell_type":"code","source":["cb_score = model_scores[0]"],"metadata":{"id":"ag10B6Oci0au","executionInfo":{"status":"ok","timestamp":1683401528475,"user_tz":-60,"elapsed":751,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"ag10B6Oci0au","execution_count":24,"outputs":[]},{"cell_type":"code","source":["cb_score"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"sZc3LCnIjAo1","executionInfo":{"status":"ok","timestamp":1683401539685,"user_tz":-60,"elapsed":288,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"a3dd7658-711f-48a9-bd86-3cb5c560b090"},"id":"sZc3LCnIjAo1","execution_count":25,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.9191961722488038"]},"metadata":{},"execution_count":25}]},{"cell_type":"code","source":["#Read saved dataframed for other trained model\n","result_df_sorted = pd.read_csv(\"/content/drive/MyDrive/Upwork/Fake_news/Results/crossval_scores.csv\")\n","# create a new row\n","new_row = {'model': 'catboost', 'Accuracy':cb_score}\n","# append the new row to the DataFrame\n","result_df_sorted = result_df_sorted.append(new_row, ignore_index=True)"],"metadata":{"id":"-HOsecFRKE-g","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1683401544878,"user_tz":-60,"elapsed":316,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"8dcec9f3-008b-416d-d8f0-b1a2e50e0dde"},"id":"-HOsecFRKE-g","execution_count":26,"outputs":[{"output_type":"stream","name":"stderr","text":[":6: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n"," result_df_sorted = result_df_sorted.append(new_row, ignore_index=True)\n"]}]},{"cell_type":"code","source":["#create dataframe for results\n","result_df_sorted.to_csv(\"cross_val.csv\",index=False)\n","result_df_sorted.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":144},"id":"KPA6TUf6-rCu","executionInfo":{"status":"ok","timestamp":1683401566942,"user_tz":-60,"elapsed":333,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"62459945-ee9a-410b-fe21-69f934ed49fa"},"id":"KPA6TUf6-rCu","execution_count":27,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" model Accuracy\n","0 logistic_regression 0.916735\n","1 Naive Bayes 0.646158\n","2 catboost 0.919196"],"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","
modelAccuracy
0logistic_regression0.916735
1Naive Bayes0.646158
2catboost0.919196
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "]},"metadata":{},"execution_count":27}]},{"cell_type":"markdown","source":["Comment : Catboost happens to be the best model so far,we will train our data with this model"],"metadata":{"id":"SjKA6hTPjZst"},"id":"SjKA6hTPjZst"},{"cell_type":"markdown","source":["9.2 Training data with best model from cross validation"],"metadata":{"id":"8ddGBs2H3YGC"},"id":"8ddGBs2H3YGC"},{"cell_type":"code","source":["model = catboost.CatBoostClassifier(iterations = 100,random_state=random_state,silent=True)\n","#train model\n","model.fit(x_train,y_train)"],"metadata":{"id":"W_MHsQb03LFK","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1683404450426,"user_tz":-60,"elapsed":277204,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"045c35f0-2f43-4c8e-c926-d367df9773f0"},"id":"W_MHsQb03LFK","execution_count":28,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":28}]},{"cell_type":"markdown","source":["9.3 Evaluating the performance of trained model on test data"],"metadata":{"id":"Vzd6WBKq3tW6"},"id":"Vzd6WBKq3tW6"},{"cell_type":"code","source":["#predict on test data\n","y_pred= model.predict(x_test)"],"metadata":{"id":"4ZTV-5kC4Xkp","executionInfo":{"status":"ok","timestamp":1683404523302,"user_tz":-60,"elapsed":447,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"4ZTV-5kC4Xkp","execution_count":29,"outputs":[]},{"cell_type":"code","source":["#get accuracy,f1_score and auc_roc_score\n","y_true = y_test\n","print(f\"Accuracy:{accuracy_score(y_true, y_pred)}\")\n","print(f\"f1_score:{f1_score(y_true, y_pred)}\")\n","print(f\"roc_auc_score:{roc_auc_score(y_true, y_pred)}\")"],"metadata":{"id":"RyN2JYod58pj","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1683404593800,"user_tz":-60,"elapsed":308,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"0ec6d6c3-2ff5-4a05-f879-587d41c008a1"},"id":"RyN2JYod58pj","execution_count":31,"outputs":[{"output_type":"stream","name":"stdout","text":["Accuracy:0.9278096800656276\n","f1_score:0.9221238938053098\n","roc_auc_score:0.9346622535108339\n"]}]},{"cell_type":"code","source":["#print classification report\n","print(classification_report(y_test, y_pred))"],"metadata":{"id":"hDDvNUvg4vzl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1683404620466,"user_tz":-60,"elapsed":5,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"64edcd36-dd2b-430b-cde4-9fac50ea3fd2"},"id":"hDDvNUvg4vzl","execution_count":33,"outputs":[{"output_type":"stream","name":"stdout","text":[" precision recall f1-score support\n","\n"," 0 0.99 0.88 0.93 2072\n"," 1 0.87 0.99 0.92 1585\n","\n"," accuracy 0.93 3657\n"," macro avg 0.93 0.93 0.93 3657\n","weighted avg 0.94 0.93 0.93 3657\n","\n"]}]},{"cell_type":"code","source":["#plot confusion matrix\n","cm = confusion_matrix(y_true, y_pred)\n","# Save the classification report to a file\n","report = classification_report(y_test, y_pred)\n","with open(\"classification_report.txt\", \"w\") as f:\n"," f.write(report)\n","os.chdir(\"/content/drive/MyDrive/Upwork/Fake_news/Results\")\n","# Plot the confusion matrix\n","plt.figure(figsize=(8, 6))\n","sns.heatmap(cm, annot=True, cmap=\"Blues\", fmt=\"d\",)\n","plt.title(\"Confusion Matrix\")\n","plt.xlabel(\"Predicted Class\")\n","plt.ylabel(\"True Class\")\n","plt.savefig(\"confusion_matrix.png\")"],"metadata":{"id":"-yjPvPhV5rSE","colab":{"base_uri":"https://localhost:8080/","height":564},"executionInfo":{"status":"ok","timestamp":1683404897346,"user_tz":-60,"elapsed":1036,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"ae90d320-cee6-459d-debe-746c1c1ac39f"},"id":"-yjPvPhV5rSE","execution_count":36,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAApIAAAIjCAYAAACwHvu2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABM70lEQVR4nO3deVxU9f7H8feAMgiyKApIKW65r2kZmdsVxV3TMnc0S+2ilbhlmSGamKi5ZJn3alphWTezrt5b4hamuGGEmpG7lYC5IqioML8/+jm3CVQ4MYLO63kf5/FwzvnOOZ+Z2/Lp/f2eMyaLxWIRAAAAUEBORV0AAAAA7k40kgAAADCERhIAAACG0EgCAADAEBpJAAAAGEIjCQAAAENoJAEAAGAIjSQAAAAMoZEEAACAITSSAG7p4MGDat++vby8vGQymbR69epCPf+xY8dkMpm0bNmyQj3v3ax169Zq3bp1UZcBALdFIwncBQ4fPqzhw4eratWqcnV1laenp5o3b6558+bp8uXLdr12aGio9u7dq9dff10ffPCBmjZtatfr3UmDBw+WyWSSp6dnnt/jwYMHZTKZZDKZNGvWrAKf/+TJk4qIiFBiYmIhVAsAxU+Joi4AwK2tXbtWTz75pMxmswYNGqR69erp6tWr+vbbbzVu3Djt379fixcvtsu1L1++rPj4eL3yyisaOXKkXa4RGBioy5cvq2TJknY5/+2UKFFCly5d0r///W/17t3b5lhMTIxcXV115coVQ+c+efKkpkyZosqVK6tRo0b5ft+6desMXQ8A7jQaSaAYO3r0qPr06aPAwEBt3LhRFSpUsB4LCwvToUOHtHbtWrtd/7fffpMkeXt72+0aJpNJrq6udjv/7ZjNZjVv3lwfffRRrkZyxYoV6ty5sz777LM7UsulS5fk5uYmFxeXO3I9APirmNoGirGZM2cqIyNDS5YssWkib6hevbpeeOEF6+vr169r6tSpqlatmsxmsypXrqyXX35ZWVlZNu+rXLmyunTpom+//VYPP/ywXF1dVbVqVb3//vvWMREREQoMDJQkjRs3TiaTSZUrV5b0+5TwjT//UUREhEwmk82+2NhYPfbYY/L29lbp0qVVs2ZNvfzyy9bjN1sjuXHjRrVo0ULu7u7y9vZW9+7ddeDAgTyvd+jQIQ0ePFje3t7y8vLSkCFDdOnSpZt/sX/Sr18//fe//9X58+et+3bt2qWDBw+qX79+ucafPXtWY8eOVf369VW6dGl5enqqY8eO+v77761jNm/erIceekiSNGTIEOsU+Y3P2bp1a9WrV08JCQlq2bKl3NzcrN/Ln9dIhoaGytXVNdfnDwkJUZkyZXTy5Ml8f1YAKEw0kkAx9u9//1tVq1bVo48+mq/xzzzzjCZPnqwHH3xQb775plq1aqWoqCj16dMn19hDhw7piSeeULt27TR79myVKVNGgwcP1v79+yVJPXv21JtvvilJ6tu3rz744APNnTu3QPXv379fXbp0UVZWliIjIzV79mx169ZNW7duveX71q9fr5CQEJ06dUoREREKDw/Xtm3b1Lx5cx07dizX+N69e+vixYuKiopS7969tWzZMk2ZMiXfdfbs2VMmk0mrVq2y7luxYoVq1aqlBx98MNf4I0eOaPXq1erSpYvmzJmjcePGae/evWrVqpW1qatdu7YiIyMlScOGDdMHH3ygDz74QC1btrSe58yZM+rYsaMaNWqkuXPnqk2bNnnWN2/ePJUvX16hoaHKzs6WJL377rtat26dFixYoICAgHx/VgAoVBYAxdKFCxcskizdu3fP1/jExESLJMszzzxjs3/s2LEWSZaNGzda9wUGBlokWeLi4qz7Tp06ZTGbzZYxY8ZY9x09etQiyRIdHW1zztDQUEtgYGCuGl577TXLH/+x8uabb1okWX777beb1n3jGu+99551X6NGjSy+vr6WM2fOWPd9//33FicnJ8ugQYNyXe/pp5+2Oefjjz9u8fHxuek1//g53N3dLRaLxfLEE09Y2rZta7FYLJbs7GyLv7+/ZcqUKXl+B1euXLFkZ2fn+hxms9kSGRlp3bdr165cn+2GVq1aWSRZFi1alOexVq1a2ez7+uuvLZIs06ZNsxw5csRSunRpS48ePW77GQHAnkgkgWIqPT1dkuTh4ZGv8f/5z38kSeHh4Tb7x4wZI0m51lLWqVNHLVq0sL4uX768atasqSNHjhiu+c9urK384osvlJOTk6/3pKSkKDExUYMHD1bZsmWt+xs0aKB27dpZP+cfjRgxwuZ1ixYtdObMGet3mB/9+vXT5s2blZqaqo0bNyo1NTXPaW3p93WVTk6//+MzOztbZ86csU7b79mzJ9/XNJvNGjJkSL7Gtm/fXsOHD1dkZKR69uwpV1dXvfvuu/m+FgDYA40kUEx5enpKki5evJiv8cePH5eTk5OqV69us9/f31/e3t46fvy4zf5KlSrlOkeZMmV07tw5gxXn9tRTT6l58+Z65pln5Ofnpz59+uiTTz65ZVN5o86aNWvmOla7dm2dPn1amZmZNvv//FnKlCkjSQX6LJ06dZKHh4dWrlypmJgYPfTQQ7m+yxtycnL05ptv6oEHHpDZbFa5cuVUvnx5JSUl6cKFC/m+5n333VegG2tmzZqlsmXLKjExUfPnz5evr2++3wsA9kAjCRRTnp6eCggI0L59+wr0vj/f7HIzzs7Oee63WCyGr3Fj/d4NpUqVUlxcnNavX6+BAwcqKSlJTz31lNq1a5dr7F/xVz7LDWazWT179tTy5cv1+eef3zSNlKTp06crPDxcLVu21Icffqivv/5asbGxqlu3br6TV+n376cgvvvuO506dUqStHfv3gK9FwDsgUYSKMa6dOmiw4cPKz4+/rZjAwMDlZOTo4MHD9rsT0tL0/nz5613YBeGMmXK2NzhfMOfU09JcnJyUtu2bTVnzhz98MMPev3117Vx40Zt2rQpz3PfqDM5OTnXsR9//FHlypWTu7v7X/sAN9GvXz999913unjxYp43KN3wr3/9S23atNGSJUvUp08ftW/fXsHBwbm+k/w29fmRmZmpIUOGqE6dOho2bJhmzpypXbt2Fdr5AcAIGkmgGBs/frzc3d31zDPPKC0tLdfxw4cPa968eZJ+n5qVlOvO6jlz5kiSOnfuXGh1VatWTRcuXFBSUpJ1X0pKij7//HObcWfPns313hsP5v7zI4luqFChgho1aqTly5fbNGb79u3TunXrrJ/THtq0aaOpU6fqrbfekr+//03HOTs750o7P/30U/366682+240vHk13QU1YcIEnThxQsuXL9ecOXNUuXJlhYaG3vR7BIA7gQeSA8VYtWrVtGLFCj311FOqXbu2zS/bbNu2TZ9++qkGDx4sSWrYsKFCQ0O1ePFinT9/Xq1atdLOnTu1fPly9ejR46aPljGiT58+mjBhgh5//HE9//zzunTpkt555x3VqFHD5maTyMhIxcXFqXPnzgoMDNSpU6f09ttv6/7779djjz120/NHR0erY8eOCgoK0tChQ3X58mUtWLBAXl5eioiIKLTP8WdOTk6aNGnSbcd16dJFkZGRGjJkiB599FHt3btX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\n"},"metadata":{}}]},{"cell_type":"markdown","source":["#### 9.4 Saving and loading model\n"],"metadata":{"id":"SDS1enG7tXwe"},"id":"SDS1enG7tXwe"},{"cell_type":"code","source":["#save model\n","path_to_save = \"/content/drive/MyDrive/Upwork/Fake_news/Models\"\n","os.chdir(path_to_save)\n","model.save_model(\"cb_fakes_news_model.cbm\")\n","#load saved model\n","loaded_model = catboost.CatBoostClassifier()\n","loaded_model.load_model('cb_fakes_news_model.cbm')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"C7DRj8t7tiuw","executionInfo":{"status":"ok","timestamp":1683405004496,"user_tz":-60,"elapsed":314,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"216de1c0-90f8-48e5-ac81-7b7747708764"},"id":"C7DRj8t7tiuw","execution_count":38,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":38}]},{"cell_type":"markdown","source":["#### 10. Prediction pipeline"],"metadata":{"id":"PBlzl7olYzAb"},"id":"PBlzl7olYzAb"},{"cell_type":"code","source":["class Preprocessing:\n"," def __init__(self,data):\n"," self.data = data\n","\n"," def preprocess_text(self):\n"," lm = WordNetLemmatizer()\n"," #initialise corpus to store texts p\n"," pred_data = [self.data]\n"," preprocessed_data = []\n","\n"," for data in pred_data:\n"," review = re.sub(\"a-zA-Z0-9\",\" \",data)\n"," review = review.lower() #convert to lower case\n"," review = review.split() #Tokenize text\n"," review = [lm.lemmatize(x) for x in review if x not in list(stop_words)] #lemmatize and removing stopwords\n"," review = \" \".join(review) #join as text\n"," preprocessed_data.append(review)\n"," \n"," return preprocessed_data\n","\n","class Prediction:\n"," def __init__(self,pred_data,model):\n"," self.pred_data = pred_data\n"," self.model = model\n","\n","\n","\n"," def predict(self):\n"," preprocess_data = Preprocessing(self.pred_data).preprocess_text()\n","\n"," # Load the saved TF-IDF preprocessor using joblib\n"," path = \"/content/drive/MyDrive/Upwork/Fake_news/Artifacts/tfidf_preprocessor.pkl\"\n"," loaded_tfidf = joblib.load(path)\n"," data = loaded_tfidf.transform(preprocess_data)\n"," predicted = self.model.predict(data)\n","\n"," if predicted[0] == 0:\n"," return \"The news is fake\"\n"," else:\n"," return \"The news is real\"\n","\n","\n"," "],"metadata":{"id":"fbk591IfY4ba","executionInfo":{"status":"ok","timestamp":1683407566665,"user_tz":-60,"elapsed":306,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}}},"id":"fbk591IfY4ba","execution_count":80,"outputs":[]},{"cell_type":"code","source":["df[\"title\"][8]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":36},"id":"00t5rh503w3c","executionInfo":{"status":"ok","timestamp":1683406927006,"user_tz":-60,"elapsed":354,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"50f8445a-c79c-4c7c-a513-f357050b2434"},"id":"00t5rh503w3c","execution_count":69,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'Obama’s Organizing for Action Partners with Soros-Linked ‘Indivisible’ to Disrupt Trump’s Agenda'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":69}]},{"cell_type":"code","source":["#make prediction on user data\n","single_data = df[\"title\"][10]\n","pred_ = Prediction(single_data,loaded_model).predict()\n","pred_"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7NKPY7VkyaV6","executionInfo":{"status":"ok","timestamp":1683407698008,"user_tz":-60,"elapsed":332,"user":{"displayName":"Owusu Samuel","userId":"05986356755319312051"}},"outputId":"bf2583c9-0134-4d08-f413-b8d4986def04"},"id":"7NKPY7VkyaV6","execution_count":99,"outputs":[{"output_type":"execute_result","data":{"text/plain":["['russian researcher discover secret nazi military base ‘treasure hunter’ arctic [photos]']"]},"metadata":{},"execution_count":99}]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.16"},"colab":{"provenance":[]}},"nbformat":4,"nbformat_minor":5}