File size: 56,940 Bytes
d5b795c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## This Model Allows Sentiment Analysis using Support Vector Machine Algorithm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### This model is comprised of different steps as listed below:\n",
    "1. Importing Libraries\n",
    "2. Data Loading\n",
    "3. Data Cleaning\n",
    "4. Data Preprocessing\n",
    "5. Train Test Split\n",
    "6. Model Training\n",
    "7. Model Evaluation\n",
    "8. Pickle Export"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Importing Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn import svm\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, ConfusionMatrixDisplay\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.pipeline import Pipeline\n",
    "import joblib"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Data Load"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('Tweets.csv')  # Load dataset\n",
    "df = df[['text', 'airline_sentiment']]  # Ensure these columns exist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Data Cleaning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    }
   ],
   "source": [
    "print(df['airline_sentiment'].isnull().sum())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.dropna(subset=['airline_sentiment'])\n",
    "df['airline_sentiment'] = df['airline_sentiment'].map({\n",
    "    'positive': 2,\n",
    "    'neutral': 1,\n",
    "    'negative': 0\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Train Test Split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Split dataset\n",
    "X = df['text']\n",
    "y = df['airline_sentiment']\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y , test_size=0.33, random_state=42\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Model Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "#model pipelining\n",
    "\n",
    "model = Pipeline([\n",
    "    ('tfidf', TfidfVectorizer(max_features=10000, ngram_range=(1,2), stop_words='english')),\n",
    "    ('svm', svm.SVC(kernel='linear', probability=True, class_weight='balanced'))])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[(&#x27;tfidf&#x27;,\n",
       "                 TfidfVectorizer(max_features=10000, ngram_range=(1, 2),\n",
       "                                 stop_words=&#x27;english&#x27;)),\n",
       "                (&#x27;svm&#x27;,\n",
       "                 SVC(class_weight=&#x27;balanced&#x27;, kernel=&#x27;linear&#x27;,\n",
       "                     probability=True))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>Pipeline</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[(&#x27;tfidf&#x27;,\n",
       "                 TfidfVectorizer(max_features=10000, ngram_range=(1, 2),\n",
       "                                 stop_words=&#x27;english&#x27;)),\n",
       "                (&#x27;svm&#x27;,\n",
       "                 SVC(class_weight=&#x27;balanced&#x27;, kernel=&#x27;linear&#x27;,\n",
       "                     probability=True))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>TfidfVectorizer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html\">?<span>Documentation for TfidfVectorizer</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>TfidfVectorizer(max_features=10000, ngram_range=(1, 2), stop_words=&#x27;english&#x27;)</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SVC</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a></div></label><div class=\"sk-toggleable__content fitted\"><pre>SVC(class_weight=&#x27;balanced&#x27;, kernel=&#x27;linear&#x27;, probability=True)</pre></div> </div></div></div></div></div></div>"
      ],
      "text/plain": [
       "Pipeline(steps=[('tfidf',\n",
       "                 TfidfVectorizer(max_features=10000, ngram_range=(1, 2),\n",
       "                                 stop_words='english')),\n",
       "                ('svm',\n",
       "                 SVC(class_weight='balanced', kernel='linear',\n",
       "                     probability=True))])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#model training\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Model Evaluation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model Accuracy: 0.7510\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "    negative       0.88      0.79      0.83      3085\n",
      "     neutral       0.51      0.64      0.57       984\n",
      "    positive       0.67      0.73      0.70       763\n",
      "\n",
      "    accuracy                           0.75      4832\n",
      "   macro avg       0.69      0.72      0.70      4832\n",
      "weighted avg       0.77      0.75      0.76      4832\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Evaluate model\n",
    "y_pred = model.predict(X_test)\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "\n",
    "#Display model accuracy\n",
    "print(f\"Model Accuracy: {accuracy:.4f}\")\n",
    "\n",
    "# Display classification report\n",
    "print(\"\\nClassification Report:\")\n",
    "print(classification_report(y_test, y_pred, target_names=['negative', 'neutral', 'positive']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAHHCAYAAABdm0mZAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAV0BJREFUeJzt3Qd8U+XXwPHTslfZe+8NMvwzFBAQEJCtqCB7yFaGIogsAZE9RIayRQFRUNnIFhAQWbKXsvcoq8y8n/PwJjalDS1Nx739ff1c2+Te3NwkNDk55zzP9XE4HA4BAACwGd+oPgAAAICIQJADAABsiSAHAADYEkEOAACwJYIcAABgSwQ5AADAlghyAACALRHkAAAAWyLIAQAAtkSQA8QQR44ckapVq0rSpEnFx8dHFi1a5NX9//PPP2a/M2bM8Op+reyVV14xC4CoQZADRKJjx47Je++9Jzly5JD48eOLn5+fvPTSSzJ27Fi5e/duhN53s2bNZO/evTJ48GCZPXu2lCxZUuyiefPmJsDS5zO451EDPF2vy4gRI8K8/7Nnz0r//v1l165dXjpiAJEhdqTcCwBZsmSJvPnmmxIvXjxp2rSpFCpUSO7fvy+///67fPjhh7Jv3z6ZMmVKhNy3fvBv2bJFPvnkE+nUqVOE3EfWrFnN/cSJE0eiQuzYseXOnTvy66+/SsOGDd3WzZkzxwSVAQEBz7VvDXIGDBgg2bJlkxdeeCHUt1u5cuVz3R8A7yDIASLBiRMn5O233zaBwJo1ayR9+vSudR07dpSjR4+aICiiXLp0yfxMlixZhN2HZkk0kIgqGjxqVuz7779/Ksj57rvvpGbNmvLjjz9GyrFosJUwYUKJGzdupNwfgOBRrgIiwbBhw+TWrVsydepUtwDHKVeuXPL++++7Lj98+FA+++wzyZkzp/nw1gxC79695d69e2630+tff/11kw363//+Z4IMLYXNmjXLtY2WWTS4Upox0mBEb+cs8zh/D0xvo9sFtmrVKnn55ZdNoJQ4cWLJmzevOaZn9eRoUFeuXDlJlCiRuW2dOnXkwIEDwd6fBnt6TLqd9g61aNHCBAyh1ahRI1m2bJlcv37ddd327dtNuUrXBXX16lXp0aOHFC5c2DwmLXdVr15ddu/e7dpm3bp18uKLL5rf9XicZS/n49SeG83K7dixQ8qXL2+CG+fzErQnR0uG+hoFffzVqlWT5MmTm4wRAO8hyAEigZZQNPgoW7ZsqLZv3bq19O3bV4oXLy6jR4+WChUqyOeff26yQUFpYPDGG29IlSpVZOTIkebDUgMFLX+p+vXrm32od955x/TjjBkzJkzHr/vSYEqDrIEDB5r7qV27tmzatMnj7X777TfzAX7x4kUTyHTr1k02b95sMi4aFAWlGZibN2+ax6q/ayChZaLQ0seqAchPP/3klsXJly+feS6DOn78uGnA1sc2atQoEwRq35I+386AI3/+/OYxq7Zt25rnTxcNaJyuXLligiMtZelzW7FixWCPT3uvUqdObYKdR48emesmT55sylrjx4+XDBkyhPqxAggFB4AIdePGDYf+qdWpUydU2+/atcts37p1a7fre/ToYa5fs2aN67qsWbOa6zZs2OC67uLFi4548eI5unfv7rruxIkTZrvhw4e77bNZs2ZmH0H169fPbO80evRoc/nSpUshHrfzPqZPn+667oUXXnCkSZPGceXKFdd1u3fvdvj6+jqaNm361P21bNnSbZ/16tVzpEyZMsT7DPw4EiVKZH5/4403HJUrVza/P3r0yJEuXTrHgAEDgn0OAgICzDZBH4c+fwMHDnRdt3379qcem1OFChXMukmTJgW7TpfAVqxYYbYfNGiQ4/jx447EiRM76tat+8zHCCDsyOQAEczf39/8TJIkSai2X7p0qfmpWY/Aunfvbn4G7d0pUKCAKQc5aaZAS0mapfAWZy/Pzz//LI8fPw7Vbc6dO2dGI2lWKUWKFK7rixQpYrJOzscZWLt27dwu6+PSLInzOQwNLUtpien8+fOmVKY/gytVKS0F+vo+eRvUzIrel7MU99dff4X6PnU/WsoKDR3GryPsNDukmSctX2k2B4D3EeQAEUz7PJSWYULj33//NR+82qcTWLp06UywoesDy5Ily1P70JLVtWvXxFveeustU2LSMlratGlN2Wz+/PkeAx7ncWrAEJSWgC5fviy3b9/2+Fj0caiwPJYaNWqYgHLevHlmVJX20wR9Lp30+LWUlzt3bhOopEqVygSJe/bskRs3boT6PjNmzBimJmMdxq6BnwaB48aNkzRp0oT6tgBCjyAHiIQgR3st/v777zDdLmjjb0hixYoV7PUOh+O578PZL+KUIEEC2bBhg+mxadKkiQkCNPDRjEzQbcMjPI/FSYMV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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot confusion matrix\n",
    "cm = confusion_matrix(y_test, y_pred)\n",
    "disp = ConfusionMatrixDisplay(confusion_matrix=cm, \n",
    "                            display_labels=['Negative', 'Neutral', 'Positive'])\n",
    "disp.plot(cmap=plt.cm.Blues)\n",
    "plt.title('Confusion Matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Model Export"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['SA_model.pkl']"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Save the trained model\n",
    "joblib.dump(model, \"SA_model.pkl\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "venv",
   "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.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}