{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":7846701,"sourceType":"datasetVersion","datasetId":4600969}],"dockerImageVersionId":30664,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\n#visualizations\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline\n#consistent sized plot \nfrom pylab import rcParams\nrcParams['figure.figsize']=12,5\nrcParams['axes.labelsize']=12\nrcParams['xtick.labelsize']=12\nrcParams['ytick.labelsize']=12\n#handle the warnings in the code\nimport warnings\nwarnings.filterwarnings(action='ignore',category=DeprecationWarning)\nwarnings.filterwarnings(action='ignore',category=FutureWarning)\n#text preprocessing libraries\nimport nltk\nimport nltk\nfrom nltk.corpus import stopwords\nnltk.download('punkt')\nnltk.download('stopwords')\nfrom nltk.tokenize import word_tokenize\nfrom nltk.tokenize import sent_tokenize\nfrom nltk.tokenize import WordPunctTokenizer\nfrom nltk.tokenize import TweetTokenizer\nfrom nltk.stem import WordNetLemmatizer\nfrom nltk.stem import PorterStemmer\n#import texthero\n#import texthero as hero\n#regular expressions\nimport re\n#display pandas dataframe columns \npd.options.display.max_columns = None\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nfrom mlxtend.plotting import plot_confusion_matrix\n\nfrom sklearn import preprocessing\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.text import Tokenizer\nfrom tensorflow.keras.preprocessing.sequence import pad_sequences\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Embedding, LSTM, Dense, SpatialDropout1D\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom sklearn.utils.class_weight import compute_class_weight\n\nimport numpy as np\nimport tensorflow as tf\nfrom sklearn.utils.class_weight import compute_class_weight\nfrom tensorflow.keras.callbacks import EarlyStopping\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:38:29.366703Z","iopub.execute_input":"2024-03-16T02:38:29.367141Z","iopub.status.idle":"2024-03-16T02:38:48.566586Z","shell.execute_reply.started":"2024-03-16T02:38:29.367093Z","shell.execute_reply":"2024-03-16T02:38:48.565399Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"[nltk_data] Downloading package punkt to /usr/share/nltk_data...\n[nltk_data] Package punkt is already up-to-date!\n[nltk_data] Downloading package stopwords to /usr/share/nltk_data...\n[nltk_data] Package stopwords is already up-to-date!\n","output_type":"stream"},{"name":"stderr","text":"2024-03-16 02:38:36.372092: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n2024-03-16 02:38:36.372273: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n2024-03-16 02:38:36.580592: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n","output_type":"stream"}]},{"cell_type":"code","source":"pip install keras\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:38:48.568968Z","iopub.execute_input":"2024-03-16T02:38:48.569807Z","iopub.status.idle":"2024-03-16T02:39:04.900700Z","shell.execute_reply.started":"2024-03-16T02:38:48.569763Z","shell.execute_reply":"2024-03-16T02:39:04.899274Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/pty.py:89: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.\n pid, fd = os.forkpty()\n","output_type":"stream"},{"name":"stdout","text":"Requirement already satisfied: keras in /opt/conda/lib/python3.10/site-packages (3.0.5)\nRequirement already satisfied: absl-py in /opt/conda/lib/python3.10/site-packages (from keras) (1.4.0)\nRequirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from keras) (1.26.4)\nRequirement already satisfied: rich in /opt/conda/lib/python3.10/site-packages (from keras) (13.7.0)\nRequirement already satisfied: namex in /opt/conda/lib/python3.10/site-packages (from keras) (0.0.7)\nRequirement already satisfied: h5py in /opt/conda/lib/python3.10/site-packages (from keras) (3.10.0)\nRequirement already satisfied: dm-tree in /opt/conda/lib/python3.10/site-packages (from keras) (0.1.8)\nRequirement already satisfied: ml-dtypes in /opt/conda/lib/python3.10/site-packages (from keras) (0.2.0)\nRequirement already satisfied: markdown-it-py>=2.2.0 in /opt/conda/lib/python3.10/site-packages (from rich->keras) (3.0.0)\nRequirement already satisfied: pygments<3.0.0,>=2.13.0 in /opt/conda/lib/python3.10/site-packages (from rich->keras) (2.17.2)\nRequirement already satisfied: mdurl~=0.1 in /opt/conda/lib/python3.10/site-packages (from markdown-it-py>=2.2.0->rich->keras) (0.1.2)\nNote: you may need to restart the kernel to use updated packages.\n","output_type":"stream"}]},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/traindataset/train.csv\")\ndf\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:04.902643Z","iopub.execute_input":"2024-03-16T02:39:04.903008Z","iopub.status.idle":"2024-03-16T02:39:05.057409Z","shell.execute_reply.started":"2024-03-16T02:39:04.902973Z","shell.execute_reply":"2024-03-16T02:39:05.056204Z"},"trusted":true},"execution_count":3,"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\n0 0 0 3 0 \n1 1 1 3 0 \n2 2 2 3 0 \n3 3 3 3 0 \n4 4 4 6 0 \n... ... ... ... ... \n24778 24778 24778 3 0 \n24779 24779 24779 3 0 \n24780 24780 24780 3 0 \n24781 24781 24781 6 0 \n24782 24782 24782 3 0 \n\n offensive_language_count neither_count class \\\n0 0 3 2 \n1 3 0 1 \n2 3 0 1 \n3 2 1 1 \n4 6 0 1 \n... ... ... ... \n24778 2 1 1 \n24779 1 2 2 \n24780 3 0 1 \n24781 6 0 1 \n24782 0 3 2 \n\n tweet \n0 (this text should be deleted) !!! RT @mayasolo... \n1 (this text should be deleted) !!!!! RT @mleew1... \n2 (this text should be deleted) !!!!!!! RT @UrKi... \n3 (this text should be deleted) !!!!!!!!! RT @C_... \n4 (this text should be deleted) !!!!!!!!!!!!! RT... \n... ... \n24778 (this text should be deleted) you's a muthaf**... \n24779 (this text should be deleted) you've gone and ... \n24780 (this text should be deleted) young buck wanna... \n24781 (this text should be deleted) youu got wild bi... \n24782 (this text should be deleted) ~~Ruffled | Ntac... \n\n[24783 rows x 8 columns]","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 \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclasstweet
00030032(this text should be deleted) !!! RT @mayasolo...
11130301(this text should be deleted) !!!!! RT @mleew1...
22230301(this text should be deleted) !!!!!!! RT @UrKi...
33330211(this text should be deleted) !!!!!!!!! RT @C_...
44460601(this text should be deleted) !!!!!!!!!!!!! RT...
...........................
24778247782477830211(this text should be deleted) you's a muthaf**...
24779247792477930122(this text should be deleted) you've gone and ...
24780247802478030301(this text should be deleted) young buck wanna...
24781247812478160601(this text should be deleted) youu got wild bi...
24782247822478230032(this text should be deleted) ~~Ruffled | Ntac...
\n

