Spaces:
Sleeping
Sleeping
Commit
·
404ac46
1
Parent(s):
6074481
Added evaluation tab
Browse files- app.py +42 -17
- classification_report.png +0 -0
- confusion_matrix.png +0 -0
- main.ipynb +55 -22
- metrics.txt +12 -0
- tfidf_vectorizer.pkl +1 -1
app.py
CHANGED
@@ -24,20 +24,45 @@ def preprocess_text(text):
|
|
24 |
return " ".join(words)
|
25 |
|
26 |
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
return " ".join(words)
|
25 |
|
26 |
|
27 |
+
app, model_eval = st.tabs(["Application", "Model Evaluation"])
|
28 |
+
# STREAMLIT APP TAB 1
|
29 |
+
with app:
|
30 |
+
st.title("📩 Spam Detector App")
|
31 |
+
st.write("Enter a message below to check if it's **Spam** or **Not Spam**.")
|
32 |
+
|
33 |
+
|
34 |
+
user_input = st.text_area("Enter your message:")
|
35 |
+
|
36 |
+
if st.button("Check Spam"):
|
37 |
+
if user_input.strip():
|
38 |
+
processed_input = preprocess_text(user_input)
|
39 |
+
input_vector = vectorizer.transform([processed_input])
|
40 |
+
prediction = model.predict(input_vector)
|
41 |
+
|
42 |
+
result = "Spam" if prediction[0] == 1 else "Not Spam"
|
43 |
+
st.success(f"Prediction: {result}")
|
44 |
+
else:
|
45 |
+
st.warning("Please enter a message to check.")
|
46 |
+
|
47 |
+
with model_eval:
|
48 |
+
|
49 |
+
st.header("Model Evaluation")
|
50 |
+
st.write("The Spam Detection model was trained in order to detect if a message is considered a 'Spam' or 'Not Spam'. The dataset was taken from kaggle.")
|
51 |
+
st.write("dataset by Faisal Qureshi: https://www.kaggle.com/datasets/mfaisalqureshi/spam-email")
|
52 |
+
|
53 |
+
# CONFUSION MATRIX
|
54 |
+
st.title("Confusion Matrix")
|
55 |
+
st.write("The confusion matrix displays the actual values or true labels with the predicted values from the model. With this, we can identify the margin of error the model has. Consider the following when understanding the confusion matrix:")
|
56 |
+
st.write("True Positives (TP): Correctly predicted Spam")
|
57 |
+
st.write("True Negatives (TN): Correctly predicted Not Spam")
|
58 |
+
st.write("False Positives (FP): Predicted Spam but it was actually Not Spam (Type I error)")
|
59 |
+
st.write("False Negatives (FN): Predicted Ham but it was Spam (Type II error)")
|
60 |
+
st.image("confusion_matrix.png")
|
61 |
+
|
62 |
+
# EVALUATION MATRICS
|
63 |
+
st.title("Evaluation Metrics")
|
64 |
+
st.write("The image below represents the Accuracy, F1 score and the classification report of the model")
|
65 |
+
st.image("classification_report.png")
|
66 |
+
|
67 |
+
|
68 |
+
|
classification_report.png
ADDED
![]() |
confusion_matrix.png
ADDED
![]() |
main.ipynb
CHANGED
@@ -13,7 +13,7 @@
|
|
13 |
},
|
14 |
{
|
15 |
"cell_type": "code",
|
16 |
-
"execution_count":
|
17 |
"metadata": {},
|
18 |
"outputs": [
|
19 |
{
|
@@ -56,7 +56,7 @@
|
|
56 |
},
|
57 |
{
|
58 |
"cell_type": "code",
|
59 |
-
"execution_count":
|
60 |
"metadata": {},
|
61 |
"outputs": [],
|
62 |
"source": [
|
@@ -65,7 +65,7 @@
|
|
65 |
},
|
66 |
{
|
67 |
"cell_type": "code",
|
68 |
-
"execution_count":
|
69 |
"metadata": {},
|
70 |
"outputs": [],
|
71 |
"source": [
|
@@ -75,7 +75,7 @@
|
|
75 |
},
|
76 |
{
|
77 |
"cell_type": "code",
|
78 |
-
"execution_count":
|
79 |
"metadata": {},
|
80 |
"outputs": [
|
81 |
{
|
@@ -100,7 +100,7 @@
|
|
100 |
},
|
101 |
{
|
102 |
"cell_type": "code",
|
103 |
-
"execution_count":
|
104 |
"metadata": {},
|
105 |
"outputs": [
|
106 |
{
|
@@ -119,7 +119,7 @@
|
|
119 |
},
|
120 |
{
|
121 |
"cell_type": "code",
|
122 |
-
"execution_count":
|
123 |
"metadata": {},
|
124 |
"outputs": [
|
125 |
{
|
@@ -146,7 +146,7 @@
|
|
146 |
},
|
147 |
{
|
148 |
"cell_type": "code",
|
149 |
-
"execution_count":
|
150 |
"metadata": {},
|
151 |
"outputs": [],
|
152 |
"source": [
|
@@ -156,7 +156,7 @@
|
|
156 |
},
|
157 |
{
|
158 |
"cell_type": "code",
|
159 |
-
"execution_count":
|
160 |
"metadata": {},
|
161 |
"outputs": [],
|
162 |
"source": [
|
@@ -166,7 +166,7 @@
|
|
166 |
},
|
167 |
{
|
168 |
"cell_type": "code",
|
169 |
-
"execution_count":
|
170 |
"metadata": {},
|
171 |
"outputs": [],
|
172 |
"source": [
|
@@ -176,7 +176,7 @@
|
|
176 |
},
|
177 |
{
|
178 |
"cell_type": "code",
|
179 |
-
"execution_count":
|
180 |
"metadata": {},
|
181 |
"outputs": [],
|
182 |
"source": [
|
@@ -186,7 +186,7 @@
|
|
186 |
},
|
187 |
{
|
188 |
"cell_type": "code",
|
189 |
-
"execution_count":
|
190 |
"metadata": {},
|
191 |
"outputs": [
|
192 |
{
|
@@ -214,7 +214,7 @@
|
|
214 |
},
|
215 |
{
|
216 |
"cell_type": "code",
|
217 |
-
"execution_count":
|
218 |
"metadata": {},
|
219 |
"outputs": [],
|
220 |
"source": [
|
@@ -230,7 +230,7 @@
|
|
230 |
},
|
231 |
{
|
232 |
"cell_type": "code",
|
233 |
-
"execution_count":
|
234 |
"metadata": {},
|
235 |
"outputs": [],
|
236 |
"source": [
|
@@ -246,7 +246,7 @@
|
|
246 |
},
|
247 |
{
|
248 |
"cell_type": "code",
|
249 |
-
"execution_count":
|
250 |
"metadata": {},
|
251 |
"outputs": [],
|
252 |
"source": [
|
@@ -272,7 +272,7 @@
|
|
272 |
},
|
273 |
{
|
274 |
"cell_type": "code",
|
275 |
-
"execution_count":
|
276 |
"metadata": {},
|
277 |
"outputs": [],
|
278 |
"source": [
|
@@ -283,7 +283,7 @@
|
|
283 |
},
|
284 |
{
|
285 |
"cell_type": "code",
|
286 |
-
"execution_count":
|
287 |
"metadata": {},
|
288 |
"outputs": [
|
289 |
{
|
@@ -699,7 +699,7 @@
|
|
699 |
"MultinomialNB()"
|
700 |
]
|
701 |
},
|
702 |
-
"execution_count":
|
703 |
"metadata": {},
|
704 |
"output_type": "execute_result"
|
705 |
}
|
@@ -712,7 +712,7 @@
|
|
712 |
},
|
713 |
{
|
714 |
"cell_type": "code",
|
715 |
-
"execution_count":
|
716 |
"metadata": {},
|
717 |
"outputs": [],
|
718 |
"source": [
|
@@ -731,7 +731,7 @@
|
|
731 |
},
|
732 |
{
|
733 |
"cell_type": "code",
|
734 |
-
"execution_count":
|
735 |
"metadata": {},
|
736 |
"outputs": [
|
737 |
{
|
@@ -757,6 +757,8 @@
|
|
757 |
"source": [
|
758 |
"accuracy = accuracy_score(y_test, y_pred)\n",
|
759 |
"f1 = f1_score(y_test, y_pred)\n",
|
|
|
|
|
760 |
"print(f\"Accuracy: {accuracy:.4f}\")\n",
|
761 |
"print(f\"F1 Score: {f1:.4f}\")\n",
|
762 |
"print(\"\\nClassification Report:\\n\", classification_report(y_test, y_pred))\n"
|
@@ -764,7 +766,35 @@
|
|
764 |
},
|
765 |
{
|
766 |
"cell_type": "code",
|
767 |
-
"execution_count":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
768 |
"metadata": {},
|
769 |
"outputs": [
|
770 |
{
|
@@ -785,12 +815,15 @@
|
|
785 |
"plt.xlabel(\"Predicted\")\n",
|
786 |
"plt.ylabel(\"Actual\")\n",
|
787 |
"plt.title(\"Confusion Matrix\")\n",
|
788 |
-
"plt.
|
|
|
|
|
|
|
789 |
]
|
790 |
},
|
791 |
{
|
792 |
"cell_type": "code",
|
793 |
-
"execution_count":
|
794 |
"metadata": {},
|
795 |
"outputs": [
|
796 |
{
|
|
|
13 |
},
|
14 |
{
|
15 |
"cell_type": "code",
|
16 |
+
"execution_count": 22,
|
17 |
"metadata": {},
|
18 |
"outputs": [
|
19 |
{
|
|
|
56 |
},
|
57 |
{
|
58 |
"cell_type": "code",
|
59 |
+
"execution_count": 23,
|
60 |
"metadata": {},
|
61 |
"outputs": [],
|
62 |
"source": [
|
|
|
65 |
},
|
66 |
{
|
67 |
"cell_type": "code",
|
68 |
+
"execution_count": 24,
|
69 |
"metadata": {},
|
70 |
"outputs": [],
|
71 |
"source": [
|
|
|
75 |
},
|
76 |
{
|
77 |
"cell_type": "code",
|
78 |
+
"execution_count": 25,
|
79 |
"metadata": {},
|
80 |
"outputs": [
|
81 |
{
|
|
|
100 |
},
|
101 |
{
|
102 |
"cell_type": "code",
|
103 |
+
"execution_count": 26,
|
104 |
"metadata": {},
|
105 |
"outputs": [
|
106 |
{
|
|
|
119 |
},
|
120 |
{
|
121 |
"cell_type": "code",
|
122 |
+
"execution_count": 27,
|
123 |
"metadata": {},
|
124 |
"outputs": [
|
125 |
{
|
|
|
146 |
},
|
147 |
{
|
148 |
"cell_type": "code",
|
149 |
+
"execution_count": 28,
|
150 |
"metadata": {},
|
151 |
"outputs": [],
|
152 |
"source": [
|
|
|
156 |
},
|
157 |
{
|
158 |
"cell_type": "code",
|
159 |
+
"execution_count": 29,
|
160 |
"metadata": {},
|
161 |
"outputs": [],
|
162 |
"source": [
|
|
|
166 |
},
|
167 |
{
|
168 |
"cell_type": "code",
|
169 |
+
"execution_count": 30,
|
170 |
"metadata": {},
|
171 |
"outputs": [],
|
172 |
"source": [
|
|
|
176 |
},
|
177 |
{
|
178 |
"cell_type": "code",
|
179 |
+
"execution_count": 31,
|
180 |
"metadata": {},
|
181 |
"outputs": [],
|
182 |
"source": [
|
|
|
186 |
},
|
187 |
{
|
188 |
"cell_type": "code",
|
189 |
+
"execution_count": 32,
|
190 |
"metadata": {},
|
191 |
"outputs": [
|
192 |
{
|
|
|
214 |
},
|
215 |
{
|
216 |
"cell_type": "code",
|
217 |
+
"execution_count": 33,
|
218 |
"metadata": {},
|
219 |
"outputs": [],
|
220 |
"source": [
|
|
|
230 |
},
|
231 |
{
|
232 |
"cell_type": "code",
|
233 |
+
"execution_count": 34,
|
234 |
"metadata": {},
|
235 |
"outputs": [],
|
236 |
"source": [
|
|
|
246 |
},
|
247 |
{
|
248 |
"cell_type": "code",
|
249 |
+
"execution_count": 35,
|
250 |
"metadata": {},
|
251 |
"outputs": [],
|
252 |
"source": [
|
|
|
272 |
},
|
273 |
{
|
274 |
"cell_type": "code",
|
275 |
+
"execution_count": 36,
|
276 |
"metadata": {},
|
277 |
"outputs": [],
|
278 |
"source": [
|
|
|
283 |
},
|
284 |
{
|
285 |
"cell_type": "code",
|
286 |
+
"execution_count": 37,
|
287 |
"metadata": {},
|
288 |
"outputs": [
|
289 |
{
|
|
|
699 |
"MultinomialNB()"
|
700 |
]
|
701 |
},
|
702 |
+
"execution_count": 37,
|
703 |
"metadata": {},
|
704 |
"output_type": "execute_result"
|
705 |
}
|
|
|
712 |
},
|
713 |
{
|
714 |
"cell_type": "code",
|
715 |
+
"execution_count": 38,
|
716 |
"metadata": {},
|
717 |
"outputs": [],
|
718 |
"source": [
|
|
|
731 |
},
|
732 |
{
|
733 |
"cell_type": "code",
|
734 |
+
"execution_count": 39,
|
735 |
"metadata": {},
|
736 |
"outputs": [
|
737 |
{
|
|
|
757 |
"source": [
|
758 |
"accuracy = accuracy_score(y_test, y_pred)\n",
|
759 |
"f1 = f1_score(y_test, y_pred)\n",
|
760 |
+
"report = classification_report(y_test, y_pred)\n",
|
761 |
+
"\n",
|
762 |
"print(f\"Accuracy: {accuracy:.4f}\")\n",
|
763 |
"print(f\"F1 Score: {f1:.4f}\")\n",
|
764 |
"print(\"\\nClassification Report:\\n\", classification_report(y_test, y_pred))\n"
|
|
|
766 |
},
|
767 |
{
|
768 |
"cell_type": "code",
|
769 |
+
"execution_count": null,
|
770 |
+
"metadata": {},
|
771 |
+
"outputs": [
|
772 |
+
{
|
773 |
+
"data": {
|
774 |
+
"image/png": "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BQYGokuXLhgyZAjc3Nzw73//G0uWLEHLli2xb98+o1v11N9e5+TJkwbfGFOvW7duCAsLQ69evdCyZUvk5ORg3bp1GDduHP72t781ev8QERGpnjU+SWLuN4GIiPj7+5u8XYy/v7/F2/3HP/4hY8eOlcDAQHFycpL27dtLTEyMwW1cbpaXlyfR0dGi0+lEp9NJeHi4bNy40aDOoUOHZOjQoeLs7CzOzs4ydOhQOXz4sMn28J9Pxt5KRUWFTJkyRTp27CiOjo7i6+sr8fHxkpOT02Cb1piWyspKGTdunLi5uYlOp5P4+Hg5efJkg/Vvtd2zZ89KTEyMuLu7i1arldDQUFm8eLHU1dUZ1PvDH/4g/fr1E09PT3F0dJTAwEAZP368lJSUGLVZXFwsGo1GEhMTG+zTG2+8ISEhIaLT6cTBwUGCg4Plgw8+MPnpaSIiIjKfVY4AEhEREVHz0ayvASQiIiIiyzEAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRyjAAEhEREakMAyARERGRytzTAPj8889Do9Eoj7y8vHu5eYukpqZCo9Hctt4vv/yC4cOHw83NDRqNBuPHj7+j9mylqfePiIiIrMeqAXDTpk0YMGAAXF1d0bp1azz++ONYt26dsvyll17CihUrkJKSYs3N2tS0adPw3Xff4X//93+xYsUKJCYm2rpLirVr12L+/Pm27kajBQQEKP8sODg4oHPnzvjd736HX375xdZda5TmPh9ERHT/0IiIWKOh9PR0TJgwAb1798YLL7yAFi1aYNOmTbCzs8M333xjUDcvLw8DBgxAbm4uIiMjrbF5q6utrUVtbS2cnJxuWa9du3YYO3bsbd/YzW3PmsaPH4+8vDwUFxfftq4t+nc7AQEBaNOmDaZPn46amhocPHgQixcvRtu2bVFQUAB3d3dbd9EilswHERHR3dTCGo2cPn0aSUlJePTRR7F161a0aHGj2RdffBFlZWXW2MQ916JFC2Uc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TK6TnZ2NiooK1Z/+BZrGfNB/2Wo+5s6dCxHBlClTrDYWMmbufubfUdPVwtYdIGquvL29cfr0aQCAi4uLUn7mzBl4e3tb3J6DgwOWL1+O999/H4WFhfD394efnx8CAwPRrVs3k+usWLECzs7OePLJJxs3iPtIU5gP+i9bzMeFCxcwZ84cvP7666ioqDBY//LlyygrK0O7du3g4OBwByMjS/Yz/46aLh4BJGqk0NBQ/Pjjjwans+rq6lBQUIDQ0NBGt+vj44P+/fvDz88PhYWFKC4uRp8+fYzqXbhwAevXr8eIESPg7Ozc6O3dL2w9H2TIFvNx7tw5XLp0CW+//TZ8fX2VBwCkp6fD19fX6Ho0slxj9jP/jpoeBkCiRho+fDj0ej0yMjKUsuzsbFRWVuKJJ54wuU5ISAhCQkJMLhMRo7J33nkH9vb2GDt2rNGyVatW4dq1azz9+x+2ng8yZIv5aNeuHbKysoweABAbG4usrCx06dLlToemepbsZ/4dNV08BaxyCxcuxPnz53Ho0CEAN04p7tixA61bt+ZXJ93GoEGD0L9/fyQlJeHEiRNwcHDAhx9+iJ49e2LUqFEm1/nhhx8abK+kpAQJCQkYMWIEXFxcsGbNGmzatAkpKSno2rWrUf0VK1bA3d0dQ4YMsdqYmjNbzgf/jozZYj5atmyJ4cOHm1w/ICCgwWVk6HbPZ0v2s6Wva3QP2e4e1NQU+Pv7CwCjh7+/v6271ixUVlbKuHHjxM3NTXQ6ncTHx8vJkycbrF+/f005e/asxMTEiLu7u2i1WgkNDZXFixdLXV2dUd3i4mLRaDSSmJhotbHcD2w1H/w7Ms1W82GqXX4TiPka+3w2tZ/vZN7o7tKImDg+S0RERET3LV4DSERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASERERKQyDIBEREREKsMASEREd8W5c+cwfvx4tGnTBm5ubhgzZgzOnDnT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06dPl3bt2olGoxEAsmzZMovHUd+/nj17ilarle7du8s///nPRt9mRa/Xy4wZM6RDhw7SsmVLiYiIkIMHD0pQUJDExsYa1S8pKVH2W2Fhock2zdl/1LDKykoZN26cuLm5iU6nk/j4eIPb/vxa/XyYcvbsWYmJiRF3d3fRarUSGhoqixcvlrq6utv2A7zNhYhwPpoazkfzExER0eD7783vl+bOx53MG91dGhETx2ebsVOnTqF9+/b485//jBdffNHW3Wl2uP+IiIjuf9b5WKwNXblyxeD3//u//wMAg2sPqWHcf0REROpjlWsAbcnf3x+jR49GaGgoSktLMX/+fERHRyMsLMzWXWsWuP+IiIjUp9mfAp44cSK2bNmCEydOwM3NDXFxcfjjH//IO8CbifuPiIhIfZp9ACQiIiIiyzT7awCJiIiIyDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQqwwBIREREpDIMgEREREQq8/8BUQS9yexdHZgAAAAASUVORK5CYII=",
|
775 |
+
"text/plain": [
|
776 |
+
"<Figure size 800x600 with 1 Axes>"
|
777 |
+
]
|
778 |
+
},
|
779 |
+
"metadata": {},
|
780 |
+
"output_type": "display_data"
|
781 |
+
}
|
782 |
+
],
|
783 |
+
"source": [
|
784 |
+
"text_output = f\"Accuracy: {accuracy:.4f}\\nF1 Score: {f1:.4f}\\n\\nClassification Report:\\n{report}\"\n",
|
785 |
+
"\n",
|
786 |
+
"plt.figure(figsize=(8, 6))\n",
|
787 |
+
"plt.text(0.01, 0.99, text_output, fontsize=12, ha='left', va='top', family=\"monospace\")\n",
|
788 |
+
"# Hide axes\n",
|
789 |
+
"plt.axis(\"off\")\n",
|
790 |
+
"\n",
|
791 |
+
"plt.savefig(\"classification_report.png\", bbox_inches=\"tight\", dpi=300)\n",
|
792 |
+
"plt.show()"
|
793 |
+
]
|
794 |
+
},
|
795 |
+
{
|
796 |
+
"cell_type": "code",
|
797 |
+
"execution_count": 41,
|
798 |
"metadata": {},
|
799 |
"outputs": [
|
800 |
{
|
|
|
815 |
"plt.xlabel(\"Predicted\")\n",
|
816 |
"plt.ylabel(\"Actual\")\n",
|
817 |
"plt.title(\"Confusion Matrix\")\n",
|
818 |
+
"plt.savefig(\"confusion_matrix.png\")\n",
|
819 |
+
"plt.show()\n",
|
820 |
+
"# Save the figure\n",
|
821 |
+
"plt.close() "
|
822 |
]
|
823 |
},
|
824 |
{
|
825 |
"cell_type": "code",
|
826 |
+
"execution_count": 42,
|
827 |
"metadata": {},
|
828 |
"outputs": [
|
829 |
{
|
metrics.txt
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Accuracy: 0.9398
|
2 |
+
F1 Score: 0.9375
|
3 |
+
|
4 |
+
Classification Report:
|
5 |
+
precision recall f1-score support
|
6 |
+
|
7 |
+
0 0.91 0.97 0.94 150
|
8 |
+
1 0.97 0.91 0.94 149
|
9 |
+
|
10 |
+
accuracy 0.94 299
|
11 |
+
macro avg 0.94 0.94 0.94 299
|
12 |
+
weighted avg 0.94 0.94 0.94 299
|
tfidf_vectorizer.pkl
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
size 78711
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:856e0ba9a758d06ab564a5675d2f538c180786a5aecba0d03b3ed5c98fb10968
|
3 |
size 78711
|