File size: 194,937 Bytes
a28f668
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:25:49.414717Z",
     "iopub.status.busy": "2025-02-16T04:25:49.414425Z",
     "iopub.status.idle": "2025-02-16T04:25:49.418863Z",
     "shell.execute_reply": "2025-02-16T04:25:49.417932Z",
     "shell.execute_reply.started": "2025-02-16T04:25:49.414672Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:26:42.872195Z",
     "iopub.status.busy": "2025-02-16T04:26:42.871929Z",
     "iopub.status.idle": "2025-02-16T04:26:43.975860Z",
     "shell.execute_reply": "2025-02-16T04:26:43.974945Z",
     "shell.execute_reply.started": "2025-02-16T04:26:42.872176Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:26:45.452514Z",
     "iopub.status.busy": "2025-02-16T04:26:45.452075Z",
     "iopub.status.idle": "2025-02-16T04:26:45.489416Z",
     "shell.execute_reply": "2025-02-16T04:26:45.488763Z",
     "shell.execute_reply.started": "2025-02-16T04:26:45.452484Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "data = pd.read_csv('/kaggle/input/sms-spam-collection-dataset/spam.csv', encoding = 'latin1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:26:47.622350Z",
     "iopub.status.busy": "2025-02-16T04:26:47.622053Z",
     "iopub.status.idle": "2025-02-16T04:26:47.639547Z",
     "shell.execute_reply": "2025-02-16T04:26:47.638680Z",
     "shell.execute_reply.started": "2025-02-16T04:26:47.622326Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>v1</th>\n",
       "      <th>v2</th>\n",
       "      <th>Unnamed: 2</th>\n",
       "      <th>Unnamed: 3</th>\n",
       "      <th>Unnamed: 4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ham</td>\n",
       "      <td>Go until jurong point, crazy.. Available only ...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ham</td>\n",
       "      <td>Ok lar... Joking wif u oni...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>spam</td>\n",
       "      <td>Free entry in 2 a wkly comp to win FA Cup fina...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ham</td>\n",
       "      <td>U dun say so early hor... U c already then say...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ham</td>\n",
       "      <td>Nah I don't think he goes to usf, he lives aro...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     v1                                                 v2 Unnamed: 2  \\\n",
       "0   ham  Go until jurong point, crazy.. Available only ...        NaN   \n",
       "1   ham                      Ok lar... Joking wif u oni...        NaN   \n",
       "2  spam  Free entry in 2 a wkly comp to win FA Cup fina...        NaN   \n",
       "3   ham  U dun say so early hor... U c already then say...        NaN   \n",
       "4   ham  Nah I don't think he goes to usf, he lives aro...        NaN   \n",
       "\n",
       "  Unnamed: 3 Unnamed: 4  \n",
       "0        NaN        NaN  \n",
       "1        NaN        NaN  \n",
       "2        NaN        NaN  \n",
       "3        NaN        NaN  \n",
       "4        NaN        NaN  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:26:50.137801Z",
     "iopub.status.busy": "2025-02-16T04:26:50.137414Z",
     "iopub.status.idle": "2025-02-16T04:26:50.143442Z",
     "shell.execute_reply": "2025-02-16T04:26:50.142538Z",
     "shell.execute_reply.started": "2025-02-16T04:26:50.137770Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5572, 5)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:26:52.096701Z",
     "iopub.status.busy": "2025-02-16T04:26:52.096387Z",
     "iopub.status.idle": "2025-02-16T04:26:52.108948Z",
     "shell.execute_reply": "2025-02-16T04:26:52.108098Z",
     "shell.execute_reply.started": "2025-02-16T04:26:52.096675Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "v1               0\n",
       "v2               0\n",
       "Unnamed: 2    5522\n",
       "Unnamed: 3    5560\n",
       "Unnamed: 4    5566\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isna().sum().sort_values()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:26:55.091645Z",
     "iopub.status.busy": "2025-02-16T04:26:55.091290Z",
     "iopub.status.idle": "2025-02-16T04:26:55.101177Z",
     "shell.execute_reply": "2025-02-16T04:26:55.100184Z",
     "shell.execute_reply.started": "2025-02-16T04:26:55.091619Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "data.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis = 1, inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:26:58.397009Z",
     "iopub.status.busy": "2025-02-16T04:26:58.396640Z",
     "iopub.status.idle": "2025-02-16T04:26:58.406269Z",
     "shell.execute_reply": "2025-02-16T04:26:58.405410Z",
     "shell.execute_reply.started": "2025-02-16T04:26:58.396980Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>v1</th>\n",
       "      <th>v2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ham</td>\n",
       "      <td>Go until jurong point, crazy.. Available only ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ham</td>\n",
       "      <td>Ok lar... Joking wif u oni...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    v1                                                 v2\n",
       "0  ham  Go until jurong point, crazy.. Available only ...\n",
       "1  ham                      Ok lar... Joking wif u oni..."
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:01.431648Z",
     "iopub.status.busy": "2025-02-16T04:27:01.431318Z",
     "iopub.status.idle": "2025-02-16T04:27:01.435771Z",
     "shell.execute_reply": "2025-02-16T04:27:01.434792Z",
     "shell.execute_reply.started": "2025-02-16T04:27:01.431624Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "data.rename(columns = {'v1': 'sms_label', 'v2':'sms_raw_text'}, inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:05.036479Z",
     "iopub.status.busy": "2025-02-16T04:27:05.036166Z",
     "iopub.status.idle": "2025-02-16T04:27:05.043331Z",
     "shell.execute_reply": "2025-02-16T04:27:05.042588Z",
     "shell.execute_reply.started": "2025-02-16T04:27:05.036455Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sms_label</th>\n",
       "      <th>sms_raw_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ham</td>\n",
       "      <td>Go until jurong point, crazy.. Available only ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ham</td>\n",
       "      <td>Ok lar... Joking wif u oni...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  sms_label                                       sms_raw_text\n",
       "0       ham  Go until jurong point, crazy.. Available only ...\n",
       "1       ham                      Ok lar... Joking wif u oni..."
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:23.047753Z",
     "iopub.status.busy": "2025-02-16T04:27:23.047474Z",
     "iopub.status.idle": "2025-02-16T04:27:23.055064Z",
     "shell.execute_reply": "2025-02-16T04:27:23.053972Z",
     "shell.execute_reply.started": "2025-02-16T04:27:23.047734Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "spam_prorp = data['sms_label'].value_counts(normalize = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:25.007108Z",
     "iopub.status.busy": "2025-02-16T04:27:25.006835Z",
     "iopub.status.idle": "2025-02-16T04:27:25.013809Z",
     "shell.execute_reply": "2025-02-16T04:27:25.013089Z",
     "shell.execute_reply.started": "2025-02-16T04:27:25.007087Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sms_label\n",
       "ham     0.865937\n",
       "spam    0.134063\n",
       "Name: proportion, dtype: float64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spam_prorp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**The dataset is highly imbalanced.Almost 87% are non-spam sms whereas the remaining 13% are classified as spams sms**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:27.097091Z",
     "iopub.status.busy": "2025-02-16T04:27:27.096813Z",
     "iopub.status.idle": "2025-02-16T04:27:27.298205Z",
     "shell.execute_reply": "2025-02-16T04:27:27.297449Z",
     "shell.execute_reply.started": "2025-02-16T04:27:27.097070Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAHfCAYAAACCkthOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAyVklEQVR4nO3deVyU5f7/8feAMoiypYKgBGqKO3okjdJsIUjN0vJEtoh+1dMpt6KsTHPNNEv0uC+VrR5pMVs0zchOi5Sl1je/laWiUgpiJrgUCHP9/ujHnCZQGVMv1Nfz8bgfD+ea677vz3XPyLzn3sZhjDECAACwxMd2AQAA4PxGGAEAAFYRRgAAgFWEEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBTrOYmBj169fPdhnH9cMPPygpKUnBwcFyOBxavny57ZIAnEcIIzijnn32WTkcDvfk7++vpk2basiQIcrLy7Nd3klbt26dxo0bpwMHDtgu5aSkpqbq66+/1qRJk/TCCy8oPj7edkkAziPVbBeA89OECRPUsGFD/fbbb/r44481b948rVy5Ups3b1ZAQIDt8ry2bt06jR8/Xv369VNISIjHc1u2bJGPT9XN/b/++quysrI0atQoDRkyxHY5AM5DhBFY0bVrV/e374EDB6p27dpKT0/XG2+8oT59+lQ4z+HDh1WzZs0zWeYJVaYmp9N5hqo5Ofn5+ZJULkQBwJlSdb+u4bxy1VVXSZKys7MlSf369VOtWrW0bds2devWTYGBgbrtttsk/R4A7rvvPkVFRcnpdCo2NlZPPvmk/vwD1A6HQ0OGDNFLL72k2NhY+fv7q3379vrwww/LrX/Tpk3q2rWrgoKCVKtWLV199dX69NNPPfqUHWL6z3/+o7vvvlthYWFq0KCBxo0bpxEjRkiSGjZs6D4EtWPHDkkVnzOyfft2/f3vf9cFF1yggIAAXXLJJVqxYoVHnw8++EAOh0Mvv/yyJk2apAYNGsjf319XX321tm7dWqnteqJxjRs3TtHR0ZKkESNGyOFwKCYm5rjLnDVrllq2bKmAgACFhoYqPj5eS5Ys8Vimw+HQd999p5tvvllBQUGqXbu2hg8frt9++81jWYsXL9ZVV12lsLAwOZ1OtWjRQvPmzSu3zpiYGF133XX64IMPFB8frxo1aqh169b64IMPJEnLli1T69at3a/xpk2bjjuGL774Qg6HQ88991y551avXi2Hw6G3335bknTw4EHdc889iomJkdPpVFhYmK655hpt3LjxuOso2w5bt2517zELDg5W//79deTIEY++JSUlmjhxoho3biyn06mYmBg9/PDDKioqqnA7fPzxx+rQoYP8/f3VqFEjPf/888etpUxlxnLFFVeoVatW2rBhgy699FLVqFFDDRs21Pz58z2WVVxcrDFjxqh9+/YKDg5WzZo11blzZ61du9aj344dO+RwOPTkk09qzpw5atSokQICApSUlKScnBwZYzRx4kQ1aNBANWrU0A033KD9+/dXajw4hxjgDFq8eLGRZD7//HOP9n/9619Gkpk/f74xxpjU1FTjdDpN48aNTWpqqpk/f755/vnnjcvlMldddZVxOBxm4MCBZvbs2aZHjx5Gkrnnnns8linJtGrVytSpU8dMmDDBPP744yY6OtrUqFHDfP311+5+mzdvNjVr1jQRERFm4sSJZsqUKaZhw4bG6XSaTz/9tFztLVq0MF26dDGzZs0yU6ZMMV999ZXp06ePkWSmT59uXnjhBfPCCy+YQ4cOGWOMiY6ONqmpqe7l5ObmmvDwcBMYGGhGjRpl0tPTTVxcnPHx8THLli1z91u7dq2RZNq1a2fat29vpk+fbsaNG2cCAgJMhw4dTritKzOur776ykyfPt1IMn369DEvvPCCef3114+5zIULFxpJpnfv3mbBggXmX//6lxkwYIAZNmyYu8/YsWONJNO6dWvTo0cPM3v2bHP77bcbSeaOO+7wWN7FF19s+vXrZ6ZPn25mzZplkpKSjCQze/Zsj37R0dEmNjbWREREmHHjxpnp06eb+vXrm1q1apkXX3zRXHjhhWbKlClmypQpJjg42Fx00UWmtLT0uNunUaNGplu3buXa+/fvb0JDQ01xcbExxphbb73V+Pn5mbS0NPPUU0+Zxx9/3PTo0cO8+OKLx11+2XZo166dufHGG83cuXPNwIEDjSTzwAMPePRNTU11b9c5c+aYvn37GkmmZ8+eFW6H8PBw8/DDD5vZs2ebv/3tb8bhcJjNmzcft57KjqVLly4mMjLShIWFmSFDhpiZM2eaTp06GUnm6aefdvfLz883ERERJi0tzcybN89MnTrVxMbGmurVq5tNmza5+2VnZxtJpm3btqZFixYmPT3djB492vj5+ZlLLrnEPPzww+bSSy81M2fONMOGDTMOh8P079//hGPBuYUwgjOq7AP9vffeM/n5+SYnJ8csXbrU1K5d29SoUcP8+OOPxpj//nF+6KGHPOZfvny5kWQeffRRj/bevXsbh8Nhtm7d6m6TZCSZL774wt22c+dO4+/vb3r16uVu69mzp/Hz8zPbtm1zt+3evdsEBgaayy+/vFztnTp1MiUlJR7rf+KJJ4wkk52dXW7Mfw4j99xzj5FkPvroI3fbwYMHTcOGDU1MTIz7Q7QsjDRv3twUFRW5+5YFtz8GqopUdlxlHxZPPPHEcZdnjDE33HCDadmy5XH7lH0IX3/99R7td999t5FkvvrqK3fbkSNHys2fnJxsGjVq5NEWHR1tJJl169a521avXm0kmRo1apidO3e62xcsWGAkmbVr1x63zpEjR5rq1aub/fv3u9uKiopMSEiI+Z//+R93W3BwsBk8ePBxl1WRsu3wx2UZY0yvXr1M7dq13Y+//PJLI8kMHDjQo9/9999vJJn333/f3Va2HT788EN32969e43T6TT33XffCWuqzFi6dOliJJlp06a524qKikzbtm1NWFiYO6SVlJR4vC+NMeaXX34x4eHhHmMue3/VrVvXHDhwwN0+cuRII8nExcWZo0ePutv79Olj/Pz8zG+//XbC8eDcwWEaWJGYmKi6desqKipKt9xyi2rVqqXXX39d9evX9+h31113eTxeuXKlfH19NWzYMI/2++67T8YYvfPOOx7tCQkJat++vfvxhRdeqBtuuEGrV69WaWmpSktL9e6776pnz55q1KiRu19ERIRuvfVWffzxxyosLPRY5qBBg+Tr63vSY1+5cqU6dOigTp06udtq1aqlf/zjH9qxY4e++eYbj/79+/eXn5+f+3Hnzp0l/X6o51hOZlyVERISoh9//FGff/75CfsOHjzY4/HQoUMl/T7+MjVq1HD/u6CgQPv27VOXLl20fft2FRQUeMzfokULJSQkuB937NhR0u+H+C688MJy7cfbPpKUkpKio0ePatmyZe62d999VwcOHFBKSoq7LSQkRJ999pl27959/AEfwz//+U+Px507d9bPP//s3v5l2yMtLc2j33333SdJ5Q7ftWjRwv0ekKS6desqNjb2hOOVKj+WatWq6c4773Q/9vPz05133qm9e/dqw4YNkiRfX1/3+9Ll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Hh6u7777rsJ5br31Vu3bt0+dOnWSMUYlJSX65z//edzDNJMnT9b48eO9KQ0AAJylTvvVNB988IEee+wxzZ07Vxs3btSyZcu0YsUKTZw48ZjzjBw5UgUFBe4pJyfndJcJAAAs8WrPSJ06deTr66u8vDyP9ry8PNWrV6/CeR555BHdcccdGjhwoCSpdevWOnz4sP7xj39o1KhR8vEpn4ecTqecTqc3pQEAgLOUV3tG/Pz81L59e2VmZrrbXC6XMjMzlZCQUOE8R44cKRc4fH19JUnGGG/rBQAA5xiv9oxIUlpamlJTUxUfH68OHTpoxowZOnz4sPr37y9J6tu3r+rXr6/JkydLknr06KH09HS1a9dOHTt21NatW/XII4+oR48e7lACAADOX16HkZSUFOXn52vMmDHKzc1V27ZttWrVKvdJrbt27fLYEzJ69Gg5HA6NHj1aP/30k+rWrasePXpo0qRJp24UAADgrOUwZ8GxksLCQgUHB6ugoEBBQUG2yzmjlm3ZY7sEnEE3xkbYLgEATpnKfn7z2zQAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsOqkwMmfOHMXExMjf318dO3bU+vXrj9v/wIEDGjx4sCIiIuR0OtW0aVOtXLnypAoGAADnlmrezpCRkaG0tDTNnz9fHTt21IwZM5ScnKwtW7YoLCysXP/i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ymLPCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsOqkwsicOXMUExMjf39/dezYUevXrz9u/1deeUXNmjWTv7+/WrdurZUrV55UsQAA4NzjdRjJyMhQWlqaxo4dq40bNyouLk7Jycnau3dvhf3XrVunPn36aMCAAdq0aZN69uypnj17avPmzX+5eAAAcPZzGGOMNzN07NhRF198sWbPni1JcrlcioqK0tChQ/XQQw+V65+SkqLDhw/r7bffdrddcsklatu2rebPn1+pdRYWFio4OFgFBQUKCgryptyz3rIte2yXgDPoxtgI2yXgTHI4bFeAM8m7j9tzQmU/v6t5s9Di4mJt2LBBI0eOdLf5+PgoMTFRWVlZFc6TlZWltLQ0j7bk5GQtX778mOspKipSUVGR+3FBQYGk3wd1vjly6KDtEnAGFRbWtF0CgNPlPPwMK/vcPtF+D6/CyL59+1RaWqrw8HCP9vDwcH333XcVzpObm1th/9zc3GOuZ/LkyRo/fny59qioKG/KBQCg6ggOtl2BNQcPHlTwccbvVRg5U0aOHOmxN8Xlcmn//v2qXbu2HOzWPOcVFhYqKipKOTk5591hOeBcx//v84sxRgcPHlRkZORx+3kVRurUqSNfX1/l5eV5tOfl5alevXoVzlOvXj2v+kuS0+mU0+n0aAsJCfGmVJwDgoKC+GMFnKP4/33+ON4ekTJeXU3j5+en9u3bKzMz093mcrmUmZmphISECudJSEjw6C9Ja9asOWZ/AABwfvH6ME1aWppSU1MVHx+vDh06aMaMGTp8+LD69+8vSerbt6/q16+vyZMnS5KGDx+uLl26aNq0aerevbuWLl2qL774QgsXLjy1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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "spam_prorp.plot(x = spam_prorp.index, y = spam_prorp.values, kind = 'bar', \n",
    "                color = ['lightblue' if label == 'ham' else 'red' for label in spam_prorp.index],\n",
    "               title = 'Proportion of spam vs non-spam')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:30.002634Z",
     "iopub.status.busy": "2025-02-16T04:27:30.002055Z",
     "iopub.status.idle": "2025-02-16T04:27:30.010177Z",
     "shell.execute_reply": "2025-02-16T04:27:30.009339Z",
     "shell.execute_reply.started": "2025-02-16T04:27:30.002598Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    Go until jurong point, crazy.. Available only ...\n",
       "1                        Ok lar... Joking wif u oni...\n",
       "2    Free entry in 2 a wkly comp to win FA Cup fina...\n",
       "3    U dun say so early hor... U c already then say...\n",
       "4    Nah I don't think he goes to usf, he lives aro...\n",
       "Name: sms_raw_text, dtype: object"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['sms_raw_text'][:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:32.221920Z",
     "iopub.status.busy": "2025-02-16T04:27:32.221634Z",
     "iopub.status.idle": "2025-02-16T04:27:32.229099Z",
     "shell.execute_reply": "2025-02-16T04:27:32.228178Z",
     "shell.execute_reply.started": "2025-02-16T04:27:32.221898Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# Let's encode the target variable (1 for spam and 0 for ham or legitimate)\n",
    "label_mapping = {'ham':0, 'spam':1}\n",
    "data['sms_label'].replace(label_mapping, inplace = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:34.497046Z",
     "iopub.status.busy": "2025-02-16T04:27:34.496627Z",
     "iopub.status.idle": "2025-02-16T04:27:34.505054Z",
     "shell.execute_reply": "2025-02-16T04:27:34.504295Z",
     "shell.execute_reply.started": "2025-02-16T04:27:34.497008Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sms_label</th>\n",
       "      <th>sms_raw_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>Go until jurong point, crazy.. Available only ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>Ok lar... Joking wif u oni...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>Free entry in 2 a wkly comp to win FA Cup fina...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>U dun say so early hor... U c already then say...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>Nah I don't think he goes to usf, he lives aro...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sms_label                                       sms_raw_text\n",
       "0          0  Go until jurong point, crazy.. Available only ...\n",
       "1          0                      Ok lar... Joking wif u oni...\n",
       "2          1  Free entry in 2 a wkly comp to win FA Cup fina...\n",
       "3          0  U dun say so early hor... U c already then say...\n",
       "4          0  Nah I don't think he goes to usf, he lives aro..."
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:45.293032Z",
     "iopub.status.busy": "2025-02-16T04:27:45.292756Z",
     "iopub.status.idle": "2025-02-16T04:27:50.467953Z",
     "shell.execute_reply": "2025-02-16T04:27:50.467221Z",
     "shell.execute_reply.started": "2025-02-16T04:27:45.293010Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# Let's import Dataset, DataLoader, DistilBert (developped by HuggingFace) and...\n",
    "import torch\n",
    "import torch.optim as optim\n",
    "import torch.nn as nn\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from transformers import DistilBertTokenizer, DistilBertForSequenceClassification\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:52.953024Z",
     "iopub.status.busy": "2025-02-16T04:27:52.952565Z",
     "iopub.status.idle": "2025-02-16T04:27:52.962918Z",
     "shell.execute_reply": "2025-02-16T04:27:52.961965Z",
     "shell.execute_reply.started": "2025-02-16T04:27:52.953000Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# Let's train_test_split the data\n",
    "train_data, eval_data = train_test_split(data, test_size = 0.2, random_state = 42, stratify = data['sms_label'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:55.841766Z",
     "iopub.status.busy": "2025-02-16T04:27:55.841466Z",
     "iopub.status.idle": "2025-02-16T04:27:55.850871Z",
     "shell.execute_reply": "2025-02-16T04:27:55.850116Z",
     "shell.execute_reply.started": "2025-02-16T04:27:55.841743Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sms_label</th>\n",
       "      <th>sms_raw_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>184</th>\n",
       "      <td>0</td>\n",
       "      <td>Going on nothing great.bye</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2171</th>\n",
       "      <td>0</td>\n",
       "      <td>I wont. So wat's wit the guys</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5422</th>\n",
       "      <td>0</td>\n",
       "      <td>Ok k..sry i knw 2 siva..tats y i askd..</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4113</th>\n",
       "      <td>0</td>\n",
       "      <td>Where are you ? What do you do ? How can you s...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4588</th>\n",
       "      <td>0</td>\n",
       "      <td>Have you not finished work yet or something?</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1932</th>\n",
       "      <td>0</td>\n",
       "      <td>Jus finished avatar nigro</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5316</th>\n",
       "      <td>0</td>\n",
       "      <td>Jus finish watching tv... U?</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2308</th>\n",
       "      <td>1</td>\n",
       "      <td>Moby Pub Quiz.Win a å£100 High Street prize if...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1903</th>\n",
       "      <td>1</td>\n",
       "      <td>Free entry in 2 a weekly comp for a chance to ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>763</th>\n",
       "      <td>0</td>\n",
       "      <td>Nothing but we jus tot u would ask cos u ba gu...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4457 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      sms_label                                       sms_raw_text\n",
       "184           0                         Going on nothing great.bye\n",
       "2171          0                      I wont. So wat's wit the guys\n",
       "5422          0            Ok k..sry i knw 2 siva..tats y i askd..\n",
       "4113          0  Where are you ? What do you do ? How can you s...\n",
       "4588          0       Have you not finished work yet or something?\n",
       "...         ...                                                ...\n",
       "1932          0                          Jus finished avatar nigro\n",
       "5316          0                       Jus finish watching tv... U?\n",
       "2308          1  Moby Pub Quiz.Win a å£100 High Street prize if...\n",
       "1903          1  Free entry in 2 a weekly comp for a chance to ...\n",
       "763           0  Nothing but we jus tot u would ask cos u ba gu...\n",
       "\n",
       "[4457 rows x 2 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:27:58.556536Z",
     "iopub.status.busy": "2025-02-16T04:27:58.556241Z",
     "iopub.status.idle": "2025-02-16T04:27:58.565445Z",
     "shell.execute_reply": "2025-02-16T04:27:58.564624Z",
     "shell.execute_reply.started": "2025-02-16T04:27:58.556514Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sms_label</th>\n",
       "      <th>sms_raw_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2826</th>\n",
       "      <td>0</td>\n",
       "      <td>Oh right, ok. I'll make sure that i do loads o...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3695</th>\n",
       "      <td>0</td>\n",
       "      <td>I am in tirupur.  call you da.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3906</th>\n",
       "      <td>0</td>\n",
       "      <td>No that just means you have a fat head</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>575</th>\n",
       "      <td>1</td>\n",
       "      <td>You have won ?1,000 cash or a ?2,000 prize! To...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2899</th>\n",
       "      <td>0</td>\n",
       "      <td>Come aftr  &amp;lt;DECIMAL&amp;gt; ..now i m cleaning ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854</th>\n",
       "      <td>0</td>\n",
       "      <td>Stop the story. I've told him i've returned it...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5044</th>\n",
       "      <td>0</td>\n",
       "      <td>We have sent JD for Customer Service cum Accou...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015</th>\n",
       "      <td>0</td>\n",
       "      <td>Just re read it and I have no shame but tell m...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3381</th>\n",
       "      <td>0</td>\n",
       "      <td>Well, I meant as opposed to my drunken night o...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>785</th>\n",
       "      <td>0</td>\n",
       "      <td>She was supposed to be but couldn't make it, s...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1115 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      sms_label                                       sms_raw_text\n",
       "2826          0  Oh right, ok. I'll make sure that i do loads o...\n",
       "3695          0                     I am in tirupur.  call you da.\n",
       "3906          0             No that just means you have a fat head\n",
       "575           1  You have won ?1,000 cash or a ?2,000 prize! To...\n",
       "2899          0  Come aftr  &lt;DECIMAL&gt; ..now i m cleaning ...\n",
       "...         ...                                                ...\n",
       "854           0  Stop the story. I've told him i've returned it...\n",
       "5044          0  We have sent JD for Customer Service cum Accou...\n",
       "2015          0  Just re read it and I have no shame but tell m...\n",
       "3381          0  Well, I meant as opposed to my drunken night o...\n",
       "785           0  She was supposed to be but couldn't make it, s...\n",
       "\n",
       "[1115 rows x 2 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eval_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:03.221793Z",
     "iopub.status.busy": "2025-02-16T04:28:03.221507Z",
     "iopub.status.idle": "2025-02-16T04:28:03.227074Z",
     "shell.execute_reply": "2025-02-16T04:28:03.226211Z",
     "shell.execute_reply.started": "2025-02-16T04:28:03.221772Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# Let's define pytorch Dataset\n",
    "class SpamDetectionDataset(Dataset):\n",
    "    def __init__(self, data, tokenizer):\n",
    "        self.data = data\n",
    "        self.tokenizer = tokenizer\n",
    "        self.max_length = 256\n",
    "\n",
    "    def __len__(self) :\n",
    "        return len(self.data)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        text = self.data.iloc[idx]['sms_raw_text']\n",
    "        labels = self.data.iloc[idx][['sms_label']].values.astype(int)\n",
    "        # padding set to 'max_length ensures that all tokenized text with length<max_length will complete to zero'\n",
    "        # truncation set to True ensures no tokenized text will exceed max_length\n",
    "        encoding = self.tokenizer(text, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)\n",
    "\n",
    "        input_ids = encoding['input_ids'][0] # Almost the same as encoding['input_ids'].squeeze()\n",
    "        attention_mask = encoding['attention_mask'][0]\n",
    "       \n",
    "        return input_ids, attention_mask, torch.tensor(labels)\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:08.799100Z",
     "iopub.status.busy": "2025-02-16T04:28:08.798691Z",
     "iopub.status.idle": "2025-02-16T04:28:09.855434Z",
     "shell.execute_reply": "2025-02-16T04:28:09.854738Z",
     "shell.execute_reply.started": "2025-02-16T04:28:08.799064Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d3cbf542124945859a628fee495e65f3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "tokenizer_config.json:   0%|          | 0.00/48.0 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9a1b447079824846a64d5f867b619940",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "vocab.txt:   0%|          | 0.00/232k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ba18370a99564811b4e76cf252e23576",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "config.json:   0%|          | 0.00/629 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Now, let's define the DistilBert tokenizer and transform our train_data, eval_data in Pytorch Dataset\n",
    "model_checkpoint = \"distilbert-base-uncased-finetuned-sst-2-english\"\n",
    "tokenizer = DistilBertTokenizer.from_pretrained(model_checkpoint)\n",
    "\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:12.677189Z",
     "iopub.status.busy": "2025-02-16T04:28:12.676868Z",
     "iopub.status.idle": "2025-02-16T04:28:12.681047Z",
     "shell.execute_reply": "2025-02-16T04:28:12.680033Z",
     "shell.execute_reply.started": "2025-02-16T04:28:12.677160Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "train_dataset = SpamDetectionDataset(train_data, tokenizer)\n",
    "eval_dataset = SpamDetectionDataset(eval_data, tokenizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:17.106973Z",
     "iopub.status.busy": "2025-02-16T04:28:17.106665Z",
     "iopub.status.idle": "2025-02-16T04:28:17.156540Z",
     "shell.execute_reply": "2025-02-16T04:28:17.155891Z",
     "shell.execute_reply.started": "2025-02-16T04:28:17.106949Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([ 101, 2183, 2006, 2498, 2307, 1012, 9061,  102,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "            0,    0,    0,    0]),\n",
       " tensor([1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n",
       " tensor([0]))"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "next(iter(train_dataset))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:20.677323Z",
     "iopub.status.busy": "2025-02-16T04:28:20.677056Z",
     "iopub.status.idle": "2025-02-16T04:28:20.681312Z",
     "shell.execute_reply": "2025-02-16T04:28:20.680438Z",
     "shell.execute_reply.started": "2025-02-16T04:28:20.677302Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "batch_size = 20\n",
    "train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n",
    "eval_dataloader = DataLoader(eval_dataset, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:24.827118Z",
     "iopub.status.busy": "2025-02-16T04:28:24.826833Z",
     "iopub.status.idle": "2025-02-16T04:28:24.831850Z",
     "shell.execute_reply": "2025-02-16T04:28:24.830751Z",
     "shell.execute_reply.started": "2025-02-16T04:28:24.827096Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "class DistilBertClassifier(nn.Module): \n",
    "    def __init__(self, num_labels):\n",
    "        super().__init__()\n",
    "        self.distilbert = DistilBertForSequenceClassification.from_pretrained(model_checkpoint,\n",
    "                                                                             num_labels = num_labels)\n",
    "\n",
    "    def forward(self, input_ids, attention_mask):\n",
    "        outputs = self.distilbert(input_ids=input_ids, attention_mask=attention_mask)\n",
    "\n",
    "        return outputs.logits\n",
    "        \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:26.727379Z",
     "iopub.status.busy": "2025-02-16T04:28:26.726962Z",
     "iopub.status.idle": "2025-02-16T04:28:29.235637Z",
     "shell.execute_reply": "2025-02-16T04:28:29.234757Z",
     "shell.execute_reply.started": "2025-02-16T04:28:26.727325Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "60ed86f0fbf342ed815af77b89c2bb23",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "model.safetensors:   0%|          | 0.00/268M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Now it's timee to train the model\n",
    "num_labels = 2\n",
    "model = DistilBertClassifier(num_labels).to(device) # we turn the model to cpu or gpu\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = torch.optim.AdamW(model.parameters(), lr = 2e-5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:30.497180Z",
     "iopub.status.busy": "2025-02-16T04:28:30.496722Z",
     "iopub.status.idle": "2025-02-16T04:28:31.100779Z",
     "shell.execute_reply": "2025-02-16T04:28:31.099923Z",
     "shell.execute_reply.started": "2025-02-16T04:28:30.497155Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "from torchmetrics import Accuracy\n",
    "accuracy= Accuracy(task = 'binary')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:32.812163Z",
     "iopub.status.busy": "2025-02-16T04:28:32.811725Z",
     "iopub.status.idle": "2025-02-16T04:28:32.818628Z",
     "shell.execute_reply": "2025-02-16T04:28:32.817823Z",
     "shell.execute_reply.started": "2025-02-16T04:28:32.812141Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BinaryAccuracy()"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:34.846945Z",
     "iopub.status.busy": "2025-02-16T04:28:34.846644Z",
     "iopub.status.idle": "2025-02-16T04:28:34.852938Z",
     "shell.execute_reply": "2025-02-16T04:28:34.852003Z",
     "shell.execute_reply.started": "2025-02-16T04:28:34.846918Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DistilBertClassifier(\n",
       "  (distilbert): DistilBertForSequenceClassification(\n",
       "    (distilbert): DistilBertModel(\n",
       "      (embeddings): Embeddings(\n",
       "        (word_embeddings): Embedding(30522, 768, padding_idx=0)\n",
       "        (position_embeddings): Embedding(512, 768)\n",
       "        (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n",
       "        (dropout): Dropout(p=0.1, inplace=False)\n",
       "      )\n",
       "      (transformer): Transformer(\n",
       "        (layer): ModuleList(\n",
       "          (0-5): 6 x TransformerBlock(\n",
       "            (attention): MultiHeadSelfAttention(\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "              (q_lin): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (k_lin): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (v_lin): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (out_lin): Linear(in_features=768, out_features=768, bias=True)\n",
       "            )\n",
       "            (sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n",
       "            (ffn): FFN(\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "              (lin1): Linear(in_features=768, out_features=3072, bias=True)\n",
       "              (lin2): Linear(in_features=3072, out_features=768, bias=True)\n",
       "              (activation): GELUActivation()\n",
       "            )\n",
       "            (output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (pre_classifier): Linear(in_features=768, out_features=768, bias=True)\n",
       "    (classifier): Linear(in_features=768, out_features=2, bias=True)\n",
       "    (dropout): Dropout(p=0.2, inplace=False)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:40.558230Z",
     "iopub.status.busy": "2025-02-16T04:28:40.557941Z",
     "iopub.status.idle": "2025-02-16T04:28:40.567208Z",
     "shell.execute_reply": "2025-02-16T04:28:40.566272Z",
     "shell.execute_reply.started": "2025-02-16T04:28:40.558209Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "def train_eval(model, optimizer, loss_fn, train_loader, test_loader, epochs = 2) :\n",
    "    list_train_loss = []\n",
    "    list_test_loss = []\n",
    "    train_accuracy = []\n",
    "    test_accuracy = []\n",
    "    \n",
    "    for epoch in range(epochs) :\n",
    "        train_loss = 0\n",
    "        test_loss = 0\n",
    "        model.train()\n",
    "\n",
    "        for batch in  train_loader :\n",
    "            optimizer.zero_grad()\n",
    "            input_ids, attention_mask, labels = batch\n",
    "            input_ids = input_ids.to(device)\n",
    "            attention_mask = attention_mask.to(device)\n",
    "            labels = labels.view(-1) # we reshape the label to map the model output\n",
    "            labels = labels.to(device)\n",
    "            \n",
    "            # run forward pass and compute loss\n",
    "            logits = model(input_ids, attention_mask)\n",
    "            loss = loss_fn(logits, labels)\n",
    "            predicted_label = nn.functional.sigmoid(logits)\n",
    "            _, predicted_label = torch.max(predicted_label, 1)\n",
    "            accuracy(predicted_label, labels)\n",
    "            # compute gradient\n",
    "            loss.backward()\n",
    "            #update model parameters (back_propagation)\n",
    "            optimizer.step()\n",
    "            train_loss += loss.item()\n",
    "            \n",
    "        # final loss    \n",
    "        train_loss = train_loss/len(train_loader)\n",
    "        list_train_loss.append(train_loss)\n",
    "        train_acc = accuracy.compute()\n",
    "        train_accuracy.append(train_acc.item())\n",
    "        accuracy.reset()\n",
    "        \n",
    "        print('Epoch {} loss on train set is: -----> {} and acc is: ----> {}'.format(epoch+1, train_loss, train_acc))\n",
    "        print('-----------------------------------------------------------------------')\n",
    "\n",
    "        model.eval() \n",
    "        with torch.no_grad() :\n",
    "            for batch in test_loader: \n",
    "                eval_input_ids, eval_attention_mask, eval_labels = batch\n",
    "                eval_input_ids = eval_input_ids.to(device)\n",
    "                eval_attention_mask = eval_attention_mask.to(device)\n",
    "                eval_labels = eval_labels.view(-1) # we reshape the label to map the model output\n",
    "                eval_labels = eval_labels.to(device)\n",
    "\n",
    "                eval_logits = model(eval_input_ids, eval_attention_mask)\n",
    "                eval_loss = loss_fn(eval_logits, eval_labels)\n",
    "                test_loss += eval_loss.item()\n",
    "\n",
    "                eval_pred_label = nn.functional.sigmoid(eval_logits)\n",
    "                _, eval_pred_label = torch.max(eval_pred_label, 1)\n",
    "                accuracy(eval_pred_label, eval_labels)\n",
    "\n",
    "            #final test_loss\n",
    "            test_loss /= len(test_loader)\n",
    "            list_test_loss.append(test_loss)\n",
    "            val_acc = accuracy.compute()\n",
    "            test_accuracy.append(val_acc.item())\n",
    "            accuracy.reset()\n",
    "\n",
    "            print('Epoch {} loss on eval set is: -----> {} and acc is: ---->{}'.format(epoch+1, test_loss, val_acc))\n",
    "            print('=====================================================================')\n",
    "\n",
    "                \n",
    "\n",
    "    return list_train_loss, list_test_loss, train_accuracy, test_accuracy\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:28:48.027677Z",
     "iopub.status.busy": "2025-02-16T04:28:48.027311Z",
     "iopub.status.idle": "2025-02-16T04:31:01.286018Z",
     "shell.execute_reply": "2025-02-16T04:31:01.285234Z",
     "shell.execute_reply.started": "2025-02-16T04:28:48.027651Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1 loss on train set is: -----> 0.18581230601717638 and acc is: ----> 0.939645528793335\n",
      "-----------------------------------------------------------------------\n",
      "Epoch 1 loss on eval set is: -----> 0.04106280812785761 and acc is: ---->0.9901345372200012\n",
      "=====================================================================\n",
      "Epoch 2 loss on train set is: -----> 0.02988741252176681 and acc is: ----> 0.9914740920066833\n",
      "-----------------------------------------------------------------------\n",
      "Epoch 2 loss on eval set is: -----> 0.0406585737010963 and acc is: ---->0.9910314083099365\n",
      "=====================================================================\n"
     ]
    }
   ],
   "source": [
    "result = train_eval(model, optimizer, criterion, train_dataloader, eval_dataloader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:04.997508Z",
     "iopub.status.busy": "2025-02-16T04:31:04.997164Z",
     "iopub.status.idle": "2025-02-16T04:31:05.001067Z",
     "shell.execute_reply": "2025-02-16T04:31:05.000296Z",
     "shell.execute_reply.started": "2025-02-16T04:31:04.997479Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "list_train_loss, list_test_loss, train_accuracy, test_accuracy = result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:07.656542Z",
     "iopub.status.busy": "2025-02-16T04:31:07.656245Z",
     "iopub.status.idle": "2025-02-16T04:31:07.909992Z",
     "shell.execute_reply": "2025-02-16T04:31:07.909146Z",
     "shell.execute_reply.started": "2025-02-16T04:31:07.656519Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAKTCAYAAADv3NAtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACMEklEQVR4nOzdd1zVdf/G8et7Dnu6wYHinrgVFUUrFDXNWWqWaWWZE7irW/u1l91ZgqssGzbNrCwzZ5bi3nvvDYgDBJR1zu8P71vTxATBL+P1fDzOI76Hz/mc6wAS13mfYdjtdrsAAAAAAECesJgdAAAAAACAwoziDQAAAABAHqJ4AwAAAACQhyjeAAAAAADkIYo3AAAAAAB5iOINAAAAAEAeongDAAAAAJCHHMwOkFtsNptOnTolT09PGYZhdhwAAAAAQCFnt9t18eJFlStXThZL1nPtQlO8T506JT8/P7NjAAAAAACKmOPHj6tChQpZfr7QFG9PT09JV26wl5eXyWkAAAAAAIVdYmKi/Pz8rvbRrBSa4v2/h5d7eXlRvAEAAAAAd80/Pd2ZF1cDAAAAACAPUbwBAAAAAMhDFG8AAAAAAPJQoXmONwAAAADkJzabTWlpaWbHwB1wdHSU1Wq9430o3gAAAACQy9LS0nT48GHZbDazo+AOFStWTL6+vv/4Amq3QvEGAAAAgFxkt9t1+vRpWa1W+fn5yWLhGb4Fkd1uV0pKiuLi4iRJZcuWzfFeFG8AAAAAyEUZGRlKSUlRuXLl5ObmZnYc3AFXV1dJUlxcnMqUKZPjh51z1wsAAAAA5KLMzExJkpOTk8lJkBv+d+dJenp6jvegeAMAAABAHriT5wQj/8iN7yPFGwAAAACAPETxBgAAAAAgD1G8AQAAAAC5yt/fX1FRUbmy19KlS2UYhi5cuJAr+5mBVzUHAAAAAKhdu3Zq2LBhrhTm9evXy93d/c5DFRIUbwAAAADAP7Lb7crMzJSDwz/XyNKlS9+FRAUHDzUHAAAAgDxkt9uVkpZhyslut99WxoEDB2rZsmWaMGGCDMOQYRiaPn26DMPQ/Pnz1aRJEzk7O2vFihU6ePCgunXrJh8fH3l4eKhZs2b6/fffr9vvxoeaG4ahTz75RD169JCbm5uqV6+uOXPm5Phr+uOPP6pu3bpydnaWv7+/3n///es+/8EHH6h69epycXGRj4+PevfuffVzP/zwgwICAuTq6qqSJUsqJCREycnJOc5yO5h4AwAAAEAeupSeqTovLzTlune9Hio3p3+ufRMmTNC+fftUr149vf7665KknTt3SpJGjx6t9957T1WqVFHx4sV1/Phxde7cWW+99ZacnZ315ZdfqmvXrtq7d68qVqyY5XW89tprevfddzVu3DhNmjRJ/fv319GjR1WiRIls3aaNGzfqoYce0quvvqo+ffpo1apVGjp0qEqWLKmBAwdqw4YNGjlypL766iu1atVK586d0/LlyyVJp0+fVr9+/fTuu++qR48eunjxopYvX37bd1DkFMUbAAAAAIo4b29vOTk5yc3NTb6+vpKkPXv2SJJef/11tW/f/uraEiVKqEGDBleP33jjDc2ePVtz5szR8OHDs7yOgQMHql+/fpKkt99+WxMnTtS6devUsWPHbGUdP3687rvvPr300kuSpBo1amjXrl0aN26cBg4cqGPHjsnd3V1dunSRp6enKlWqpEaNGkm6UrwzMjLUs2dPVapUSZIUEBCQrevPCYo3AAAAAOQhV0erdr0eatp136mmTZted5yUlKRXX31Vv/3229Uie+nSJR07duyW+9SvX//qx+7u7vLy8lJcXFy28+zevVvdunW77rygoCBFRUUpMzNT7du3V6VKlVSlShV17NhRHTt2vPoQ9wYNGui+++5TQECAQkND1aFDB/Xu3VvFixfPdo7s4DneAAAAAJCHDMOQm5ODKSfDMO44/42vTv7ss89q9uzZevvtt7V8+XJt2bJFAQEBSktLu+U+jo6Of/u62Gy2O853I09PT23atEkzZsxQ2bJl9fLLL6tBgwa6cOGCrFarFi9erPnz56tOnTqaNGmSatasqcOHD+d6jr+ieAMAAAAA5OTkpMzMzH9ct3LlSg0cOFA9evRQQECAfH19deTIkbwP+F+1a9fWypUr/5apRo0aslqvTPgdHBwUEhKid999V9u2bdORI0f0xx9/SLpS+IOCgvTaa69p8+bNcnJy0uzZs/M0Mw81BwAAAADI399fa9eu1ZEjR+Th4ZHlNLp69er66aef1LVrVxmGoZdeeilPJtdZ+de//qVmzZrpjTfeUJ8+fbR69WpNnjxZH3zwgSRp7ty5OnTokIKDg1W8eHHNmzdPNptNNWvW1Nq1a7VkyRJ16NBBZcqU0dq1a3XmzBnVrl07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vHixLBaLMjMzzS0QIS/QPnrs2DFNmTJFiYmJioiIUNeuXXm9h6kC7aNz585Vt27dFBUVpeTkZN1+++06efJkA1WLUPP+++/riiuuUFJSkiwWi5YvX/6zt3n33XfVr18/RUREqHPnzlq4cKHpddYngnc9W7JkiXJycpSbm6u8vDz16dNH6enpOnLkiM/2mzZt0oQJEzRx4kTl5+crMzNTmZmZ2rZtWwNXjlARaB999913NWHCBK1fv16bN29WcnKyLrvsMh06dKiBK0eoCLSPuuzbt0933HGHhg0b1kCVIlQF2kfLyso0atQo7du3T0uXLtXOnTu1YMECnXvuuQ1cOUJFoH100aJFmjFjhnJzc7V9+3a98MILWrJkie65554GrhyhorS0VH369NG8efPOqP1XX32ljIwMXXzxxSooKNC0adN0ww03aPXq1SZXWo8M1KuBAwcaU6ZMqf53ZWWlkZSUZMyaNctn+6uvvtrIyMjw2JaammrceOONptaJ0BVoH/VWUVFhREdHGy+99JJZJSLE1aWPVlRUGIMHDzaef/55Izs72xg3blwDVIpQFWgfffbZZ42UlBSjrKysoUpEiAu0j06ZMsW45JJLPLbl5OQYQ4YMMbVOwDAMQ5KxbNmy07a58847jR49enhsGz9+vJGenm5iZfWLGe96VFZWpq1bt2rkyJHV26xWq0aOHKnNmzf7vM3mzZs92ktSenq63/bAL1GXPurtxIkTKi8vV5s2bcwqEyGsrn30L3/5i+Li4jRx4sSGKBMhrC599I033lBaWpqmTJmi+Ph49ezZUw8//LAqKysbqmyEkLr00cGDB2vr1q3Vy9H37t2rlStXasyYMQ1SM/BzmkJmsgW7gKbk6NGjqqysVHx8vMf2+Ph47dixw+dtCgsLfbYvLCw0rU6Errr0UW933XWXkpKSaj35AfWhLn30gw8+0AsvvKCCgoIGqBChri59dO/evVq3bp2uvfZarVy5Urt379bkyZNVXl6u3NzchigbIaQuffSaa67R0aNHNXToUBmGoYqKCt10000sNUej4S8zFRcX66efflJUVFSQKjtzzHgDOGOzZ8/W4sWLtWzZMkVGRga7HEAlJSXKysrSggULFBsbG+xyAJ8cDofi4uL03HPPqX///ho/frzuvfdezZ8/P9ilAZKc3+fy8MMP65lnnlFeXp5ee+01vfnmm5o5c2awSwOaDGa861FsbKzCwsJUVFTksb2oqEgJCQk+b5OQkBBQe+CXqEsfdZkzZ45mz56td955R7179zazTISwQPvonj17tG/fPl1xxRXV2xwOhyTJZrNp586d6tSpk7lFI6TU5Xk0MTFR4eHhCgsLq952/vnnq7CwUGVlZbLb7abWjNBSlz563333KSsrSzfccIMkqVevXiotLdWkSZN07733ymplrg7B5S8zxcTEnBWz3RIz3vXKbrerf//+Wrt2bfU2h8OhtWvXKi0tzedt0tLSPNpL0po1a/y2B36JuvRRSXr00Uc1c+ZMrVq1SgMGDGiIUhGiAu2j3bt312effaaCgoLqy5VXXln9rafJyckNWT5CQF2eR4cMGaLdu3dXDwpJ0q5du5SYmEjoRr2rSx89ceJErXDtGigyDMO8YoEz1CQyU7C/3a2pWbx4sREREWEsXLjQ+OKLL4xJkyYZrVq1MgoLCw3DMIysrCxjxowZ1e03btxo2Gw2Y86cOcb27duN3NxcIzw83Pjss8+CdQho4gLto7NnzzbsdruxdOlS45tvvqm+lJSUBOsQ0MQF2ke98a3mMFugffTAgQNGdHS0ccsttxg7d+40VqxYYcTFxRkPPvhgsA4BTVygfTQ3N9eIjo42XnnlFWPv3r3G22+/bXTq1Mm4+uqrg3UIaOJKSkqM/Px8Iz8/35BkPPbYY0Z+fr6xf/9+wzAMY8aMGUZWVlZ1+7179xrNmjUzpk+fbmzfvt2YN2+eERYWZqxatSpYhxAwgrcJnnrqKaN9+/aG3W43Bg4caGzZsqX6dyNGjDCys7M92r/66qtG165dDbvdbvTo0cN48803G7hihJpA+miHDh0MSbUuubm5DV84Qkagz6M1EbzREALto5s2bTJSU1ONiIgIIyUlxXjooYeMioqKBq4aoSSQPlpeXm78+c9/Njp16mRERkYaycnJxuTJk40ffvih4QtHSFi/fr3P95eufpmdnW2MGDGi1m369u1r2O12IyUlxXjxxRcbvO5fwmIYrB8BAAAAAMAsfMYbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBHBGwAAAAAAExG8AQAAAAAwEcEbAAAAAAATEbwBAAAAADARwRsAAAAAABMRvAEAAAAAMBHBGwAAAAAAE/0/NFA8UbnV/20AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (12, 8))\n",
    "plt.plot(list_train_loss, label = 'train_loss')\n",
    "plt.plot(list_test_loss, label = 'test_loss', linestyle = '--')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:10.576981Z",
     "iopub.status.busy": "2025-02-16T04:31:10.576688Z",
     "iopub.status.idle": "2025-02-16T04:31:10.748953Z",
     "shell.execute_reply": "2025-02-16T04:31:10.748098Z",
     "shell.execute_reply.started": "2025-02-16T04:31:10.576958Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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3ejoaAKB478W/dNPP+Xmm2+mf//+wOEFfP369eWW69NPP+Xss8/mZz/7WcmxNWvWlPw4ISGBli1bMnv2bC666KJv3D4jI4PNmzezcuXKo67eDRs2ZNu2bYRCoZLXwy9YsOC4uZYvX87u3bt56KGHSE1NBeDLL7/8xmM/99xzFBUVHXP1/tGPfsT1119Ps2bNaNOmDeecc85xH/tUeal5BRcKhXh14RYuffRD3li0jajICO64uC2v3HGOpVuSJEmqxFq2bMncuXNZv349u3btOuYa3a5dO2bMmMGCBQtYuHAh3//+909ouT5Z7dq148svv+Stt95i5cqV3HPPPXzxxRdHnDN27Fh+9atf8dhjj7Fq1Sq++uorHn/8cQAuuOACzj//fAYOHMg777zDunXrePPNN5k1axZw+PPLd+7cycSJE1mzZg1PPvkkb7755nFzNW/enOjoaB5//HHWrl3LK6+8wn333XfEObfffju5ubl873vf48svv2TVqlU8//zzrFixouScPn36kJiYyP3338+QIUNO9ZfrhFi8K7Ad+/O59YX53PG3r9l7sIi0xgm8fNs5/N9lHYip4aXlkiRJUmU2bNgwoqKi6NSpU8ll00fz6KOPUrduXc4++2z69u1Lnz59OPPMM8st109+8hMGDBjAddddR69evdi9e/cR6zfATTfdxOTJk/nNb35D586dufrqq1m1alXJz0+fPp0ePXpw/fXX06lTJ0aMGFGy7nfs2JHf/OY3PPnkk2RmZjJv3jyGDRt23FwNGzbk2WefZerUqXTq1ImHHnqIRx555Ihz6tevz3vvvceBAwe44IIL6NatG0899dQR63dkZCQ333wzgUCAG2+88VR+qU5YROi/L66vpHJzc0lKSiInJ4fExMRwxzkloVCIlxdsYeyrS9h3sIgakRHcdlFbbruoLdE1/P9KJEmSpH/Jz89n3bp1tGrVitjY2HDHUSXxwx/+kJ07d57QZ5t/2z9jJ9pDT6rFPfnkk7Rs2ZLY2Fh69erFvHnzjnluUVER48ePp02bNsTGxpKZmVlyicHRPPTQQ0RERPDLX/7yZKJVejty87nlz/P55YsL2HewiE5NEnn59nP430vbW7olSZIk6RTk5OTwySef8Ne//pU77rjjtD1uqZvciy++yNChQ7n33nv56quvyMzMpE+fPsd8W/rRo0fz+9//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saMBc3E1AAAAAAC6Ina8AQAAAACwEIM3AAAAAAAWYvAGAAAAAMBCDN4AAAAAAFiIwRsAAAAAAAsxeFtg7dq1GjBggCIjI5WWlqYTJ07ccX1RUZGGDBmiyMhIpaamqri42EdJEay86ejGjRs1fvx4xcTEKCYmRpMnT75rp4H75e37aKvCwkKFhIQoMzPT2oAIet529O+//1Zubq769u2riIgIDRo0iP/vYSlvO/rRRx9p8ODB6tGjhxwOhxYtWqTr16/7KC2CzbFjxzRt2jQlJSUpJCREu3fvvutjjh49qieffFIRERF69NFHtXnzZstzdiYG7062bds2LV68WE6nU6dOndLw4cOVnp6uP//8s931x48fV1ZWlmbPnq2ysjJlZmYqMzNTZ8+e9XFyBAtvO3r06FFlZWXpyJEjKi0tlcPh0JQpU/THH3/4ODmChbcdbXX+/HktWbJE48eP91FSBCtvO+pyufTcc8/p/Pnz2rFjhyorK7Vx40b169fPx8kRLLzt6JYtW5SXlyen06mKigpt2rRJ27Zt07Jly3ycHMHi6tWrGj58uNauXXtP68+dO6epU6fqmWeeUXl5uRYuXKg5c+Zo//79FiftRAadavTo0SY3N9fzb7fbbZKSksy7777b7voZM2aYqVOntjmWlpZmXn31VUtzInh529GbNTc3m6ioKPPll19aFRFBriMdbW5uNmPHjjWff/65ycnJMS+88IIPkiJYedvR9evXm4EDBxqXy+WriAhy3nY0NzfXTJo0qc2xxYsXm3HjxlmaEzDGGElm165dd1zz5ptvmqFDh7Y5NnPmTJOenm5hss7FjncncrlcOnnypCZPnuw5ZrPZNHnyZJWWlrb7mNLS0jbrJSk9Pf2264H70ZGO3uzatWu6ceOGYmNjrYqJINbRjr711luKj4/X7NmzfRETQawjHd2zZ4/GjBmj3NxcJSQkaNiwYcrPz5fb7fZVbASRjnR07NixOnnypOd09JqaGhUXFysjI8MnmYG7CYSZKczfAQJJfX293G63EhIS2hxPSEjQL7/80u5j6urq2l1fV1dnWU4Er4509GZLly5VUlLSLW9+QGfoSEe/++47bdq0SeXl5T5IiGDXkY7W1NTo8OHDevnll1VcXKyqqirNnz9fN27ckNPp9EVsBJGOdPSll15SfX29nn76aRlj1NzcrNdee41TzdFl3G5mamxs1H///acePXr4Kdm9Y8cbwD0rKChQYWGhdu3apcjISH/HAdTU1KTs7Gxt3LhRffr08XccoF0tLS2Kj4/Xhg0bNHLkSM2cOVPLly/XZ5995u9ogKT/v55Lfn6+1q1bp1OnTmnnzp3au3evVq9e7e9oQMBgx7sT9enTR6Ghobp06VKb45cuXVJiYmK7j0lMTPRqPXA/OtLRVmvWrFFBQYEOHjyoJ554wsqYCGLedrS6ulrnz5/XtGnTPMdaWlokSWFhYaqsrFRycrK1oRFUOvI+2rdvX4WHhys0NNRzLCUlRXV1dXK5XLLb7ZZmRnDpSEdXrlyp7OxszZkzR5KUmpqqq1evat68eVq+fLlsNvbq4F+3m5mio6O7xW63xI53p7Lb7Ro5cqQOHTrkOdbS0qJDhw5pzJgx7T5mzJgxbdZL0rfffnvb9cD96EhHJem9997T6tWrtW/fPo0aNcoXURGkvO3okCFDdObMGZWXl3tu06dP91z11OFw+DI+gkBH3kfHjRunqqoqzy+FJOnXX39V3759GbrR6TrS0WvXrt0yXLf+osgYY11Y4B4FxMzk76u7BZrCwkITERFhNm/ebH7++Wczb94807t3b1NXV2eMMSY7O9vk5eV51peUlJiwsDCzZs0aU1FRYZxOpwkPDzdnzpzx10tAgPO2owUFBcZut5sdO3aYixcvem5NTU3+egkIcN529GZc1RxW87ajtbW1JioqyixYsMBUVlaab775xsTHx5u3337bXy8BAc7bjjqdThMVFWW2bt1qampqzIEDB0xycrKZMWOGv14CAlxTU5MpKyszZWVlRpL58MMPTVlZmfntt9+MMcbk5eWZ7Oxsz/qamhrTs2dP88Ybb5iKigqzdu1aExoaavbt2+evl+A1Bm8LfPLJJ6Z///7Gbreb0aNHm++//95z34QJE0xOTk6b9du3bzeDBg0ydrvdDB061Ozdu9fHiRFsvOnoww8/bCTdcnM6nb4PjqDh7fvo/2Lwhi9429Hjx4+btLQ0ExERYQYOHGjeeecd09zc7OPUCCbedPTGjRtm1apVJjk52URGRhqHw2Hmz59vrly54vvgCApHjhxp9+fL1l7m5OSYCRMm3PKYESNGGLvdbgYOHGi++OILn+e+HyHGcP4IAAAAAABW4W+8AQAAAACwEIM3AAAAAAAWYvAGAAAAAMBCDN4AAAAAAFiIwRsAAAAAAAsxeAMAAAAAYCEGbwAAAAAALMTgDQAAAACAhRi8AQAAAACwEIM3AAAAAAAWYvAGAAAAAMBC/wespXnHuk9/hQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (12, 8))\n",
    "plt.plot(train_accuracy, label = 'train_accuracy')\n",
    "plt.plot(test_accuracy, label = 'test_accuracy')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:14.022271Z",
     "iopub.status.busy": "2025-02-16T04:31:14.021993Z",
     "iopub.status.idle": "2025-02-16T04:31:19.714189Z",
     "shell.execute_reply": "2025-02-16T04:31:19.713504Z",
     "shell.execute_reply.started": "2025-02-16T04:31:14.022250Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# Let's visualize, confusion matrix, and auc_roc_score\n",
    "all_labels = []\n",
    "all_preds = []\n",
    "\n",
    "with torch.no_grad():\n",
    "    \n",
    "    n_correct = 0\n",
    "    n_samples = 0\n",
    "    for batch in eval_dataloader:\n",
    "        input_ids, attention_mask, labels = batch\n",
    "        input_ids = input_ids.to(device)\n",
    "\n",
    "        attention_mask = attention_mask.to(device)\n",
    "\n",
    "        labels = labels.view(-1)\n",
    "        labels = labels.to(device)\n",
    "\n",
    "        logits = model(input_ids, attention_mask)\n",
    "        \n",
    "        eval_pred_label = nn.functional.sigmoid(logits)\n",
    "      \n",
    "        _, predictions = torch.max(eval_pred_label, 1)\n",
    "\n",
    "        all_labels.append(labels.cpu().numpy())\n",
    "        all_preds.append(predictions.cpu().numpy())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:24.106967Z",
     "iopub.status.busy": "2025-02-16T04:31:24.106683Z",
     "iopub.status.idle": "2025-02-16T04:31:24.111570Z",
     "shell.execute_reply": "2025-02-16T04:31:24.110855Z",
     "shell.execute_reply.started": "2025-02-16T04:31:24.106946Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "all_labels = np.concatenate(all_labels, axis=0)\n",
    "all_preds = np.concatenate(all_preds, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:26.612127Z",
     "iopub.status.busy": "2025-02-16T04:31:26.611811Z",
     "iopub.status.idle": "2025-02-16T04:31:26.617405Z",
     "shell.execute_reply": "2025-02-16T04:31:26.616447Z",
     "shell.execute_reply.started": "2025-02-16T04:31:26.612101Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, ..., 0, 0, 0])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:28.167180Z",
     "iopub.status.busy": "2025-02-16T04:31:28.166799Z",
     "iopub.status.idle": "2025-02-16T04:31:28.172383Z",
     "shell.execute_reply": "2025-02-16T04:31:28.171531Z",
     "shell.execute_reply.started": "2025-02-16T04:31:28.167145Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, ..., 0, 0, 0])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_preds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:30.342050Z",
     "iopub.status.busy": "2025-02-16T04:31:30.341766Z",
     "iopub.status.idle": "2025-02-16T04:31:30.347177Z",
     "shell.execute_reply": "2025-02-16T04:31:30.346418Z",
     "shell.execute_reply.started": "2025-02-16T04:31:30.342029Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.1336322869955157"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(list(filter(lambda x: x==1, all_labels)))/len(all_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:32.202033Z",
     "iopub.status.busy": "2025-02-16T04:31:32.201747Z",
     "iopub.status.idle": "2025-02-16T04:31:32.207593Z",
     "shell.execute_reply": "2025-02-16T04:31:32.206768Z",
     "shell.execute_reply.started": "2025-02-16T04:31:32.202011Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.12645739910313902"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(list(filter(lambda x: x==1, all_preds)))/len(all_preds)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:34.221886Z",
     "iopub.status.busy": "2025-02-16T04:31:34.221576Z",
     "iopub.status.idle": "2025-02-16T04:31:34.237100Z",
     "shell.execute_reply": "2025-02-16T04:31:34.236069Z",
     "shell.execute_reply.started": "2025-02-16T04:31:34.221859Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.99      1.00      0.99       966\n",
      "           1       0.99      0.94      0.97       149\n",
      "\n",
      "    accuracy                           0.99      1115\n",
      "   macro avg       0.99      0.97      0.98      1115\n",
      "weighted avg       0.99      0.99      0.99      1115\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(all_labels, all_preds))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:36.646903Z",
     "iopub.status.busy": "2025-02-16T04:31:36.646613Z",
     "iopub.status.idle": "2025-02-16T04:31:36.650677Z",
     "shell.execute_reply": "2025-02-16T04:31:36.649728Z",
     "shell.execute_reply.started": "2025-02-16T04:31:36.646881Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:31:39.386470Z",
     "iopub.status.busy": "2025-02-16T04:31:39.386104Z",
     "iopub.status.idle": "2025-02-16T04:31:39.392138Z",
     "shell.execute_reply": "2025-02-16T04:31:39.391442Z",
     "shell.execute_reply.started": "2025-02-16T04:31:39.386439Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9910313901345291\n"
     ]
    }
   ],
   "source": [
    "print(accuracy_score(all_labels, all_preds))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:34:02.597931Z",
     "iopub.status.busy": "2025-02-16T04:34:02.597616Z",
     "iopub.status.idle": "2025-02-16T04:34:02.827394Z",
     "shell.execute_reply": "2025-02-16T04:34:02.826509Z",
     "shell.execute_reply.started": "2025-02-16T04:34:02.597905Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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ot07tint9Cl1eKKRfV9WZqamvTNOn8+bqenzvlJQ/gI6c/qUw/syr1zR2bPpCspf4E6XDNyzLG8S77//fh09elSFCxdWkSJF9M0336hChQrasmWLvK673+xGvLy8TOMuXDacVS5yIZ+8eeWTN6/S09K0YcM69ejVx+qSANyiRxs0UblKVR32DerdWXUaNNFjjZtLkkqUKqPz585q/96fVKx4tCRpx7bNMrKyVDy69B2vGfeIuznycxLLm8THH39cK1asUJUqVdStWzc988wzmjZtmg4dOqSePXtaXR5ysQ3rv5NhSJGRUfrj0O8aP/YtRUU9qGYtWlpdGoC/8eeFCzryv0P21ylH/6cD+39WPv8AhYQWkn9AoMN4dw8PBQXn1/2FIyVJhSMfVMUqNTRpVLy69HlDmVeuaMr4kapZt4HyFwi5g58EuLdZ3iSOHPl/a1q1adNGhQsXVnJysooVK6amTZtaWBlyu3Nnz2nS2+N07FiKAgICVfexx9Sle0/Tb+0BkLvs37tb/bt3tL/+YPJYSVLdhk3V641h2TpH30EjNGV8gt7o8ZJsbm6qUauuXnrlNafUC9dwN//6PGexGYZxz83NMt0M3LuOnL5odQkAnKRoiI9l1950IM1p565SJMBp53Ymy5NESdq7d68mTZqkPXv2SJJKliypbt26qXjx4hZXBgAAXAEP05tZvlbIZ599ptKlS2vr1q0qW7asypYtq23btql06dL67LPPrC4PAAC4AJbAMbN8urlIkSJq166d4uPjHfYPHjxYn3zyiQ4cOJDjczLdDNy7mG4G7l1WTjdv+dV5082VH7w7p5stTxKPHj2qZ5991rT/mWee0dGjRy2oCAAAuByiRBPLm8TatWvru+++M+1ft26dHnnkEQsqAgAAgOUPrjRr1kyvvfaatm7dqqpVry6gunHjRs2bN09Dhw7V4sWLHcYCAADcbiyBY2b5PYlubtkLM202mzIzM7M1lnsSgXsX9yQC9y4r70n8/mC6085dKcrfaed2JsuTxKysLKtLAAAALo4lcMwsuycxOTlZS5cuddj30UcfKSoqSiEhIerUqZMyMjIsqg4AAMC1WdYkxsfHa/fu3fbXu3bt0gsvvKB69eqpX79+WrJkiRISEqwqDwAAuBAebjazrEncvn276tata389Z84cValSRVOnTlWvXr00ceJEzZ07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/fbbbypSpIgKFix4w3NHR0crb9686t27t8qVK6eqVatq7ty5+uCDD9S+fXuHsSNHjtQrr7yiihUrKiUlRUuWLJGnp6ckacCAAapQoYIaNGig2rVrKywszN5AAvh3/Pz8VKVKFY0fP141a9ZU6dKlNXDgQHXs2FGTJ0+2jxs6dKjmzJmjMmXK6KOPPtLs2bPt/6HWrFkz9ezZU127dlW5cuW0YcMGDRw40KqPBLgkm2H8wzoiwF1m9erVqlOnjk6fPq3AwECrywFwAzabTQsXLuQ/zoBcjCQRAAAAJjSJAAAAMGG6GQAAACYkiQAAADChSQQAAIAJTSIAAABMaBIBAABgQpMIAAAAE5pEALlWhw4dHBZbrl27tnr06HHH61i9erVsNpvOnDlzx68NAFahSQSQYx06dJDNZpPNZpOnp6eKFi2q+Ph4XblyxanXXbBggYYNG5atsTR2APDveFhdAIC7U8OGDTV9+nRlZGToyy+/VJcuXZQnTx7179/fYdylS5fsvzP73woODr4t5wEA/DOSRAC3xMvLS2FhYYqIiFDnzp1Vr149LV682D5FPHz4cIWHh6t48eKSpD/++EOtW7dWYGCggoOD1bx5c/3222/282VmZqpXr14KDAxU/vz59eqrr+r6tf6vn27OyMjQa6+9pgceeEBeXl4qWrSopk2bpt9++0116tSRJAUFBclms6lDhw6SpKysLCUkJCgqKko+Pj4qW7as5s+f73CdL7/8Ug899JB8fHxUp04dhzoBwFXQJAK4LXx8fHTp0iVJ0ooVK7R3714tX75cS5cu1eXLl9WgQQPly5dP3333ndavXy8/Pz81bNjQ/p6xY8dqxowZ+vDDD7Vu3TqdOnVKCxcu/NtrPvvss5o9e7YmTpyoPXv26L333pOfn58eeOABffbZZ5KkvXv36ujRo5owYYIkKSEhQR999JESExO1e/du9ezZU88884zWrFkj6Woz27JlSzVt2lTbt2/Xiy++qH79+jnrawOAXIvpZgD/imEYWrFihZYtW6Zu3brp+PHj8vX11QcffGCfZv7kk0+UlZWlDz74QDabTZI0ffp0BQYGavXq1apfv77efvtt9e/fXy1btpQkJSYmatmyZTe97r59+zR37lwtX75c9erVkyQ9+OCD9uPXpqZDQkIUGBgo6WryOGLECH377beqVq2a/T3r1q3Te++9p1q1amnKlCkqUqSIxo4dK0kqXry4du3apVGjRt3Gbw0Acj+aRAC3ZOnSpfLz89Ply5eVlZWlp59+WkOGDFGXLl0UExPjcB/ijh079MsvvyhfvnwO57h48aIOHDigtLQ0HT16VFWqVLEf8/DwUKVKlUxTztds375d7u7uqlWrVrZr/uWXX3ThwgU99thjDvsvXbqk8uXLS5L27NnjUIcke0MJAK6EJhHALalTp46mTJkiT09PhYeHy8Pj//458fX1dRh77tw5VaxYUTNnzjSdp2DBgrd0fR8fnxy/59y5c5KkL774Qvfdd5/DMS8vr1uqAwDuVTSJAG6Jr6+vihYtmq2xFSpU0KeffqqQkBD5+/vfcEyhQoW0adMm1axZU5J05coVbd26VRUqVLjh+JiYGGVlZWnNmjX26ea/upZkZmZm2vdFR0fLy8tLhw4dumkCWbJkSS1evNhh38aNG//5QwLAPYYHVwA4Xbt27VSgQAE1b95c3333nQ4ePKjVq1ere/fuOnz4sCTplVde0ciRI7Vo0SL9/PPP+u9///u3axxGRkYqLi5Ozz//vBYtWmQ/59y5cyVJERERstlsWrp0qY4fP65z584pX7586tOnj3r27KmkpCQdOHBA27Zt06RJk5SUlCRJevnll7V//3717dtXe/fu1axZszRjxgxnf0UAkOvQJAJwurx582rt2rUqXLiwWrZsqZIlS+qFF17QxYsX7cli79691b59e8XFxalatWrKly+fHn/88b8975QpU/TEE0/ov//9r0qUKKGOHTvq/PnzkqT77rtPQ4cOVb9+/RQaGqquXbtKkoYNG6aBAwcqISFBJUuWVMOGDfXFF18oKipKklS4cGF99tlnWrRokcqWLavExESNGDHCid8OAORONuNmd4UDAADAZZEkAgAAwIQmEQAAACY0iQAAADChSQQAAIAJTSIAAABMaBIBAABgQpMIAAAAE5pEAAAAmNAkAgAAwIQmEQAAACY0iQAAADD5f8AptFtKfhw6AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix, classification_report\n",
    "import seaborn as sns\n",
    "import torch\n",
    "import os\n",
    "\n",
    "# Compute confusion matrix\n",
    "cm = confusion_matrix(all_labels, all_preds)\n",
    "\n",
    "# Plot confusion matrix\n",
    "plt.figure(figsize=(8,6))\n",
    "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Not Spam', 'Spam'], yticklabels=['Not Spam', 'Spam'])\n",
    "plt.xlabel('Predicted')\n",
    "plt.ylabel('Actual')\n",
    "plt.title('Confusion Matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-16T04:34:55.017392Z",
     "iopub.status.busy": "2025-02-16T04:34:55.017080Z",
     "iopub.status.idle": "2025-02-16T04:34:55.450782Z",
     "shell.execute_reply": "2025-02-16T04:34:55.450000Z",
     "shell.execute_reply.started": "2025-02-16T04:34:55.017348Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model and tokenizer (if applicable) saved in distilbert_spam_model\n"
     ]
    }
   ],
   "source": [
    "# Save model and tokenizer for Hugging Face deployment\n",
    "output_dir = \"distilbert_spam_model\"\n",
    "os.makedirs(output_dir, exist_ok=True)\n",
    "\n",
    "# Save PyTorch model\n",
    "torch.save(model.state_dict(), os.path.join(output_dir, \"model.pth\"))\n",
    "\n",
    "# Save tokenizer if applicable\n",
    "if hasattr(tokenizer, 'save_pretrained'):\n",
    "    tokenizer.save_pretrained(output_dir)\n",
    "\n",
    "print(f\"Model and tokenizer (if applicable) saved in {output_dir}\")"
   ]
  }
 ],
 "metadata": {
  "kaggle": {
   "accelerator": "gpu",
   "dataSources": [
    {
     "datasetId": 483,
     "sourceId": 982,
     "sourceType": "datasetVersion"
    }
   ],
   "dockerImageVersionId": 30823,
   "isGpuEnabled": true,
   "isInternetEnabled": true,
   "language": "python",
   "sourceType": "notebook"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}