Spaces:
Sleeping
Sleeping
Commit
·
d92e33e
1
Parent(s):
034574b
Added Model Evaluation Tab
Browse files- app.py +36 -12
- classification_report.png +0 -0
- correlation_matrix.png +0 -0
- main.ipynb +91 -82
- weather_predictions.png +0 -0
app.py
CHANGED
@@ -13,21 +13,45 @@ reverse_mapping = {v: k for k, v in weather_mapping.items()} # Reverse mapping
|
|
13 |
feature_columns = ["precipitation", "temp_max", "temp_min", "wind"]
|
14 |
|
15 |
# STREAMLIT UI
|
16 |
-
st.
|
17 |
-
|
|
|
|
|
|
|
18 |
|
19 |
-
# User inputs
|
20 |
-
precipitation = st.number_input("Precipitation (mm)", min_value=0.0, max_value=100.0, step=0.1)
|
21 |
-
temp_max = st.number_input("Max Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
|
22 |
-
temp_min = st.number_input("Min Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
|
23 |
-
wind = st.number_input("Wind Speed (km/h)", min_value=0.0, max_value=100.0, step=0.1)
|
24 |
|
25 |
-
if st.button("Predict Weather"):
|
26 |
-
|
27 |
|
28 |
|
29 |
-
|
30 |
|
31 |
-
|
32 |
|
33 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
feature_columns = ["precipitation", "temp_max", "temp_min", "wind"]
|
14 |
|
15 |
# STREAMLIT UI
|
16 |
+
app, model_eval = st.tabs(["Application", "Model Evaluation"])
|
17 |
+
# STREAMLIT APP TAB 1
|
18 |
+
with app:
|
19 |
+
st.title("🌦️ Weather Prediction App")
|
20 |
+
st.write("Enter weather conditions, and the model will predict the weather category!")
|
21 |
|
22 |
+
# User inputs
|
23 |
+
precipitation = st.number_input("Precipitation (mm)", min_value=0.0, max_value=100.0, step=0.1)
|
24 |
+
temp_max = st.number_input("Max Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
|
25 |
+
temp_min = st.number_input("Min Temperature (°C)", min_value=-50.0, max_value=50.0, step=0.1)
|
26 |
+
wind = st.number_input("Wind Speed (km/h)", min_value=0.0, max_value=100.0, step=0.1)
|
27 |
|
28 |
+
if st.button("Predict Weather"):
|
29 |
+
input_data = pd.DataFrame([[precipitation, temp_max, temp_min, wind]], columns=feature_columns)
|
30 |
|
31 |
|
32 |
+
prediction_num = model.predict(input_data)[0]
|
33 |
|
34 |
+
prediction_label = reverse_mapping.get(prediction_num, "Unknown")
|
35 |
|
36 |
+
st.success(f"🌤️ Predicted Weather: **{prediction_label.capitalize()}**")
|
37 |
+
|
38 |
+
with model_eval:
|
39 |
+
|
40 |
+
st.header("Model Evaluation")
|
41 |
+
st.write("The Weather Prediction model was trained in order to determine the type of weather based on weather conditions. The dataset was taken from kaggle.")
|
42 |
+
st.write("dataset by Dataset by dataset by ANANTH R. Link to the dataset: https://www.kaggle.com/datasets/ananthr1/weather-prediction")
|
43 |
+
|
44 |
+
# CORRELATION MATRIX
|
45 |
+
st.title("Correlation Matrix")
|
46 |
+
st.write("The Correlation Matrix presents the relationship between each features.")
|
47 |
+
|
48 |
+
# WEATHER PREDICTION
|
49 |
+
st.title("Weather Prediction")
|
50 |
+
st.write("The image below shows the predicted vs actual weather conditions")
|
51 |
+
st.image("weather_predictions.png")
|
52 |
+
|
53 |
+
|
54 |
+
# EVALUATION MATRICS
|
55 |
+
st.title("Evaluation Metrics")
|
56 |
+
st.write("The image below represents the Accuracy, F1 score and the classification report of the model")
|
57 |
+
st.image("classification_report.png")
|
classification_report.png
ADDED
![]() |
correlation_matrix.png
ADDED
![]() |
main.ipynb
CHANGED
@@ -13,7 +13,7 @@
|
|
13 |
},
|
14 |
{
|
15 |
"cell_type": "code",
|
16 |
-
"execution_count":
|
17 |
"metadata": {},
|
18 |
"outputs": [],
|
19 |
"source": [
|
@@ -23,7 +23,7 @@
|
|
23 |
"import seaborn as sns\n",
|
24 |
"from sklearn.model_selection import train_test_split\n",
|
25 |
"from sklearn.tree import DecisionTreeClassifier\n",
|
26 |
-
"from sklearn.metrics import classification_report, f1_score\n",
|
27 |
"\n",
|
28 |
"import joblib\n"
|
29 |
]
|
@@ -38,7 +38,7 @@
|
|
38 |
},
|
39 |
{
|
40 |
"cell_type": "code",
|
41 |
-
"execution_count":
|
42 |
"metadata": {},
|
43 |
"outputs": [],
|
44 |
"source": [
|
@@ -48,7 +48,7 @@
|
|
48 |
},
|
49 |
{
|
50 |
"cell_type": "code",
|
51 |
-
"execution_count":
|
52 |
"metadata": {},
|
53 |
"outputs": [
|
54 |
{
|
@@ -77,7 +77,7 @@
|
|
77 |
},
|
78 |
{
|
79 |
"cell_type": "code",
|
80 |
-
"execution_count":
|
81 |
"metadata": {},
|
82 |
"outputs": [],
|
83 |
"source": [
|
@@ -93,7 +93,7 @@
|
|
93 |
},
|
94 |
{
|
95 |
"cell_type": "code",
|
96 |
-
"execution_count":
|
97 |
"metadata": {},
|
98 |
"outputs": [],
|
99 |
"source": [
|
@@ -102,7 +102,7 @@
|
|
102 |
},
|
103 |
{
|
104 |
"cell_type": "code",
|
105 |
-
"execution_count":
|
106 |
"metadata": {},
|
107 |
"outputs": [
|
108 |
{
|
@@ -133,20 +133,18 @@
|
|
133 |
},
|
134 |
{
|
135 |
"cell_type": "code",
|
136 |
-
"execution_count":
|
137 |
"metadata": {},
|
138 |
"outputs": [],
|
139 |
"source": [
|
140 |
-
"# Define manual mapping\n",
|
141 |
"weather_mapping = {\"rain\": 0, \"sun\": 1, \"fog\": 2, \"drizzle\": 3, \"snow\": 4}\n",
|
142 |
"\n",
|
143 |
-
"# Apply mapping\n",
|
144 |
"df[\"weather\"] = df[\"weather\"].map(weather_mapping)"
|
145 |
]
|
146 |
},
|
147 |
{
|
148 |
"cell_type": "code",
|
149 |
-
"execution_count":
|
150 |
"metadata": {},
|
151 |
"outputs": [
|
152 |
{
|
@@ -164,7 +162,8 @@
|
|
164 |
"plt.figure(figsize=(8, 6))\n",
|
165 |
"sns.heatmap(df.corr(), annot=True, cmap=\"coolwarm\", fmt=\".2f\")\n",
|
166 |
"plt.title(\"Correlation Matrix\")\n",
|
167 |
-
"plt.
|
|
|
168 |
]
|
169 |
},
|
170 |
{
|
@@ -177,7 +176,7 @@
|
|
177 |
},
|
178 |
{
|
179 |
"cell_type": "code",
|
180 |
-
"execution_count":
|
181 |
"metadata": {},
|
182 |
"outputs": [],
|
183 |
"source": [
|
@@ -187,23 +186,22 @@
|
|
187 |
},
|
188 |
{
|
189 |
"cell_type": "code",
|
190 |
-
"execution_count":
|
191 |
"metadata": {},
|
192 |
"outputs": [],
|
193 |
"source": [
|
194 |
-
"# Train-test split\n",
|
195 |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n"
|
196 |
]
|
197 |
},
|
198 |
{
|
199 |
"cell_type": "code",
|
200 |
-
"execution_count":
|
201 |
"metadata": {},
|
202 |
"outputs": [
|
203 |
{
|
204 |
"data": {
|
205 |
"text/html": [
|
206 |
-
"<style>#sk-container-id-
|
207 |
" /* Definition of color scheme common for light and dark mode */\n",
|
208 |
" --sklearn-color-text: black;\n",
|
209 |
" --sklearn-color-line: gray;\n",
|
@@ -233,15 +231,15 @@
|
|
233 |
" }\n",
|
234 |
"}\n",
|
235 |
"\n",
|
236 |
-
"#sk-container-id-
|
237 |
" color: var(--sklearn-color-text);\n",
|
238 |
"}\n",
|
239 |
"\n",
|
240 |
-
"#sk-container-id-
|
241 |
" padding: 0;\n",
|
242 |
"}\n",
|
243 |
"\n",
|
244 |
-
"#sk-container-id-
|
245 |
" border: 0;\n",
|
246 |
" clip: rect(1px 1px 1px 1px);\n",
|
247 |
" clip: rect(1px, 1px, 1px, 1px);\n",
|
@@ -253,7 +251,7 @@
|
|
253 |
" width: 1px;\n",
|
254 |
"}\n",
|
255 |
"\n",
|
256 |
-
"#sk-container-id-
|
257 |
" border: 1px dashed var(--sklearn-color-line);\n",
|
258 |
" margin: 0 0.4em 0.5em 0.4em;\n",
|
259 |
" box-sizing: border-box;\n",
|
@@ -261,7 +259,7 @@
|
|
261 |
" background-color: var(--sklearn-color-background);\n",
|
262 |
"}\n",
|
263 |
"\n",
|
264 |
-
"#sk-container-id-
|
265 |
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
266 |
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
267 |
" so we also need the `!important` here to be able to override the\n",
|
@@ -271,7 +269,7 @@
|
|
271 |
" position: relative;\n",
|
272 |
"}\n",
|
273 |
"\n",
|
274 |
-
"#sk-container-id-
|
275 |
" display: none;\n",
|
276 |
"}\n",
|
277 |
"\n",
|
@@ -287,14 +285,14 @@
|
|
287 |
"\n",
|
288 |
"/* Parallel-specific style estimator block */\n",
|
289 |
"\n",
|
290 |
-
"#sk-container-id-
|
291 |
" content: \"\";\n",
|
292 |
" width: 100%;\n",
|
293 |
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
294 |
" flex-grow: 1;\n",
|
295 |
"}\n",
|
296 |
"\n",
|
297 |
-
"#sk-container-id-
|
298 |
" display: flex;\n",
|
299 |
" align-items: stretch;\n",
|
300 |
" justify-content: center;\n",
|
@@ -302,28 +300,28 @@
|
|
302 |
" position: relative;\n",
|
303 |
"}\n",
|
304 |
"\n",
|
305 |
-
"#sk-container-id-
|
306 |
" display: flex;\n",
|
307 |
" flex-direction: column;\n",
|
308 |
"}\n",
|
309 |
"\n",
|
310 |
-
"#sk-container-id-
|
311 |
" align-self: flex-end;\n",
|
312 |
" width: 50%;\n",
|
313 |
"}\n",
|
314 |
"\n",
|
315 |
-
"#sk-container-id-
|
316 |
" align-self: flex-start;\n",
|
317 |
" width: 50%;\n",
|
318 |
"}\n",
|
319 |
"\n",
|
320 |
-
"#sk-container-id-
|
321 |
" width: 0;\n",
|
322 |
"}\n",
|
323 |
"\n",
|
324 |
"/* Serial-specific style estimator block */\n",
|
325 |
"\n",
|
326 |
-
"#sk-container-id-
|
327 |
" display: flex;\n",
|
328 |
" flex-direction: column;\n",
|
329 |
" align-items: center;\n",
|
@@ -341,14 +339,14 @@
|
|
341 |
"\n",
|
342 |
"/* Pipeline and ColumnTransformer style (default) */\n",
|
343 |
"\n",
|
344 |
-
"#sk-container-id-
|
345 |
" /* Default theme specific background. It is overwritten whether we have a\n",
|
346 |
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
347 |
" background-color: var(--sklearn-color-background);\n",
|
348 |
"}\n",
|
349 |
"\n",
|
350 |
"/* Toggleable label */\n",
|
351 |
-
"#sk-container-id-
|
352 |
" cursor: pointer;\n",
|
353 |
" display: block;\n",
|
354 |
" width: 100%;\n",
|
@@ -358,7 +356,7 @@
|
|
358 |
" text-align: center;\n",
|
359 |
"}\n",
|
360 |
"\n",
|
361 |
-
"#sk-container-id-
|
362 |
" /* Arrow on the left of the label */\n",
|
363 |
" content: \"▸\";\n",
|
364 |
" float: left;\n",
|
@@ -366,13 +364,13 @@
|
|
366 |
" color: var(--sklearn-color-icon);\n",
|
367 |
"}\n",
|
368 |
"\n",
|
369 |
-
"#sk-container-id-
|
370 |
" color: var(--sklearn-color-text);\n",
|
371 |
"}\n",
|
372 |
"\n",
|
373 |
"/* Toggleable content - dropdown */\n",
|
374 |
"\n",
|
375 |
-
"#sk-container-id-
|
376 |
" max-height: 0;\n",
|
377 |
" max-width: 0;\n",
|
378 |
" overflow: hidden;\n",
|
@@ -381,12 +379,12 @@
|
|
381 |
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
382 |
"}\n",
|
383 |
"\n",
|
384 |
-
"#sk-container-id-
|
385 |
" /* fitted */\n",
|
386 |
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
387 |
"}\n",
|
388 |
"\n",
|
389 |
-
"#sk-container-id-
|
390 |
" margin: 0.2em;\n",
|
391 |
" border-radius: 0.25em;\n",
|
392 |
" color: var(--sklearn-color-text);\n",
|
@@ -394,79 +392,79 @@
|
|
394 |
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
395 |
"}\n",
|
396 |
"\n",
|
397 |
-
"#sk-container-id-
|
398 |
" /* unfitted */\n",
|
399 |
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
400 |
"}\n",
|
401 |
"\n",
|
402 |
-
"#sk-container-id-
|
403 |
" /* Expand drop-down */\n",
|
404 |
" max-height: 200px;\n",
|
405 |
" max-width: 100%;\n",
|
406 |
" overflow: auto;\n",
|
407 |
"}\n",
|
408 |
"\n",
|
409 |
-
"#sk-container-id-
|
410 |
" content: \"▾\";\n",
|
411 |
"}\n",
|
412 |
"\n",
|
413 |
"/* Pipeline/ColumnTransformer-specific style */\n",
|
414 |
"\n",
|
415 |
-
"#sk-container-id-
|
416 |
" color: var(--sklearn-color-text);\n",
|
417 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
418 |
"}\n",
|
419 |
"\n",
|
420 |
-
"#sk-container-id-
|
421 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
422 |
"}\n",
|
423 |
"\n",
|
424 |
"/* Estimator-specific style */\n",
|
425 |
"\n",
|
426 |
"/* Colorize estimator box */\n",
|
427 |
-
"#sk-container-id-
|
428 |
" /* unfitted */\n",
|
429 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
430 |
"}\n",
|
431 |
"\n",
|
432 |
-
"#sk-container-id-
|
433 |
" /* fitted */\n",
|
434 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
435 |
"}\n",
|
436 |
"\n",
|
437 |
-
"#sk-container-id-
|
438 |
-
"#sk-container-id-
|
439 |
" /* The background is the default theme color */\n",
|
440 |
" color: var(--sklearn-color-text-on-default-background);\n",
|
441 |
"}\n",
|
442 |
"\n",
|
443 |
"/* On hover, darken the color of the background */\n",
|
444 |
-
"#sk-container-id-
|
445 |
" color: var(--sklearn-color-text);\n",
|
446 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
447 |
"}\n",
|
448 |
"\n",
|
449 |
"/* Label box, darken color on hover, fitted */\n",
|
450 |
-
"#sk-container-id-
|
451 |
" color: var(--sklearn-color-text);\n",
|
452 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
453 |
"}\n",
|
454 |
"\n",
|
455 |
"/* Estimator label */\n",
|
456 |
"\n",
|
457 |
-
"#sk-container-id-
|
458 |
" font-family: monospace;\n",
|
459 |
" font-weight: bold;\n",
|
460 |
" display: inline-block;\n",
|
461 |
" line-height: 1.2em;\n",
|
462 |
"}\n",
|
463 |
"\n",
|
464 |
-
"#sk-container-id-
|
465 |
" text-align: center;\n",
|
466 |
"}\n",
|
467 |
"\n",
|
468 |
"/* Estimator-specific */\n",
|
469 |
-
"#sk-container-id-
|
470 |
" font-family: monospace;\n",
|
471 |
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
472 |
" border-radius: 0.25em;\n",
|
@@ -476,18 +474,18 @@
|
|
476 |
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
477 |
"}\n",
|
478 |
"\n",
|
479 |
-
"#sk-container-id-
|
480 |
" /* fitted */\n",
|
481 |
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
482 |
"}\n",
|
483 |
"\n",
|
484 |
"/* on hover */\n",
|
485 |
-
"#sk-container-id-
|
486 |
" /* unfitted */\n",
|
487 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
488 |
"}\n",
|
489 |
"\n",
|
490 |
-
"#sk-container-id-
|
491 |
" /* fitted */\n",
|
492 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
493 |
"}\n",
|
@@ -574,7 +572,7 @@
|
|
574 |
"\n",
|
575 |
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
576 |
"\n",
|
577 |
-
"#sk-container-id-
|
578 |
" float: right;\n",
|
579 |
" font-size: 1rem;\n",
|
580 |
" line-height: 1em;\n",
|
@@ -589,44 +587,43 @@
|
|
589 |
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
590 |
"}\n",
|
591 |
"\n",
|
592 |
-
"#sk-container-id-
|
593 |
" /* fitted */\n",
|
594 |
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
595 |
" color: var(--sklearn-color-fitted-level-1);\n",
|
596 |
"}\n",
|
597 |
"\n",
|
598 |
"/* On hover */\n",
|
599 |
-
"#sk-container-id-
|
600 |
" /* unfitted */\n",
|
601 |
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
602 |
" color: var(--sklearn-color-background);\n",
|
603 |
" text-decoration: none;\n",
|
604 |
"}\n",
|
605 |
"\n",
|
606 |
-
"#sk-container-id-
|
607 |
" /* fitted */\n",
|
608 |
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
609 |
"}\n",
|
610 |
-
"</style><div id=\"sk-container-id-
|
611 |
],
|
612 |
"text/plain": [
|
613 |
"DecisionTreeClassifier(random_state=42)"
|
614 |
]
|
615 |
},
|
616 |
-
"execution_count":
|
617 |
"metadata": {},
|
618 |
"output_type": "execute_result"
|
619 |
}
|
620 |
],
|
621 |
"source": [
|
622 |
-
"# Train Decision Tree model\n",
|
623 |
"model = DecisionTreeClassifier(random_state=42)\n",
|
624 |
"model.fit(X_train, y_train)"
|
625 |
]
|
626 |
},
|
627 |
{
|
628 |
"cell_type": "code",
|
629 |
-
"execution_count":
|
630 |
"metadata": {},
|
631 |
"outputs": [],
|
632 |
"source": [
|
@@ -644,16 +641,16 @@
|
|
644 |
},
|
645 |
{
|
646 |
"cell_type": "code",
|
647 |
-
"execution_count":
|
648 |
"metadata": {},
|
649 |
"outputs": [
|
650 |
{
|
651 |
"name": "stdout",
|
652 |
"output_type": "stream",
|
653 |
"text": [
|
654 |
-
"\n",
|
655 |
"Classification Report:\n",
|
656 |
-
"
|
657 |
"\n",
|
658 |
" 0 0.91 0.95 0.93 139\n",
|
659 |
" 1 0.84 0.78 0.81 125\n",
|
@@ -664,22 +661,41 @@
|
|
664 |
" accuracy 0.80 293\n",
|
665 |
" macro avg 0.44 0.42 0.42 293\n",
|
666 |
"weighted avg 0.81 0.80 0.80 293\n",
|
667 |
-
"\n"
|
668 |
-
"\n",
|
669 |
-
"F1 Score: 0.802114678972584\n"
|
670 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
671 |
}
|
672 |
],
|
673 |
"source": [
|
674 |
-
"
|
675 |
-
"
|
676 |
-
"
|
677 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
678 |
]
|
679 |
},
|
680 |
{
|
681 |
"cell_type": "code",
|
682 |
-
"execution_count":
|
683 |
"metadata": {},
|
684 |
"outputs": [
|
685 |
{
|
@@ -699,7 +715,6 @@
|
|
699 |
"y_test_labels = [reverse_mapping[val] for val in y_test]\n",
|
700 |
"y_pred_labels = [reverse_mapping[val] for val in y_pred]\n",
|
701 |
"\n",
|
702 |
-
"# Plot actual vs predicted values\n",
|
703 |
"plt.figure(figsize=(8, 6))\n",
|
704 |
"sns.scatterplot(x=range(len(y_test)), y=y_test_labels, label='Actual', color='blue')\n",
|
705 |
"sns.scatterplot(x=range(len(y_pred)), y=y_pred_labels, label='Predicted', color='red')\n",
|
@@ -708,12 +723,13 @@
|
|
708 |
"plt.ylabel(\"Weather Condition\")\n",
|
709 |
"plt.title(\"Actual vs Predicted Weather Conditions\")\n",
|
710 |
"plt.legend()\n",
|
|
|
711 |
"plt.show()\n"
|
712 |
]
|
713 |
},
|
714 |
{
|
715 |
"cell_type": "code",
|
716 |
-
"execution_count":
|
717 |
"metadata": {},
|
718 |
"outputs": [
|
719 |
{
|
@@ -729,13 +745,6 @@
|
|
729 |
"joblib.dump(model, \"weather_model.pkl\")\n",
|
730 |
"print(\"Model saved successfully!\")"
|
731 |
]
|
732 |
-
},
|
733 |
-
{
|
734 |
-
"cell_type": "code",
|
735 |
-
"execution_count": null,
|
736 |
-
"metadata": {},
|
737 |
-
"outputs": [],
|
738 |
-
"source": []
|
739 |
}
|
740 |
],
|
741 |
"metadata": {
|
|
|
13 |
},
|
14 |
{
|
15 |
"cell_type": "code",
|
16 |
+
"execution_count": 61,
|
17 |
"metadata": {},
|
18 |
"outputs": [],
|
19 |
"source": [
|
|
|
23 |
"import seaborn as sns\n",
|
24 |
"from sklearn.model_selection import train_test_split\n",
|
25 |
"from sklearn.tree import DecisionTreeClassifier\n",
|
26 |
+
"from sklearn.metrics import classification_report, f1_score, accuracy_score\n",
|
27 |
"\n",
|
28 |
"import joblib\n"
|
29 |
]
|
|
|
38 |
},
|
39 |
{
|
40 |
"cell_type": "code",
|
41 |
+
"execution_count": 62,
|
42 |
"metadata": {},
|
43 |
"outputs": [],
|
44 |
"source": [
|
|
|
48 |
},
|
49 |
{
|
50 |
"cell_type": "code",
|
51 |
+
"execution_count": 63,
|
52 |
"metadata": {},
|
53 |
"outputs": [
|
54 |
{
|
|
|
77 |
},
|
78 |
{
|
79 |
"cell_type": "code",
|
80 |
+
"execution_count": 64,
|
81 |
"metadata": {},
|
82 |
"outputs": [],
|
83 |
"source": [
|
|
|
93 |
},
|
94 |
{
|
95 |
"cell_type": "code",
|
96 |
+
"execution_count": 65,
|
97 |
"metadata": {},
|
98 |
"outputs": [],
|
99 |
"source": [
|
|
|
102 |
},
|
103 |
{
|
104 |
"cell_type": "code",
|
105 |
+
"execution_count": 66,
|
106 |
"metadata": {},
|
107 |
"outputs": [
|
108 |
{
|
|
|
133 |
},
|
134 |
{
|
135 |
"cell_type": "code",
|
136 |
+
"execution_count": 67,
|
137 |
"metadata": {},
|
138 |
"outputs": [],
|
139 |
"source": [
|
|
|
140 |
"weather_mapping = {\"rain\": 0, \"sun\": 1, \"fog\": 2, \"drizzle\": 3, \"snow\": 4}\n",
|
141 |
"\n",
|
|
|
142 |
"df[\"weather\"] = df[\"weather\"].map(weather_mapping)"
|
143 |
]
|
144 |
},
|
145 |
{
|
146 |
"cell_type": "code",
|
147 |
+
"execution_count": 68,
|
148 |
"metadata": {},
|
149 |
"outputs": [
|
150 |
{
|
|
|
162 |
"plt.figure(figsize=(8, 6))\n",
|
163 |
"sns.heatmap(df.corr(), annot=True, cmap=\"coolwarm\", fmt=\".2f\")\n",
|
164 |
"plt.title(\"Correlation Matrix\")\n",
|
165 |
+
"plt.savefig(\"correlation_matrix.png\")\n",
|
166 |
+
"plt.show()"
|
167 |
]
|
168 |
},
|
169 |
{
|
|
|
176 |
},
|
177 |
{
|
178 |
"cell_type": "code",
|
179 |
+
"execution_count": 69,
|
180 |
"metadata": {},
|
181 |
"outputs": [],
|
182 |
"source": [
|
|
|
186 |
},
|
187 |
{
|
188 |
"cell_type": "code",
|
189 |
+
"execution_count": 70,
|
190 |
"metadata": {},
|
191 |
"outputs": [],
|
192 |
"source": [
|
|
|
193 |
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n"
|
194 |
]
|
195 |
},
|
196 |
{
|
197 |
"cell_type": "code",
|
198 |
+
"execution_count": 71,
|
199 |
"metadata": {},
|
200 |
"outputs": [
|
201 |
{
|
202 |
"data": {
|
203 |
"text/html": [
|
204 |
+
"<style>#sk-container-id-5 {\n",
|
205 |
" /* Definition of color scheme common for light and dark mode */\n",
|
206 |
" --sklearn-color-text: black;\n",
|
207 |
" --sklearn-color-line: gray;\n",
|
|
|
231 |
" }\n",
|
232 |
"}\n",
|
233 |
"\n",
|
234 |
+
"#sk-container-id-5 {\n",
|
235 |
" color: var(--sklearn-color-text);\n",
|
236 |
"}\n",
|
237 |
"\n",
|
238 |
+
"#sk-container-id-5 pre {\n",
|
239 |
" padding: 0;\n",
|
240 |
"}\n",
|
241 |
"\n",
|
242 |
+
"#sk-container-id-5 input.sk-hidden--visually {\n",
|
243 |
" border: 0;\n",
|
244 |
" clip: rect(1px 1px 1px 1px);\n",
|
245 |
" clip: rect(1px, 1px, 1px, 1px);\n",
|
|
|
251 |
" width: 1px;\n",
|
252 |
"}\n",
|
253 |
"\n",
|
254 |
+
"#sk-container-id-5 div.sk-dashed-wrapped {\n",
|
255 |
" border: 1px dashed var(--sklearn-color-line);\n",
|
256 |
" margin: 0 0.4em 0.5em 0.4em;\n",
|
257 |
" box-sizing: border-box;\n",
|
|
|
259 |
" background-color: var(--sklearn-color-background);\n",
|
260 |
"}\n",
|
261 |
"\n",
|
262 |
+
"#sk-container-id-5 div.sk-container {\n",
|
263 |
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
264 |
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
265 |
" so we also need the `!important` here to be able to override the\n",
|
|
|
269 |
" position: relative;\n",
|
270 |
"}\n",
|
271 |
"\n",
|
272 |
+
"#sk-container-id-5 div.sk-text-repr-fallback {\n",
|
273 |
" display: none;\n",
|
274 |
"}\n",
|
275 |
"\n",
|
|
|
285 |
"\n",
|
286 |
"/* Parallel-specific style estimator block */\n",
|
287 |
"\n",
|
288 |
+
"#sk-container-id-5 div.sk-parallel-item::after {\n",
|
289 |
" content: \"\";\n",
|
290 |
" width: 100%;\n",
|
291 |
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
292 |
" flex-grow: 1;\n",
|
293 |
"}\n",
|
294 |
"\n",
|
295 |
+
"#sk-container-id-5 div.sk-parallel {\n",
|
296 |
" display: flex;\n",
|
297 |
" align-items: stretch;\n",
|
298 |
" justify-content: center;\n",
|
|
|
300 |
" position: relative;\n",
|
301 |
"}\n",
|
302 |
"\n",
|
303 |
+
"#sk-container-id-5 div.sk-parallel-item {\n",
|
304 |
" display: flex;\n",
|
305 |
" flex-direction: column;\n",
|
306 |
"}\n",
|
307 |
"\n",
|
308 |
+
"#sk-container-id-5 div.sk-parallel-item:first-child::after {\n",
|
309 |
" align-self: flex-end;\n",
|
310 |
" width: 50%;\n",
|
311 |
"}\n",
|
312 |
"\n",
|
313 |
+
"#sk-container-id-5 div.sk-parallel-item:last-child::after {\n",
|
314 |
" align-self: flex-start;\n",
|
315 |
" width: 50%;\n",
|
316 |
"}\n",
|
317 |
"\n",
|
318 |
+
"#sk-container-id-5 div.sk-parallel-item:only-child::after {\n",
|
319 |
" width: 0;\n",
|
320 |
"}\n",
|
321 |
"\n",
|
322 |
"/* Serial-specific style estimator block */\n",
|
323 |
"\n",
|
324 |
+
"#sk-container-id-5 div.sk-serial {\n",
|
325 |
" display: flex;\n",
|
326 |
" flex-direction: column;\n",
|
327 |
" align-items: center;\n",
|
|
|
339 |
"\n",
|
340 |
"/* Pipeline and ColumnTransformer style (default) */\n",
|
341 |
"\n",
|
342 |
+
"#sk-container-id-5 div.sk-toggleable {\n",
|
343 |
" /* Default theme specific background. It is overwritten whether we have a\n",
|
344 |
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
345 |
" background-color: var(--sklearn-color-background);\n",
|
346 |
"}\n",
|
347 |
"\n",
|
348 |
"/* Toggleable label */\n",
|
349 |
+
"#sk-container-id-5 label.sk-toggleable__label {\n",
|
350 |
" cursor: pointer;\n",
|
351 |
" display: block;\n",
|
352 |
" width: 100%;\n",
|
|
|
356 |
" text-align: center;\n",
|
357 |
"}\n",
|
358 |
"\n",
|
359 |
+
"#sk-container-id-5 label.sk-toggleable__label-arrow:before {\n",
|
360 |
" /* Arrow on the left of the label */\n",
|
361 |
" content: \"▸\";\n",
|
362 |
" float: left;\n",
|
|
|
364 |
" color: var(--sklearn-color-icon);\n",
|
365 |
"}\n",
|
366 |
"\n",
|
367 |
+
"#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {\n",
|
368 |
" color: var(--sklearn-color-text);\n",
|
369 |
"}\n",
|
370 |
"\n",
|
371 |
"/* Toggleable content - dropdown */\n",
|
372 |
"\n",
|
373 |
+
"#sk-container-id-5 div.sk-toggleable__content {\n",
|
374 |
" max-height: 0;\n",
|
375 |
" max-width: 0;\n",
|
376 |
" overflow: hidden;\n",
|
|
|
379 |
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
380 |
"}\n",
|
381 |
"\n",
|
382 |
+
"#sk-container-id-5 div.sk-toggleable__content.fitted {\n",
|
383 |
" /* fitted */\n",
|
384 |
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
385 |
"}\n",
|
386 |
"\n",
|
387 |
+
"#sk-container-id-5 div.sk-toggleable__content pre {\n",
|
388 |
" margin: 0.2em;\n",
|
389 |
" border-radius: 0.25em;\n",
|
390 |
" color: var(--sklearn-color-text);\n",
|
|
|
392 |
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
393 |
"}\n",
|
394 |
"\n",
|
395 |
+
"#sk-container-id-5 div.sk-toggleable__content.fitted pre {\n",
|
396 |
" /* unfitted */\n",
|
397 |
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
398 |
"}\n",
|
399 |
"\n",
|
400 |
+
"#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
401 |
" /* Expand drop-down */\n",
|
402 |
" max-height: 200px;\n",
|
403 |
" max-width: 100%;\n",
|
404 |
" overflow: auto;\n",
|
405 |
"}\n",
|
406 |
"\n",
|
407 |
+
"#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
408 |
" content: \"▾\";\n",
|
409 |
"}\n",
|
410 |
"\n",
|
411 |
"/* Pipeline/ColumnTransformer-specific style */\n",
|
412 |
"\n",
|
413 |
+
"#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
414 |
" color: var(--sklearn-color-text);\n",
|
415 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
416 |
"}\n",
|
417 |
"\n",
|
418 |
+
"#sk-container-id-5 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
419 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
420 |
"}\n",
|
421 |
"\n",
|
422 |
"/* Estimator-specific style */\n",
|
423 |
"\n",
|
424 |
"/* Colorize estimator box */\n",
|
425 |
+
"#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
426 |
" /* unfitted */\n",
|
427 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
428 |
"}\n",
|
429 |
"\n",
|
430 |
+
"#sk-container-id-5 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
431 |
" /* fitted */\n",
|
432 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
433 |
"}\n",
|
434 |
"\n",
|
435 |
+
"#sk-container-id-5 div.sk-label label.sk-toggleable__label,\n",
|
436 |
+
"#sk-container-id-5 div.sk-label label {\n",
|
437 |
" /* The background is the default theme color */\n",
|
438 |
" color: var(--sklearn-color-text-on-default-background);\n",
|
439 |
"}\n",
|
440 |
"\n",
|
441 |
"/* On hover, darken the color of the background */\n",
|
442 |
+
"#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {\n",
|
443 |
" color: var(--sklearn-color-text);\n",
|
444 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
445 |
"}\n",
|
446 |
"\n",
|
447 |
"/* Label box, darken color on hover, fitted */\n",
|
448 |
+
"#sk-container-id-5 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
449 |
" color: var(--sklearn-color-text);\n",
|
450 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
451 |
"}\n",
|
452 |
"\n",
|
453 |
"/* Estimator label */\n",
|
454 |
"\n",
|
455 |
+
"#sk-container-id-5 div.sk-label label {\n",
|
456 |
" font-family: monospace;\n",
|
457 |
" font-weight: bold;\n",
|
458 |
" display: inline-block;\n",
|
459 |
" line-height: 1.2em;\n",
|
460 |
"}\n",
|
461 |
"\n",
|
462 |
+
"#sk-container-id-5 div.sk-label-container {\n",
|
463 |
" text-align: center;\n",
|
464 |
"}\n",
|
465 |
"\n",
|
466 |
"/* Estimator-specific */\n",
|
467 |
+
"#sk-container-id-5 div.sk-estimator {\n",
|
468 |
" font-family: monospace;\n",
|
469 |
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
470 |
" border-radius: 0.25em;\n",
|
|
|
474 |
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
475 |
"}\n",
|
476 |
"\n",
|
477 |
+
"#sk-container-id-5 div.sk-estimator.fitted {\n",
|
478 |
" /* fitted */\n",
|
479 |
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
480 |
"}\n",
|
481 |
"\n",
|
482 |
"/* on hover */\n",
|
483 |
+
"#sk-container-id-5 div.sk-estimator:hover {\n",
|
484 |
" /* unfitted */\n",
|
485 |
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
486 |
"}\n",
|
487 |
"\n",
|
488 |
+
"#sk-container-id-5 div.sk-estimator.fitted:hover {\n",
|
489 |
" /* fitted */\n",
|
490 |
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
491 |
"}\n",
|
|
|
572 |
"\n",
|
573 |
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
574 |
"\n",
|
575 |
+
"#sk-container-id-5 a.estimator_doc_link {\n",
|
576 |
" float: right;\n",
|
577 |
" font-size: 1rem;\n",
|
578 |
" line-height: 1em;\n",
|
|
|
587 |
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
588 |
"}\n",
|
589 |
"\n",
|
590 |
+
"#sk-container-id-5 a.estimator_doc_link.fitted {\n",
|
591 |
" /* fitted */\n",
|
592 |
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
593 |
" color: var(--sklearn-color-fitted-level-1);\n",
|
594 |
"}\n",
|
595 |
"\n",
|
596 |
"/* On hover */\n",
|
597 |
+
"#sk-container-id-5 a.estimator_doc_link:hover {\n",
|
598 |
" /* unfitted */\n",
|
599 |
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
600 |
" color: var(--sklearn-color-background);\n",
|
601 |
" text-decoration: none;\n",
|
602 |
"}\n",
|
603 |
"\n",
|
604 |
+
"#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n",
|
605 |
" /* fitted */\n",
|
606 |
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
607 |
"}\n",
|
608 |
+
"</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" checked><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(random_state=42)</pre></div> </div></div></div></div>"
|
609 |
],
|
610 |
"text/plain": [
|
611 |
"DecisionTreeClassifier(random_state=42)"
|
612 |
]
|
613 |
},
|
614 |
+
"execution_count": 71,
|
615 |
"metadata": {},
|
616 |
"output_type": "execute_result"
|
617 |
}
|
618 |
],
|
619 |
"source": [
|
|
|
620 |
"model = DecisionTreeClassifier(random_state=42)\n",
|
621 |
"model.fit(X_train, y_train)"
|
622 |
]
|
623 |
},
|
624 |
{
|
625 |
"cell_type": "code",
|
626 |
+
"execution_count": 72,
|
627 |
"metadata": {},
|
628 |
"outputs": [],
|
629 |
"source": [
|
|
|
641 |
},
|
642 |
{
|
643 |
"cell_type": "code",
|
644 |
+
"execution_count": 73,
|
645 |
"metadata": {},
|
646 |
"outputs": [
|
647 |
{
|
648 |
"name": "stdout",
|
649 |
"output_type": "stream",
|
650 |
"text": [
|
651 |
+
"Accuracy: 0.7986\n",
|
652 |
"Classification Report:\n",
|
653 |
+
" precision recall f1-score support\n",
|
654 |
"\n",
|
655 |
" 0 0.91 0.95 0.93 139\n",
|
656 |
" 1 0.84 0.78 0.81 125\n",
|
|
|
661 |
" accuracy 0.80 293\n",
|
662 |
" macro avg 0.44 0.42 0.42 293\n",
|
663 |
"weighted avg 0.81 0.80 0.80 293\n",
|
664 |
+
"\n"
|
|
|
|
|
665 |
]
|
666 |
+
},
|
667 |
+
{
|
668 |
+
"data": {
|
669 |
+
"image/png": "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rBBDhgwRAMSsWbN02uvatasYPHiw+Pjjj8UXX3whXn/9dWFnZyc6dOhg8MMZqHmYJAGsqqoSdnZ2YsSIEVJZTEyMUCqVOncJF0KIkpISMW3aNNG5c2dhY2MjvLy8RGxsrNi7d69Up+7WL/W97r89S1pamujdu7dQKpWib9++IisrS+/O8MYmgDU1NeLNN98U7u7uQqFQCABizZo1Rs+jbnx9+vQRSqVS9OrVS/zrX/9qdIKl1WrFzJkzRadOnYSdnZ0ICwsTJ06cEL6+vvUmgPn5+dJ6y8nJqbdNQ9YfNay0tFRMnDhRqNVqoVKpRGxsrM5tf+73oF9wQgixadMm8dRTTwlHR0dhb28vNBqNyMzM1Kvn7e1t0PdDbswVD2P7lQvGo+0JCwtr8Pfvvb8vr169KqKiooSzs7NQKpUiMDBQrFixQtTW1uq099FHH4ng4GDh6uoqbGxshI+Pj4iPjxf5+fktPDO6n0KIevbjtmEXL15Ex44d8dlnn+Hll18293DaHK4/IiKiR59pLos1o9u3b+v8/L//+78AoHPuITWM64+IiEh+THIVsDl5e3tj7NixCAwMREFBARYtWgSNRoOgoCBzD61N4PojIiKSnzZ/CHjSpEnYt28ffv/9d6jVasTExOAf//iHzgPDqWFcf0RERPLT5hNAIiIiIjJOmz8HkIiIiIiMwwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDNMAImIiIhkhgkgERERkcwwASQiIiKSGSaARERERDLDBJCIiIhIZpgAEhEREckME0AiIiIimWECSERERCQzTACJiIiIZIYJIBEREZHMMAEkIiIikhkmgEREREQywwSQiIiISGaYABIRERHJDBNAIiIiIplhAkhEREQkM0wAiYiIiGSGCSARERGRzDABJCIiIpIZJoBEREREMsMEkIiIiEhmmAASERERyQwTQCIiIiKZYQJIREREJDP/H1qEzQA4xzGwAAAAAElFTkSuQmCC",
|
670 |
+
"text/plain": [
|
671 |
+
"<Figure size 800x600 with 1 Axes>"
|
672 |
+
]
|
673 |
+
},
|
674 |
+
"metadata": {},
|
675 |
+
"output_type": "display_data"
|
676 |
}
|
677 |
],
|
678 |
"source": [
|
679 |
+
"accuracy = accuracy_score(y_test, y_pred)\n",
|
680 |
+
"f1 = f1_score(y_test, y_pred, average=\"weighted\")\n",
|
681 |
+
"report = classification_report(y_test, y_pred)\n",
|
682 |
+
"\n",
|
683 |
+
"print(f\"Accuracy: {accuracy:.4f}\")\n",
|
684 |
+
"print(\"Classification Report:\\n\", classification_report(y_test, y_pred))\n",
|
685 |
+
"\n",
|
686 |
+
"text_output = f\"Accuracy: {accuracy:.4f}\\nF1 Score: {f1:.4f}\\n\\nClassification Report:\\n{report}\"\n",
|
687 |
+
"\n",
|
688 |
+
"plt.figure(figsize=(8, 6))\n",
|
689 |
+
"plt.text(0.01, 0.99, text_output, fontsize=12, ha='left', va='top', family=\"monospace\")\n",
|
690 |
+
"plt.axis(\"off\")\n",
|
691 |
+
"\n",
|
692 |
+
"plt.savefig(\"classification_report.png\", bbox_inches=\"tight\", dpi=300)\n",
|
693 |
+
"plt.show()"
|
694 |
]
|
695 |
},
|
696 |
{
|
697 |
"cell_type": "code",
|
698 |
+
"execution_count": 74,
|
699 |
"metadata": {},
|
700 |
"outputs": [
|
701 |
{
|
|
|
715 |
"y_test_labels = [reverse_mapping[val] for val in y_test]\n",
|
716 |
"y_pred_labels = [reverse_mapping[val] for val in y_pred]\n",
|
717 |
"\n",
|
|
|
718 |
"plt.figure(figsize=(8, 6))\n",
|
719 |
"sns.scatterplot(x=range(len(y_test)), y=y_test_labels, label='Actual', color='blue')\n",
|
720 |
"sns.scatterplot(x=range(len(y_pred)), y=y_pred_labels, label='Predicted', color='red')\n",
|
|
|
723 |
"plt.ylabel(\"Weather Condition\")\n",
|
724 |
"plt.title(\"Actual vs Predicted Weather Conditions\")\n",
|
725 |
"plt.legend()\n",
|
726 |
+
"plt.savefig(\"weather_predictions.png\")\n",
|
727 |
"plt.show()\n"
|
728 |
]
|
729 |
},
|
730 |
{
|
731 |
"cell_type": "code",
|
732 |
+
"execution_count": 75,
|
733 |
"metadata": {},
|
734 |
"outputs": [
|
735 |
{
|
|
|
745 |
"joblib.dump(model, \"weather_model.pkl\")\n",
|
746 |
"print(\"Model saved successfully!\")"
|
747 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
748 |
}
|
749 |
],
|
750 |
"metadata": {
|
weather_predictions.png
ADDED
![]() |