24783 rows × 8 columns

\n
"},"metadata":{}}]},{"cell_type":"code","source":"df.head(10)","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:05.060130Z","iopub.execute_input":"2024-03-16T02:39:05.060527Z","iopub.status.idle":"2024-03-16T02:39:05.074793Z","shell.execute_reply.started":"2024-03-16T02:39:05.060493Z","shell.execute_reply":"2024-03-16T02:39:05.073830Z"},"trusted":true},"execution_count":4,"outputs":[{"execution_count":4,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\n0 0 0 3 0 \n1 1 1 3 0 \n2 2 2 3 0 \n3 3 3 3 0 \n4 4 4 6 0 \n5 5 5 3 1 \n6 6 6 3 0 \n7 7 7 3 0 \n8 8 8 3 0 \n9 9 9 3 1 \n\n offensive_language_count neither_count class \\\n0 0 3 2 \n1 3 0 1 \n2 3 0 1 \n3 2 1 1 \n4 6 0 1 \n5 2 0 1 \n6 3 0 1 \n7 3 0 1 \n8 3 0 1 \n9 2 0 1 \n\n tweet \n0 (this text should be deleted) !!! RT @mayasolo... \n1 (this text should be deleted) !!!!! RT @mleew1... \n2 (this text should be deleted) !!!!!!! RT @UrKi... \n3 (this text should be deleted) !!!!!!!!! RT @C_... \n4 (this text should be deleted) !!!!!!!!!!!!! RT... \n5 (this text should be deleted) !!!!!!!!!!!!!!!!... \n6 (this text should be deleted) !!!!!!\"@__Bright... \n7 (this text should be deleted) !!!!“@self... \n8 (this text should be deleted) \" & you migh... \n9 (this text should be deleted) \" @rhythmixx_ :h... ","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 \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 \n \n \n \n \n \n \n \n \n \n \n \n
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclasstweet
00030032(this text should be deleted) !!! RT @mayasolo...
11130301(this text should be deleted) !!!!! RT @mleew1...
22230301(this text should be deleted) !!!!!!! RT @UrKi...
33330211(this text should be deleted) !!!!!!!!! RT @C_...
44460601(this text should be deleted) !!!!!!!!!!!!! RT...
55531201(this text should be deleted) !!!!!!!!!!!!!!!!...
66630301(this text should be deleted) !!!!!!\"@__Bright...
77730301(this text should be deleted) !!!!&#8220;@self...
88830301(this text should be deleted) \" &amp; you migh...
99931201(this text should be deleted) \" @rhythmixx_ :h...
\n
"},"metadata":{}}]},{"cell_type":"code","source":"df.isna().sum()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:05.076011Z","iopub.execute_input":"2024-03-16T02:39:05.077034Z","iopub.status.idle":"2024-03-16T02:39:05.098169Z","shell.execute_reply.started":"2024-03-16T02:39:05.076997Z","shell.execute_reply":"2024-03-16T02:39:05.097018Z"},"trusted":true},"execution_count":5,"outputs":[{"execution_count":5,"output_type":"execute_result","data":{"text/plain":"Unnamed: 0.1 0\nUnnamed: 0 0\ncount 0\nhate_speech_count 0\noffensive_language_count 0\nneither_count 0\nclass 0\ntweet 0\ndtype: int64"},"metadata":{}}]},{"cell_type":"code","source":"df.describe()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:05.099512Z","iopub.execute_input":"2024-03-16T02:39:05.100034Z","iopub.status.idle":"2024-03-16T02:39:05.139026Z","shell.execute_reply.started":"2024-03-16T02:39:05.100002Z","shell.execute_reply":"2024-03-16T02:39:05.137877Z"},"trusted":true},"execution_count":6,"outputs":[{"execution_count":6,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\ncount 24783.000000 24783.000000 24783.000000 24783.000000 \nmean 12391.000000 12391.000000 3.243473 0.280515 \nstd 7154.380197 7154.380197 0.883060 0.631851 \nmin 0.000000 0.000000 3.000000 0.000000 \n25% 6195.500000 6195.500000 3.000000 0.000000 \n50% 12391.000000 12391.000000 3.000000 0.000000 \n75% 18586.500000 18586.500000 3.000000 0.000000 \nmax 24782.000000 24782.000000 9.000000 7.000000 \n\n offensive_language_count neither_count class \ncount 24783.000000 24783.000000 24783.000000 \nmean 2.413711 0.549247 1.110277 \nstd 1.399459 1.113299 0.462089 \nmin 0.000000 0.000000 0.000000 \n25% 2.000000 0.000000 1.000000 \n50% 3.000000 0.000000 1.000000 \n75% 3.000000 0.000000 1.000000 \nmax 9.000000 9.000000 2.000000 ","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 \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
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclass
count24783.00000024783.00000024783.00000024783.00000024783.00000024783.00000024783.000000
mean12391.00000012391.0000003.2434730.2805152.4137110.5492471.110277
std7154.3801977154.3801970.8830600.6318511.3994591.1132990.462089
min0.0000000.0000003.0000000.0000000.0000000.0000000.000000
25%6195.5000006195.5000003.0000000.0000002.0000000.0000001.000000
50%12391.00000012391.0000003.0000000.0000003.0000000.0000001.000000
75%18586.50000018586.5000003.0000000.0000003.0000000.0000001.000000
max24782.00000024782.0000009.0000007.0000009.0000009.0000002.000000
\n
"},"metadata":{}}]},{"cell_type":"code","source":"df['class'].value_counts()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:05.140320Z","iopub.execute_input":"2024-03-16T02:39:05.140705Z","iopub.status.idle":"2024-03-16T02:39:05.162895Z","shell.execute_reply.started":"2024-03-16T02:39:05.140675Z","shell.execute_reply":"2024-03-16T02:39:05.161740Z"},"trusted":true},"execution_count":7,"outputs":[{"execution_count":7,"output_type":"execute_result","data":{"text/plain":"class\n1 19190\n2 4163\n0 1430\nName: count, dtype: int64"},"metadata":{}}]},{"cell_type":"code","source":"random = np.random.randint(0,len(df))\nprint(random)\ndf.iloc[random]['tweet']","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:05.164338Z","iopub.execute_input":"2024-03-16T02:39:05.164780Z","iopub.status.idle":"2024-03-16T02:39:05.177130Z","shell.execute_reply.started":"2024-03-16T02:39:05.164751Z","shell.execute_reply":"2024-03-16T02:39:05.176307Z"},"trusted":true},"execution_count":8,"outputs":[{"name":"stdout","text":"11283\n","output_type":"stream"},{"execution_count":8,"output_type":"execute_result","data":{"text/plain":"\"(this text should be deleted) I'm going to punch a bitch if my cleats don't come in😠\""},"metadata":{}}]},{"cell_type":"code","source":"dfs = df.copy()\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:05.178607Z","iopub.execute_input":"2024-03-16T02:39:05.179182Z","iopub.status.idle":"2024-03-16T02:39:05.185210Z","shell.execute_reply.started":"2024-03-16T02:39:05.179150Z","shell.execute_reply":"2024-03-16T02:39:05.184415Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"def remove_stopwords(text):\n stop_words = set(stopwords.words('english'))\n words = nltk.word_tokenize(text)\n filtered_words = [word for word in words if word not in stop_words]\n return filtered_words\ndfs['tweet'] = dfs['tweet'].astype(str)\ndfs['tweet'] = dfs['tweet'].apply(remove_stopwords)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:05.189321Z","iopub.execute_input":"2024-03-16T02:39:05.189918Z","iopub.status.idle":"2024-03-16T02:39:19.302019Z","shell.execute_reply.started":"2024-03-16T02:39:05.189886Z","shell.execute_reply":"2024-03-16T02:39:19.300904Z"},"trusted":true},"execution_count":10,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'].head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:19.303197Z","iopub.execute_input":"2024-03-16T02:39:19.303522Z","iopub.status.idle":"2024-03-16T02:39:19.313912Z","shell.execute_reply.started":"2024-03-16T02:39:19.303494Z","shell.execute_reply":"2024-03-16T02:39:19.312752Z"},"trusted":true},"execution_count":11,"outputs":[{"execution_count":11,"output_type":"execute_result","data":{"text/plain":"0 [(, text, deleted, ), !, !, !, RT, @, mayasolo...\n1 [(, text, deleted, ), !, !, !, !, !, RT, @, ml...\n2 [(, text, deleted, ), !, !, !, !, !, !, !, RT,...\n3 [(, text, deleted, ), !, !, !, !, !, !, !, !, ...\n4 [(, text, deleted, ), !, !, !, !, !, !, !, !, ...\nName: tweet, dtype: object"},"metadata":{}}]},{"cell_type":"code","source":"dfs['tweet'].replace(r'@\\w+','',regex=True,inplace=True)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:19.315420Z","iopub.execute_input":"2024-03-16T02:39:19.316319Z","iopub.status.idle":"2024-03-16T02:39:19.357357Z","shell.execute_reply.started":"2024-03-16T02:39:19.316266Z","shell.execute_reply":"2024-03-16T02:39:19.356076Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'].head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:19.359276Z","iopub.execute_input":"2024-03-16T02:39:19.359996Z","iopub.status.idle":"2024-03-16T02:39:19.370959Z","shell.execute_reply.started":"2024-03-16T02:39:19.359960Z","shell.execute_reply":"2024-03-16T02:39:19.369781Z"},"trusted":true},"execution_count":13,"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"0 [(, text, deleted, ), !, !, !, RT, @, mayasolo...\n1 [(, text, deleted, ), !, !, !, !, !, RT, @, ml...\n2 [(, text, deleted, ), !, !, !, !, !, !, !, RT,...\n3 [(, text, deleted, ), !, !, !, !, !, !, !, !, ...\n4 [(, text, deleted, ), !, !, !, !, !, !, !, !, ...\nName: tweet, dtype: object"},"metadata":{}}]},{"cell_type":"code","source":"dfs['tweet'].replace(r'http\\S+','',regex=True,inplace=True)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:19.372629Z","iopub.execute_input":"2024-03-16T02:39:19.373128Z","iopub.status.idle":"2024-03-16T02:39:19.398068Z","shell.execute_reply.started":"2024-03-16T02:39:19.373098Z","shell.execute_reply":"2024-03-16T02:39:19.397052Z"},"trusted":true},"execution_count":14,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'].head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:19.399394Z","iopub.execute_input":"2024-03-16T02:39:19.400261Z","iopub.status.idle":"2024-03-16T02:39:19.410380Z","shell.execute_reply.started":"2024-03-16T02:39:19.400223Z","shell.execute_reply":"2024-03-16T02:39:19.409227Z"},"trusted":true},"execution_count":15,"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":"0 [(, text, deleted, ), !, !, !, RT, @, mayasolo...\n1 [(, text, deleted, ), !, !, !, !, !, RT, @, ml...\n2 [(, text, deleted, ), !, !, !, !, !, !, !, RT,...\n3 [(, text, deleted, ), !, !, !, !, !, !, !, !, ...\n4 [(, text, deleted, ), !, !, !, !, !, !, !, !, ...\nName: tweet, dtype: object"},"metadata":{}}]},{"cell_type":"code","source":"tokenizer = TweetTokenizer(preserve_case=True)\ndfs['tweet'] = dfs['tweet'].astype(str)\ndfs['tweet'] = dfs['tweet'].apply(tokenizer.tokenize)","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:19.412152Z","iopub.execute_input":"2024-03-16T02:39:19.413013Z","iopub.status.idle":"2024-03-16T02:39:25.994694Z","shell.execute_reply.started":"2024-03-16T02:39:19.412970Z","shell.execute_reply":"2024-03-16T02:39:25.993548Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"code","source":"dfs.head(3)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:25.995962Z","iopub.execute_input":"2024-03-16T02:39:25.996300Z","iopub.status.idle":"2024-03-16T02:39:26.014807Z","shell.execute_reply.started":"2024-03-16T02:39:25.996271Z","shell.execute_reply":"2024-03-16T02:39:26.013541Z"},"trusted":true},"execution_count":17,"outputs":[{"execution_count":17,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\n0 0 0 3 0 \n1 1 1 3 0 \n2 2 2 3 0 \n\n offensive_language_count neither_count class \\\n0 0 3 2 \n1 3 0 1 \n2 3 0 1 \n\n tweet \n0 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ... \n1 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ... \n2 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ... ","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
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclasstweet
00030032[[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...
11130301[[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...
22230301[[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...
\n
"},"metadata":{}}]},{"cell_type":"code","source":"dfs['tweet'].head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:26.015948Z","iopub.execute_input":"2024-03-16T02:39:26.016299Z","iopub.status.idle":"2024-03-16T02:39:26.035085Z","shell.execute_reply.started":"2024-03-16T02:39:26.016269Z","shell.execute_reply":"2024-03-16T02:39:26.033838Z"},"trusted":true},"execution_count":18,"outputs":[{"execution_count":18,"output_type":"execute_result","data":{"text/plain":"0 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n1 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n2 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n3 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n4 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\nName: tweet, dtype: object"},"metadata":{}}]},{"cell_type":"code","source":"def remove_hashsymbols(text):\n '''Function to remove the hashtag symbol from the text'''\n pattern = re.compile(r'#')\n text = ' '.join(text)\n clean_text = re.sub(pattern,'',text)\n return tokenizer.tokenize(clean_text) \n\ndfs['tweet'] = dfs['tweet'].apply(remove_hashsymbols)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:26.037149Z","iopub.execute_input":"2024-03-16T02:39:26.038245Z","iopub.status.idle":"2024-03-16T02:39:34.943953Z","shell.execute_reply.started":"2024-03-16T02:39:26.038209Z","shell.execute_reply":"2024-03-16T02:39:34.942616Z"},"trusted":true},"execution_count":19,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'].head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:34.945463Z","iopub.execute_input":"2024-03-16T02:39:34.945835Z","iopub.status.idle":"2024-03-16T02:39:34.957903Z","shell.execute_reply.started":"2024-03-16T02:39:34.945802Z","shell.execute_reply":"2024-03-16T02:39:34.956666Z"},"trusted":true},"execution_count":20,"outputs":[{"execution_count":20,"output_type":"execute_result","data":{"text/plain":"0 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n1 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n2 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n3 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\n4 [[, ', (, ', ,, ', text, ', ,, ', deleted, ', ...\nName: tweet, dtype: object"},"metadata":{}}]},{"cell_type":"code","source":"def rem_shortwords(text):\n words = word_tokenize(text)\n filtered_words = [word.lower() for word in words if len(word) > 2] # Convert words to lowercase, filter out short words, and exclude specified words\n new_text = ' '.join(filtered_words)\n return new_text\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:34.959572Z","iopub.execute_input":"2024-03-16T02:39:34.960037Z","iopub.status.idle":"2024-03-16T02:39:34.970554Z","shell.execute_reply.started":"2024-03-16T02:39:34.959989Z","shell.execute_reply":"2024-03-16T02:39:34.969264Z"},"trusted":true},"execution_count":21,"outputs":[]},{"cell_type":"code","source":"\ndfs['tweet'] = dfs['tweet'].astype(str)\n\ndfs['tweet'] = dfs['tweet'].apply(rem_shortwords)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:39:34.972276Z","iopub.execute_input":"2024-03-16T02:39:34.972900Z","iopub.status.idle":"2024-03-16T02:40:13.829104Z","shell.execute_reply.started":"2024-03-16T02:39:34.972853Z","shell.execute_reply":"2024-03-16T02:40:13.828062Z"},"trusted":true},"execution_count":22,"outputs":[]},{"cell_type":"code","source":"dfs.head(3)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:13.830672Z","iopub.execute_input":"2024-03-16T02:40:13.830987Z","iopub.status.idle":"2024-03-16T02:40:13.843753Z","shell.execute_reply.started":"2024-03-16T02:40:13.830958Z","shell.execute_reply":"2024-03-16T02:40:13.842364Z"},"trusted":true},"execution_count":23,"outputs":[{"execution_count":23,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\n0 0 0 3 0 \n1 1 1 3 0 \n2 2 2 3 0 \n\n offensive_language_count neither_count class \\\n0 0 3 2 \n1 3 0 1 \n2 3 0 1 \n\n tweet \n0 'text 'deleted 'rt 'mayasolovely 'as 'woman n'... \n1 'text 'deleted 'rt 'mleew '17 'boy 'dats 'cold... \n2 'text 'deleted 'rt 'urkindofbrand 'dawg 'rt '8... ","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
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclasstweet
00030032'text 'deleted 'rt 'mayasolovely 'as 'woman n'...
11130301'text 'deleted 'rt 'mleew '17 'boy 'dats 'cold...
22230301'text 'deleted 'rt 'urkindofbrand 'dawg 'rt '8...
\n
"},"metadata":{}}]},{"cell_type":"code","source":"dfs['tweet'] = dfs['tweet'].apply(tokenizer.tokenize)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:13.845669Z","iopub.execute_input":"2024-03-16T02:40:13.846613Z","iopub.status.idle":"2024-03-16T02:40:16.685598Z","shell.execute_reply.started":"2024-03-16T02:40:13.846555Z","shell.execute_reply":"2024-03-16T02:40:16.684305Z"},"trusted":true},"execution_count":24,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'].head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:16.686932Z","iopub.execute_input":"2024-03-16T02:40:16.687307Z","iopub.status.idle":"2024-03-16T02:40:16.699681Z","shell.execute_reply.started":"2024-03-16T02:40:16.687274Z","shell.execute_reply":"2024-03-16T02:40:16.698318Z"},"trusted":true},"execution_count":25,"outputs":[{"execution_count":25,"output_type":"execute_result","data":{"text/plain":"0 [', text, ', deleted, ', rt, ', mayasolovely, ...\n1 [', text, ', deleted, ', rt, ', mleew, ', 17, ...\n2 [', text, ', deleted, ', rt, ', urkindofbrand,...\n3 [', text, ', deleted, ', rt, ', c_g_anderson, ...\n4 [', text, ', deleted, ', rt, ', shenikaroberts...\nName: tweet, dtype: object"},"metadata":{}}]},{"cell_type":"code","source":"def rem_digits(text):\n '''Function to remove the digits from the list of strings'''\n no_digits = []\n for word in text:\n no_digits.append(re.sub(r'\\d','',word))\n return ' '.join(no_digits) ","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:16.701222Z","iopub.execute_input":"2024-03-16T02:40:16.701699Z","iopub.status.idle":"2024-03-16T02:40:16.711798Z","shell.execute_reply.started":"2024-03-16T02:40:16.701658Z","shell.execute_reply":"2024-03-16T02:40:16.710506Z"},"trusted":true},"execution_count":26,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'] = dfs['tweet'].apply(rem_digits)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:16.713219Z","iopub.execute_input":"2024-03-16T02:40:16.713700Z","iopub.status.idle":"2024-03-16T02:40:17.781822Z","shell.execute_reply.started":"2024-03-16T02:40:16.713645Z","shell.execute_reply":"2024-03-16T02:40:17.780644Z"},"trusted":true},"execution_count":27,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'] = dfs['tweet'].apply(tokenizer.tokenize)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:17.788576Z","iopub.execute_input":"2024-03-16T02:40:17.788947Z","iopub.status.idle":"2024-03-16T02:40:21.065025Z","shell.execute_reply.started":"2024-03-16T02:40:17.788919Z","shell.execute_reply":"2024-03-16T02:40:21.063912Z"},"trusted":true},"execution_count":28,"outputs":[]},{"cell_type":"code","source":"dfs.head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:21.066174Z","iopub.execute_input":"2024-03-16T02:40:21.066513Z","iopub.status.idle":"2024-03-16T02:40:21.083597Z","shell.execute_reply.started":"2024-03-16T02:40:21.066485Z","shell.execute_reply":"2024-03-16T02:40:21.082325Z"},"trusted":true},"execution_count":29,"outputs":[{"execution_count":29,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\n0 0 0 3 0 \n1 1 1 3 0 \n2 2 2 3 0 \n3 3 3 3 0 \n4 4 4 6 0 \n\n offensive_language_count neither_count class \\\n0 0 3 2 \n1 3 0 1 \n2 3 0 1 \n3 2 1 1 \n4 6 0 1 \n\n tweet \n0 [', text, ', deleted, ', rt, ', mayasolovely, ... \n1 [', text, ', deleted, ', rt, ', mleew, ', ', b... \n2 [', text, ', deleted, ', rt, ', urkindofbrand,... \n3 [', text, ', deleted, ', rt, ', c_g_anderson, ... \n4 [', text, ', deleted, ', rt, ', shenikaroberts... ","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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclasstweet
00030032[', text, ', deleted, ', rt, ', mayasolovely, ...
11130301[', text, ', deleted, ', rt, ', mleew, ', ', b...
22230301[', text, ', deleted, ', rt, ', urkindofbrand,...
33330211[', text, ', deleted, ', rt, ', c_g_anderson, ...
44460601[', text, ', deleted, ', rt, ', shenikaroberts...
\n
"},"metadata":{}}]},{"cell_type":"code","source":"def rem_nonalpha(text):\n '''Function to remove the non-alphanumeric characters from the text'''\n text = [word for word in text if word.isalpha()]\n return text","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:21.085363Z","iopub.execute_input":"2024-03-16T02:40:21.085897Z","iopub.status.idle":"2024-03-16T02:40:21.094562Z","shell.execute_reply.started":"2024-03-16T02:40:21.085852Z","shell.execute_reply":"2024-03-16T02:40:21.092783Z"},"trusted":true},"execution_count":30,"outputs":[]},{"cell_type":"code","source":"dfs['tweet'] = dfs['tweet'].apply(rem_nonalpha)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:21.096056Z","iopub.execute_input":"2024-03-16T02:40:21.096528Z","iopub.status.idle":"2024-03-16T02:40:21.199888Z","shell.execute_reply.started":"2024-03-16T02:40:21.096487Z","shell.execute_reply":"2024-03-16T02:40:21.198751Z"},"trusted":true},"execution_count":31,"outputs":[]},{"cell_type":"code","source":"dfs.head()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:21.201120Z","iopub.execute_input":"2024-03-16T02:40:21.201475Z","iopub.status.idle":"2024-03-16T02:40:21.216254Z","shell.execute_reply.started":"2024-03-16T02:40:21.201446Z","shell.execute_reply":"2024-03-16T02:40:21.215055Z"},"trusted":true},"execution_count":32,"outputs":[{"execution_count":32,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\n0 0 0 3 0 \n1 1 1 3 0 \n2 2 2 3 0 \n3 3 3 3 0 \n4 4 4 6 0 \n\n offensive_language_count neither_count class \\\n0 0 3 2 \n1 3 0 1 \n2 3 0 1 \n3 2 1 1 \n4 6 0 1 \n\n tweet \n0 [text, deleted, rt, mayasolovely, as, woman, c... \n1 [text, deleted, rt, mleew, boy, dats, cold, ty... \n2 [text, deleted, rt, urkindofbrand, dawg, rt, s... \n3 [text, deleted, rt, look, like, tranny] \n4 [text, deleted, rt, shenikaroberts, the, shit,... ","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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclasstweet
00030032[text, deleted, rt, mayasolovely, as, woman, c...
11130301[text, deleted, rt, mleew, boy, dats, cold, ty...
22230301[text, deleted, rt, urkindofbrand, dawg, rt, s...
33330211[text, deleted, rt, look, like, tranny]
44460601[text, deleted, rt, shenikaroberts, the, shit,...
\n
"},"metadata":{}}]},{"cell_type":"code","source":"dfs['tweet'] = dfs['tweet'].apply(lambda x: ' '.join(x))\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:21.217891Z","iopub.execute_input":"2024-03-16T02:40:21.218278Z","iopub.status.idle":"2024-03-16T02:40:21.252498Z","shell.execute_reply.started":"2024-03-16T02:40:21.218247Z","shell.execute_reply":"2024-03-16T02:40:21.251131Z"},"trusted":true},"execution_count":33,"outputs":[]},{"cell_type":"code","source":"random = np.random.randint(0,len(df))\nprint(random)\ndfs.iloc[random]['tweet']","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:52.361713Z","iopub.execute_input":"2024-03-16T02:40:52.362583Z","iopub.status.idle":"2024-03-16T02:40:52.372177Z","shell.execute_reply.started":"2024-03-16T02:40:52.362544Z","shell.execute_reply":"2024-03-16T02:40:52.370810Z"},"trusted":true},"execution_count":40,"outputs":[{"name":"stdout","text":"9041\n","output_type":"stream"},{"execution_count":40,"output_type":"execute_result","data":{"text/plain":"'text deleted facebook birds'"},"metadata":{}}]},{"cell_type":"code","source":"dfs.head(3)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:21.266401Z","iopub.execute_input":"2024-03-16T02:40:21.266953Z","iopub.status.idle":"2024-03-16T02:40:21.285546Z","shell.execute_reply.started":"2024-03-16T02:40:21.266919Z","shell.execute_reply":"2024-03-16T02:40:21.284291Z"},"trusted":true},"execution_count":35,"outputs":[{"execution_count":35,"output_type":"execute_result","data":{"text/plain":" Unnamed: 0.1 Unnamed: 0 count hate_speech_count \\\n0 0 0 3 0 \n1 1 1 3 0 \n2 2 2 3 0 \n\n offensive_language_count neither_count class \\\n0 0 3 2 \n1 3 0 1 \n2 3 0 1 \n\n tweet \n0 text deleted rt mayasolovely as woman complain... \n1 text deleted rt mleew boy dats cold tyga dwn b... \n2 text deleted rt urkindofbrand dawg rt sbabylif... ","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
Unnamed: 0.1Unnamed: 0counthate_speech_countoffensive_language_countneither_countclasstweet
00030032text deleted rt mayasolovely as woman complain...
11130301text deleted rt mleew boy dats cold tyga dwn b...
22230301text deleted rt urkindofbrand dawg rt sbabylif...
\n
"},"metadata":{}}]},{"cell_type":"code","source":"token = Tokenizer(28164)\ntoken.fit_on_texts(dfs['tweet'])\ntext = token.texts_to_sequences(dfs['tweet'])\ntext = pad_sequences(text, maxlen=100)","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:21.287477Z","iopub.execute_input":"2024-03-16T02:40:21.288266Z","iopub.status.idle":"2024-03-16T02:40:22.495929Z","shell.execute_reply.started":"2024-03-16T02:40:21.288202Z","shell.execute_reply":"2024-03-16T02:40:22.494653Z"},"trusted":true},"execution_count":36,"outputs":[]},{"cell_type":"code","source":"X = dfs['tweet']\ny = dfs['class']","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:22.498681Z","iopub.execute_input":"2024-03-16T02:40:22.499568Z","iopub.status.idle":"2024-03-16T02:40:22.505492Z","shell.execute_reply.started":"2024-03-16T02:40:22.499523Z","shell.execute_reply":"2024-03-16T02:40:22.504223Z"},"trusted":true},"execution_count":37,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntest_size = 0.20 #20% of the data in the \nX_train,X_test,y_train,y_test = train_test_split(text,y,test_size=0.20,random_state=42,stratify=dfs['class'])\nprint(X_train.shape,X_test.shape,y_train.shape,y_test.shape)","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:40:22.506750Z","iopub.execute_input":"2024-03-16T02:40:22.507145Z","iopub.status.idle":"2024-03-16T02:40:22.543431Z","shell.execute_reply.started":"2024-03-16T02:40:22.507118Z","shell.execute_reply":"2024-03-16T02:40:22.542120Z"},"trusted":true},"execution_count":38,"outputs":[{"name":"stdout","text":"(19826, 100) (4957, 100) (19826,) (4957,)\n","output_type":"stream"}]},{"cell_type":"code","source":"from tensorflow.keras.callbacks import EarlyStopping\nmodel = tf.keras.Sequential([\n tf.keras.layers.Embedding(input_dim=24071, output_dim=32),\n tf.keras.layers.LSTM(32, dropout=0.2), # Add dropout to LSTM layer\n tf.keras.layers.Dense(3, activation='softmax')\n])\n\n# Compile the model\nmodel.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n\n# Define early stopping\nearly_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True) \n# Stop training if validation loss does not improve after 3 epochs, restore best weights\n\n# Train the model with early stopping\nhistory = model.fit(X_train, y_train, validation_split=0.2, epochs=3, batch_size=16, callbacks=[early_stopping]) \n","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:43:22.950096Z","iopub.execute_input":"2024-03-16T02:43:22.950602Z","iopub.status.idle":"2024-03-16T02:45:28.470200Z","shell.execute_reply.started":"2024-03-16T02:43:22.950566Z","shell.execute_reply":"2024-03-16T02:45:28.469183Z"},"trusted":true},"execution_count":41,"outputs":[{"name":"stdout","text":"Epoch 1/3\n\u001b[1m992/992\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m42s\u001b[0m 39ms/step - accuracy: 0.8117 - loss: 0.5500 - val_accuracy: 0.9065 - val_loss: 0.2622\nEpoch 2/3\n\u001b[1m992/992\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 39ms/step - accuracy: 0.9238 - loss: 0.2265 - val_accuracy: 0.9130 - val_loss: 0.2464\nEpoch 3/3\n\u001b[1m992/992\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 39ms/step - accuracy: 0.9528 - loss: 0.1438 - val_accuracy: 0.8994 - val_loss: 0.2943\n","output_type":"stream"}]},{"cell_type":"code","source":"loss, accuracy = model.evaluate(X_test, y_test)\nprint(f'Test Accuracy: {accuracy}')","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:45:34.299707Z","iopub.execute_input":"2024-03-16T02:45:34.300409Z","iopub.status.idle":"2024-03-16T02:45:36.929295Z","shell.execute_reply.started":"2024-03-16T02:45:34.300374Z","shell.execute_reply":"2024-03-16T02:45:36.928069Z"},"trusted":true},"execution_count":42,"outputs":[{"name":"stdout","text":"\u001b[1m155/155\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 11ms/step - accuracy: 0.9075 - loss: 0.2566\nTest Accuracy: 0.900948166847229\n","output_type":"stream"}]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\n\ny_pred = model.predict(X_test)\n\ny_pred_labels = np.argmax(y_pred, axis=1)\n\nprint('Classification Report Testing set')\nprint('\\n')\nprint(classification_report(y_test,y_pred_labels))","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:45:43.012788Z","iopub.execute_input":"2024-03-16T02:45:43.013502Z","iopub.status.idle":"2024-03-16T02:45:45.485938Z","shell.execute_reply.started":"2024-03-16T02:45:43.013458Z","shell.execute_reply":"2024-03-16T02:45:45.484530Z"},"trusted":true},"execution_count":43,"outputs":[{"name":"stdout","text":"\u001b[1m155/155\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 14ms/step\nClassification Report Testing set\n\n\n precision recall f1-score support\n\n 0 0.49 0.26 0.34 286\n 1 0.94 0.95 0.94 3838\n 2 0.82 0.91 0.86 833\n\n accuracy 0.90 4957\n macro avg 0.75 0.70 0.71 4957\nweighted avg 0.89 0.90 0.89 4957\n\n","output_type":"stream"}]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\n\ny_train_pred = model.predict(X_train)\n\ny_train_pred_labels = np.argmax(y_train_pred, axis=1)\nprint('Classification Report training set')\nprint('\\n')\ntrain_report = classification_report(y_train, y_train_pred_labels)\n\nprint(train_report)","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:45:55.927882Z","iopub.execute_input":"2024-03-16T02:45:55.928643Z","iopub.status.idle":"2024-03-16T02:46:03.185520Z","shell.execute_reply.started":"2024-03-16T02:45:55.928607Z","shell.execute_reply":"2024-03-16T02:46:03.184440Z"},"trusted":true},"execution_count":44,"outputs":[{"name":"stdout","text":"\u001b[1m620/620\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 11ms/step\nClassification Report training set\n\n\n precision recall f1-score support\n\n 0 0.75 0.53 0.62 1144\n 1 0.96 0.97 0.97 15352\n 2 0.92 0.96 0.94 3330\n\n accuracy 0.95 19826\n macro avg 0.88 0.82 0.84 19826\nweighted avg 0.94 0.95 0.94 19826\n\n","output_type":"stream"}]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\ny_pred = model.predict(X_test)\n\ny_pred_labels = np.argmax(y_pred, axis=1)\n\ncm = confusion_matrix(y_test, y_pred_labels)\n\nplt.figure(figsize=(8, 6))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=[0, 1, 2], yticklabels=[0, 1, 2])\nplt.xlabel('Predicted Labels')\nplt.ylabel('True Labels')\nplt.title('Confusion Matrix')\nplt.show()\nprint(cm)","metadata":{"execution":{"iopub.status.busy":"2024-03-16T02:46:09.969169Z","iopub.execute_input":"2024-03-16T02:46:09.969603Z","iopub.status.idle":"2024-03-16T02:46:12.266030Z","shell.execute_reply.started":"2024-03-16T02:46:09.969558Z","shell.execute_reply":"2024-03-16T02:46:12.264923Z"},"trusted":true},"execution_count":45,"outputs":[{"name":"stdout","text":"\u001b[1m155/155\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 11ms/step\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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gAB7hwQATuvKlStq1aqVLl++rB9++IE/I4G7UAlFpgQGBioyMlLx8fEW7fv27TMfBwDcniFq166dIiMjtXHjRlWpUsXRIQFOhSQUmdKpUyelpKToo48+MrclJydr0aJFqlu3rooXL+7A6ADAOaSkpKhr167as2ePVq1apXr16jk6JMDpMB2PTKlbt646d+6s0aNHKy4uTuXKldOSJUt08uRJLVy40NHhIQebO3euLl++bN6hYcOGDTpz5owkaciQIfL29nZkeMhhRowYofXr16tdu3a6ePFims3pn3vuOQdFBjgP3piETEtKStJbb72lZcuW6dKlS6pRo4YmTpyoli1bOjo05GClSpXSqVOn0j124sQJlSpVyr4BIUdr3Lixvvvuu/se5z+9AEkoAAAAHIA1oQAAALA7klAAAADYHUkoAAAA7I4kFAAAAHZHEgoAAAC7IwkFAACA3ZGEAgAAwO5IQgEAAGB3JKEAAACwO5JQADZRqlQp9enTx/x9586dMhgM2rlzp8Niute9MdpD48aNVa1aNZuO6Yj7AABbIwkFHgGLFy+WwWAwf9zd3VWhQgW9/PLLOnv2rKPDy5RNmzZp3LhxDo3BYDDo5ZdfdmgMAPCoy+XoAADYzoQJE1S6dGklJSVp165d+vDDD7Vp0yb99ttvypMnj11jCQkJUWJiotzc3DJ13qZNm/TBBx84PBEFAGQvklDgEdKqVSvVrl1bktSvXz8VKFBAM2fO1Lp16/Tss8+me861a9fk6elp81hcXFzk7u5u83EBAI8GpuOBR9iTTz4pSTpx4oQkqU+fPvLy8tJff/2l1q1bK2/evOrRo4ckKTU1VbNnz1bVqlXl7u6uwoULa8CAAbp06ZLFmCaTSe+8846KFSumPHnyqEmTJjp69Giaa99vTei+ffvUunVr+fj4yNPTUzVq1NB7771nju+DDz6QJIvlBXfYOsYHsW7dOrVp00YBAQEyGo0qW7asJk6cqJSUlHT7//TTTwoODpaHh4dKly6t+fPnp+mTnJyssWPHqly5cjIajSpevLhGjRql5OTkf43l5s2bGj9+vMqXLy93d3cVKFBADRo00NatW21yrwCQHaiEAo+wv/76S5JUoEABc9utW7fUsmVLNWjQQNOnTzdP0w8YMECLFy9W3759NXToUJ04cUJz587VoUOH9OOPPyp37tySpLffflvvvPOOWrdurdatW+vnn39WixYtdOPGDavxbN26VW3btpW/v7+GDRumIkWKKCIiQhs3btSwYcM0YMAARUdHa+vWrVq6dGma8+0RY0YtXrxYXl5eCgsLk5eXl7Zv3663335b8fHxmjZtmkXfS5cuqXXr1urSpYueffZZrVy5UgMHDpSbm5uef/55SbcT7Pbt22vXrl3q37+/KleurCNHjmjWrFmKjIzU2rVr7xvLuHHjFB4ern79+ikoKEjx8fE6ePCgfv75ZzVv3txm9wwANmUC8NBbtGiRSZJp27ZtpnPnzplOnz5t+vzzz00FChQweXh4mM6cOWMymUym3r17mySZXn/9dYvzf/jhB5Mk0/Llyy3av/nmG4v2uLg4k5ubm6lNmzam1NRUc7833njDJMnUu3dvc9uOHTtMkkw7duwwmUwm061bt0ylS5c2lSxZ0nTp0iWL69w91uDBg03p/dGUHTHejyTT4MGD/7XP9evX07QNGDDAlCdPHlNSUpK5rVGjRiZJphkzZpjbkpOTTYGBgaZChQqZbty4YTKZTKalS5eaXFxcTD/88IPFmPPnzzdJMv3444/mtpIlS1rcx2OPPWZq06aN1fsCAGfCdDzwCGnWrJn8/PxUvHhxdevWTV5eXvryyy9VtGhRi34DBw60+L5q1Sp5e3urefPmOn/+vPlTq1YteXl5aceOHZKkbdu26caNGxoyZIjFNPnw4cOtxnbo0CGdOHFCw4cPV/78+S2O3T3W/dgjxszw8PAw//PVq1d1/vx5NWzYUNevX9exY8cs+ubKlUsDBgwwf3dzc9OAAQMUFxenn376yXx/lStXVqVKlSzu786Sijv3l578+fPr6NGjOn78uC1vEQCyFdPxwCPkgw8+UIUKFZQrVy4VLlxYFStWlIuL5d81c+XKpWLFilm0HT9+XFeuXFGhQoXSHTcuLk6SdOrUKUlS+fLlLY77+fnJx8fnX2O7szQgq3tm2iPGzDh69KjefPNNbd++XfHx8RbHrly5YvE9ICAgzcNfFSpUkCSdPHlSTzzxhI4fP66IiAj5+fmle70795eeCRMmqEOHDqpQoYKqVaum0NBQ9ezZUzVq1MjKrQGAXZCEAo+QoKAg89Px92M0GtMkpqmpqSpUqJCWL1+e7jn3S4zsyZlivHz5sho1aqR8+fJpwoQJKlu2rNzd3fXzzz/rtddeU2pqaqbHTE1NVfXq1TVz5sx0jxcvXvy+54aEhOivv/7SunXrtGXLFn3yySeaNWuW5s+fr379+mU6FgCwB5JQACpbtqy2bdum+vXrW0wz36tkyZKSblcly5QpY24/d+5cmifU07uGJP32229q1qzZffvdb2reHjFm1M6dO3XhwgV98cUXCgkJMbff2YXgXtHR0Wm2woqMjJR0++1H0u37++WXX9S0adMMLU+4l6+vr/r27au+ffsqISFBISEhGjduHEkoAKfFmlAA6tKli1JSUjRx4sQ0x27duqXLly9Lur3mNHfu3JozZ45MJpO5z+zZs61e4/HHH1fp0qU1e/Zs83h33D3WnUTt3j72iDGjXF1d08R948YNzZs3L93+t27d0oIFCyz6LliwQH5+fqpVq5ak2/cXFRWljz/+OM35iYmJunbt2n3juXDhgsV3Ly8vlStXzurWTgDgSFRCAahRo0YaMGCAwsPDdfjwYbVo0UK5c+fW8ePHtWrVKr333nvq1KmT/Pz8NHLkSIWHh6tt27Zq3bq1Dh06pK+//loFCxb812u4uLjoww8/VLt27RQYGKi+ffvK399fx44d09GjR7V582ZJMidlQ4cOVcuWLeXq6qpu3brZJca7HTx4UO+8806a9saNGys4OFg+Pj7q3bu3hg4dKoPBoKVLl1okpXcLCAjQlClTdPLkSVWoUEH//e9/dfjwYX300UfmbaV69uyplStX6qWXXtKOHTtUv359paSk6NixY1q5cqU2b95836UWVapUUePGjVWrVi35+vrq4MGDWr16Na8eBeDcHPpsPgCbuLNF04EDB/61X+/evU2enp73Pf7RRx+ZatWqZfLw8DDlzZvXVL16ddOoUaNM0dHR5j4pKSmm8ePHm/z9/U0eHh6mxo0bm3777bc02wbdu0XTHbt27TI1b97clDdvXpOnp6epRo0apjlz5piP37p1yzRkyBCTn5+fyWAwpNmuyZYx3o+k+34mTpxoMplMph9//NH0xBNPmDw8PEwBAQGmUaNGmTZv3pzmnhs1amSqWrWq6eDBg6Z69eqZ3N3dTSVLljTNnTs3zXVv3LhhmjJliqlq1aomo9Fo8vHxMdWqVcs0fvx405UrV8z97r2Pd955xxQUFGTKnz+/ycPDw1SpUiXTu+++a97+CQCckcFkus9f3QEAAIBswppQAAAA2B1JKAAAAOyOJBQAAAB2RxIKAAAAuyMJBQAAgN2RhAIAAMDuSEIBAABgdyShAAAAsDuSUAAAANgdSSgAAADsjiQUAAAAdkcSCgAAALv7P6B7kOj3GKcnAAAAAElFTkSuQmCC"},"metadata":{}},{"name":"stdout","text":"[[ 74 179 33]\n [ 72 3635 131]\n [ 5 71 757]]\n","output_type":"stream"}]}]}