Snigs98 commited on
Commit
92d18e4
Β·
verified Β·
1 Parent(s): d1d0303

Upload Predictive_Maintenance_for_Industrial_Equipment (1).ipynb

Browse files
Predictive_Maintenance_for_Industrial_Equipment (1).ipynb ADDED
@@ -0,0 +1,904 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nbformat": 4,
3
+ "nbformat_minor": 0,
4
+ "metadata": {
5
+ "colab": {
6
+ "provenance": [],
7
+ "gpuType": "T4"
8
+ },
9
+ "kernelspec": {
10
+ "name": "python3",
11
+ "display_name": "Python 3"
12
+ },
13
+ "language_info": {
14
+ "name": "python"
15
+ },
16
+ "accelerator": "GPU"
17
+ },
18
+ "cells": [
19
+ {
20
+ "cell_type": "code",
21
+ "execution_count": 1,
22
+ "metadata": {
23
+ "id": "diYfxyOV04ih"
24
+ },
25
+ "outputs": [],
26
+ "source": [
27
+ "import pandas as pd\n",
28
+ "import numpy as np\n",
29
+ "import zipfile\n",
30
+ "import os\n",
31
+ "import matplotlib.pyplot as plt\n",
32
+ "import seaborn as sns\n",
33
+ "from sklearn.model_selection import train_test_split\n",
34
+ "from sklearn.preprocessing import StandardScaler, LabelEncoder\n",
35
+ "from sklearn.ensemble import RandomForestClassifier\n",
36
+ "from sklearn.metrics import classification_report, confusion_matrix\n"
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "source": [
42
+ "# Define file paths\n",
43
+ "zip_path = \"/content/drive/MyDrive/Predictive Maintenance for Industrial Equipment.zip\"\n",
44
+ "extract_path = \"/content/drive/MyDrive/extracted_maintenance_dataset/\"\n",
45
+ "\n",
46
+ "# Extract the zip file\n",
47
+ "with zipfile.ZipFile(zip_path, 'r') as zip_ref:\n",
48
+ " zip_ref.extractall(extract_path)\n",
49
+ "\n",
50
+ "# Identify CSV file\n",
51
+ "dataset_file = [f for f in os.listdir(extract_path) if f.endswith('.csv')][0]\n",
52
+ "csv_path = os.path.join(extract_path, dataset_file)\n",
53
+ "\n",
54
+ "# Load dataset\n",
55
+ "df = pd.read_csv(csv_path)\n"
56
+ ],
57
+ "metadata": {
58
+ "id": "ZsffxavC1vNd"
59
+ },
60
+ "execution_count": 2,
61
+ "outputs": []
62
+ },
63
+ {
64
+ "cell_type": "code",
65
+ "source": [
66
+ "df.drop(columns=['UDI', 'Product ID'], inplace=True)\n"
67
+ ],
68
+ "metadata": {
69
+ "id": "bMRs7ivO18uc"
70
+ },
71
+ "execution_count": 3,
72
+ "outputs": []
73
+ },
74
+ {
75
+ "cell_type": "code",
76
+ "source": [
77
+ "df['Type'] = LabelEncoder().fit_transform(df['Type'])\n"
78
+ ],
79
+ "metadata": {
80
+ "id": "pASp6v1O1_dA"
81
+ },
82
+ "execution_count": 4,
83
+ "outputs": []
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "source": [
88
+ "X = df.drop(columns=['Machine failure'])\n",
89
+ "y = df['Machine failure']\n"
90
+ ],
91
+ "metadata": {
92
+ "id": "fehfGra52Bi7"
93
+ },
94
+ "execution_count": 5,
95
+ "outputs": []
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "source": [
100
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n"
101
+ ],
102
+ "metadata": {
103
+ "id": "3d7gWAG_2FAw"
104
+ },
105
+ "execution_count": 6,
106
+ "outputs": []
107
+ },
108
+ {
109
+ "cell_type": "code",
110
+ "source": [
111
+ "scaler = StandardScaler()\n",
112
+ "X_train = scaler.fit_transform(X_train)\n",
113
+ "X_test = scaler.transform(X_test)\n"
114
+ ],
115
+ "metadata": {
116
+ "id": "cnMyXyXR2Hf8"
117
+ },
118
+ "execution_count": 7,
119
+ "outputs": []
120
+ },
121
+ {
122
+ "cell_type": "code",
123
+ "source": [
124
+ "model = RandomForestClassifier(n_estimators=100, random_state=42)\n",
125
+ "model.fit(X_train, y_train)\n"
126
+ ],
127
+ "metadata": {
128
+ "colab": {
129
+ "base_uri": "https://localhost:8080/",
130
+ "height": 80
131
+ },
132
+ "id": "s3ouiTV62J9b",
133
+ "outputId": "65262bea-04b8-4436-ad14-94f500d03449"
134
+ },
135
+ "execution_count": 8,
136
+ "outputs": [
137
+ {
138
+ "output_type": "execute_result",
139
+ "data": {
140
+ "text/plain": [
141
+ "RandomForestClassifier(random_state=42)"
142
+ ],
143
+ "text/html": [
144
+ "<style>#sk-container-id-1 {\n",
145
+ " /* Definition of color scheme common for light and dark mode */\n",
146
+ " --sklearn-color-text: #000;\n",
147
+ " --sklearn-color-text-muted: #666;\n",
148
+ " --sklearn-color-line: gray;\n",
149
+ " /* Definition of color scheme for unfitted estimators */\n",
150
+ " --sklearn-color-unfitted-level-0: #fff5e6;\n",
151
+ " --sklearn-color-unfitted-level-1: #f6e4d2;\n",
152
+ " --sklearn-color-unfitted-level-2: #ffe0b3;\n",
153
+ " --sklearn-color-unfitted-level-3: chocolate;\n",
154
+ " /* Definition of color scheme for fitted estimators */\n",
155
+ " --sklearn-color-fitted-level-0: #f0f8ff;\n",
156
+ " --sklearn-color-fitted-level-1: #d4ebff;\n",
157
+ " --sklearn-color-fitted-level-2: #b3dbfd;\n",
158
+ " --sklearn-color-fitted-level-3: cornflowerblue;\n",
159
+ "\n",
160
+ " /* Specific color for light theme */\n",
161
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
162
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
163
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
164
+ " --sklearn-color-icon: #696969;\n",
165
+ "\n",
166
+ " @media (prefers-color-scheme: dark) {\n",
167
+ " /* Redefinition of color scheme for dark theme */\n",
168
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
169
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
170
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
171
+ " --sklearn-color-icon: #878787;\n",
172
+ " }\n",
173
+ "}\n",
174
+ "\n",
175
+ "#sk-container-id-1 {\n",
176
+ " color: var(--sklearn-color-text);\n",
177
+ "}\n",
178
+ "\n",
179
+ "#sk-container-id-1 pre {\n",
180
+ " padding: 0;\n",
181
+ "}\n",
182
+ "\n",
183
+ "#sk-container-id-1 input.sk-hidden--visually {\n",
184
+ " border: 0;\n",
185
+ " clip: rect(1px 1px 1px 1px);\n",
186
+ " clip: rect(1px, 1px, 1px, 1px);\n",
187
+ " height: 1px;\n",
188
+ " margin: -1px;\n",
189
+ " overflow: hidden;\n",
190
+ " padding: 0;\n",
191
+ " position: absolute;\n",
192
+ " width: 1px;\n",
193
+ "}\n",
194
+ "\n",
195
+ "#sk-container-id-1 div.sk-dashed-wrapped {\n",
196
+ " border: 1px dashed var(--sklearn-color-line);\n",
197
+ " margin: 0 0.4em 0.5em 0.4em;\n",
198
+ " box-sizing: border-box;\n",
199
+ " padding-bottom: 0.4em;\n",
200
+ " background-color: var(--sklearn-color-background);\n",
201
+ "}\n",
202
+ "\n",
203
+ "#sk-container-id-1 div.sk-container {\n",
204
+ " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
205
+ " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
206
+ " so we also need the `!important` here to be able to override the\n",
207
+ " default hidden behavior on the sphinx rendered scikit-learn.org.\n",
208
+ " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
209
+ " display: inline-block !important;\n",
210
+ " position: relative;\n",
211
+ "}\n",
212
+ "\n",
213
+ "#sk-container-id-1 div.sk-text-repr-fallback {\n",
214
+ " display: none;\n",
215
+ "}\n",
216
+ "\n",
217
+ "div.sk-parallel-item,\n",
218
+ "div.sk-serial,\n",
219
+ "div.sk-item {\n",
220
+ " /* draw centered vertical line to link estimators */\n",
221
+ " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
222
+ " background-size: 2px 100%;\n",
223
+ " background-repeat: no-repeat;\n",
224
+ " background-position: center center;\n",
225
+ "}\n",
226
+ "\n",
227
+ "/* Parallel-specific style estimator block */\n",
228
+ "\n",
229
+ "#sk-container-id-1 div.sk-parallel-item::after {\n",
230
+ " content: \"\";\n",
231
+ " width: 100%;\n",
232
+ " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
233
+ " flex-grow: 1;\n",
234
+ "}\n",
235
+ "\n",
236
+ "#sk-container-id-1 div.sk-parallel {\n",
237
+ " display: flex;\n",
238
+ " align-items: stretch;\n",
239
+ " justify-content: center;\n",
240
+ " background-color: var(--sklearn-color-background);\n",
241
+ " position: relative;\n",
242
+ "}\n",
243
+ "\n",
244
+ "#sk-container-id-1 div.sk-parallel-item {\n",
245
+ " display: flex;\n",
246
+ " flex-direction: column;\n",
247
+ "}\n",
248
+ "\n",
249
+ "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
250
+ " align-self: flex-end;\n",
251
+ " width: 50%;\n",
252
+ "}\n",
253
+ "\n",
254
+ "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
255
+ " align-self: flex-start;\n",
256
+ " width: 50%;\n",
257
+ "}\n",
258
+ "\n",
259
+ "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
260
+ " width: 0;\n",
261
+ "}\n",
262
+ "\n",
263
+ "/* Serial-specific style estimator block */\n",
264
+ "\n",
265
+ "#sk-container-id-1 div.sk-serial {\n",
266
+ " display: flex;\n",
267
+ " flex-direction: column;\n",
268
+ " align-items: center;\n",
269
+ " background-color: var(--sklearn-color-background);\n",
270
+ " padding-right: 1em;\n",
271
+ " padding-left: 1em;\n",
272
+ "}\n",
273
+ "\n",
274
+ "\n",
275
+ "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
276
+ "clickable and can be expanded/collapsed.\n",
277
+ "- Pipeline and ColumnTransformer use this feature and define the default style\n",
278
+ "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
279
+ "*/\n",
280
+ "\n",
281
+ "/* Pipeline and ColumnTransformer style (default) */\n",
282
+ "\n",
283
+ "#sk-container-id-1 div.sk-toggleable {\n",
284
+ " /* Default theme specific background. It is overwritten whether we have a\n",
285
+ " specific estimator or a Pipeline/ColumnTransformer */\n",
286
+ " background-color: var(--sklearn-color-background);\n",
287
+ "}\n",
288
+ "\n",
289
+ "/* Toggleable label */\n",
290
+ "#sk-container-id-1 label.sk-toggleable__label {\n",
291
+ " cursor: pointer;\n",
292
+ " display: flex;\n",
293
+ " width: 100%;\n",
294
+ " margin-bottom: 0;\n",
295
+ " padding: 0.5em;\n",
296
+ " box-sizing: border-box;\n",
297
+ " text-align: center;\n",
298
+ " align-items: start;\n",
299
+ " justify-content: space-between;\n",
300
+ " gap: 0.5em;\n",
301
+ "}\n",
302
+ "\n",
303
+ "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
304
+ " font-size: 0.6rem;\n",
305
+ " font-weight: lighter;\n",
306
+ " color: var(--sklearn-color-text-muted);\n",
307
+ "}\n",
308
+ "\n",
309
+ "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
310
+ " /* Arrow on the left of the label */\n",
311
+ " content: \"β–Έ\";\n",
312
+ " float: left;\n",
313
+ " margin-right: 0.25em;\n",
314
+ " color: var(--sklearn-color-icon);\n",
315
+ "}\n",
316
+ "\n",
317
+ "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
318
+ " color: var(--sklearn-color-text);\n",
319
+ "}\n",
320
+ "\n",
321
+ "/* Toggleable content - dropdown */\n",
322
+ "\n",
323
+ "#sk-container-id-1 div.sk-toggleable__content {\n",
324
+ " max-height: 0;\n",
325
+ " max-width: 0;\n",
326
+ " overflow: hidden;\n",
327
+ " text-align: left;\n",
328
+ " /* unfitted */\n",
329
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
330
+ "}\n",
331
+ "\n",
332
+ "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
333
+ " /* fitted */\n",
334
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
335
+ "}\n",
336
+ "\n",
337
+ "#sk-container-id-1 div.sk-toggleable__content pre {\n",
338
+ " margin: 0.2em;\n",
339
+ " border-radius: 0.25em;\n",
340
+ " color: var(--sklearn-color-text);\n",
341
+ " /* unfitted */\n",
342
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
343
+ "}\n",
344
+ "\n",
345
+ "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
346
+ " /* unfitted */\n",
347
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
348
+ "}\n",
349
+ "\n",
350
+ "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
351
+ " /* Expand drop-down */\n",
352
+ " max-height: 200px;\n",
353
+ " max-width: 100%;\n",
354
+ " overflow: auto;\n",
355
+ "}\n",
356
+ "\n",
357
+ "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
358
+ " content: \"β–Ύ\";\n",
359
+ "}\n",
360
+ "\n",
361
+ "/* Pipeline/ColumnTransformer-specific style */\n",
362
+ "\n",
363
+ "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
364
+ " color: var(--sklearn-color-text);\n",
365
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
366
+ "}\n",
367
+ "\n",
368
+ "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
369
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
370
+ "}\n",
371
+ "\n",
372
+ "/* Estimator-specific style */\n",
373
+ "\n",
374
+ "/* Colorize estimator box */\n",
375
+ "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
376
+ " /* unfitted */\n",
377
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
378
+ "}\n",
379
+ "\n",
380
+ "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
381
+ " /* fitted */\n",
382
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
383
+ "}\n",
384
+ "\n",
385
+ "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
386
+ "#sk-container-id-1 div.sk-label label {\n",
387
+ " /* The background is the default theme color */\n",
388
+ " color: var(--sklearn-color-text-on-default-background);\n",
389
+ "}\n",
390
+ "\n",
391
+ "/* On hover, darken the color of the background */\n",
392
+ "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
393
+ " color: var(--sklearn-color-text);\n",
394
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
395
+ "}\n",
396
+ "\n",
397
+ "/* Label box, darken color on hover, fitted */\n",
398
+ "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
399
+ " color: var(--sklearn-color-text);\n",
400
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
401
+ "}\n",
402
+ "\n",
403
+ "/* Estimator label */\n",
404
+ "\n",
405
+ "#sk-container-id-1 div.sk-label label {\n",
406
+ " font-family: monospace;\n",
407
+ " font-weight: bold;\n",
408
+ " display: inline-block;\n",
409
+ " line-height: 1.2em;\n",
410
+ "}\n",
411
+ "\n",
412
+ "#sk-container-id-1 div.sk-label-container {\n",
413
+ " text-align: center;\n",
414
+ "}\n",
415
+ "\n",
416
+ "/* Estimator-specific */\n",
417
+ "#sk-container-id-1 div.sk-estimator {\n",
418
+ " font-family: monospace;\n",
419
+ " border: 1px dotted var(--sklearn-color-border-box);\n",
420
+ " border-radius: 0.25em;\n",
421
+ " box-sizing: border-box;\n",
422
+ " margin-bottom: 0.5em;\n",
423
+ " /* unfitted */\n",
424
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
425
+ "}\n",
426
+ "\n",
427
+ "#sk-container-id-1 div.sk-estimator.fitted {\n",
428
+ " /* fitted */\n",
429
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
430
+ "}\n",
431
+ "\n",
432
+ "/* on hover */\n",
433
+ "#sk-container-id-1 div.sk-estimator:hover {\n",
434
+ " /* unfitted */\n",
435
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
436
+ "}\n",
437
+ "\n",
438
+ "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
439
+ " /* fitted */\n",
440
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
441
+ "}\n",
442
+ "\n",
443
+ "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
444
+ "\n",
445
+ "/* Common style for \"i\" and \"?\" */\n",
446
+ "\n",
447
+ ".sk-estimator-doc-link,\n",
448
+ "a:link.sk-estimator-doc-link,\n",
449
+ "a:visited.sk-estimator-doc-link {\n",
450
+ " float: right;\n",
451
+ " font-size: smaller;\n",
452
+ " line-height: 1em;\n",
453
+ " font-family: monospace;\n",
454
+ " background-color: var(--sklearn-color-background);\n",
455
+ " border-radius: 1em;\n",
456
+ " height: 1em;\n",
457
+ " width: 1em;\n",
458
+ " text-decoration: none !important;\n",
459
+ " margin-left: 0.5em;\n",
460
+ " text-align: center;\n",
461
+ " /* unfitted */\n",
462
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
463
+ " color: var(--sklearn-color-unfitted-level-1);\n",
464
+ "}\n",
465
+ "\n",
466
+ ".sk-estimator-doc-link.fitted,\n",
467
+ "a:link.sk-estimator-doc-link.fitted,\n",
468
+ "a:visited.sk-estimator-doc-link.fitted {\n",
469
+ " /* fitted */\n",
470
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
471
+ " color: var(--sklearn-color-fitted-level-1);\n",
472
+ "}\n",
473
+ "\n",
474
+ "/* On hover */\n",
475
+ "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
476
+ ".sk-estimator-doc-link:hover,\n",
477
+ "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
478
+ ".sk-estimator-doc-link:hover {\n",
479
+ " /* unfitted */\n",
480
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
481
+ " color: var(--sklearn-color-background);\n",
482
+ " text-decoration: none;\n",
483
+ "}\n",
484
+ "\n",
485
+ "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
486
+ ".sk-estimator-doc-link.fitted:hover,\n",
487
+ "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
488
+ ".sk-estimator-doc-link.fitted:hover {\n",
489
+ " /* fitted */\n",
490
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
491
+ " color: var(--sklearn-color-background);\n",
492
+ " text-decoration: none;\n",
493
+ "}\n",
494
+ "\n",
495
+ "/* Span, style for the box shown on hovering the info icon */\n",
496
+ ".sk-estimator-doc-link span {\n",
497
+ " display: none;\n",
498
+ " z-index: 9999;\n",
499
+ " position: relative;\n",
500
+ " font-weight: normal;\n",
501
+ " right: .2ex;\n",
502
+ " padding: .5ex;\n",
503
+ " margin: .5ex;\n",
504
+ " width: min-content;\n",
505
+ " min-width: 20ex;\n",
506
+ " max-width: 50ex;\n",
507
+ " color: var(--sklearn-color-text);\n",
508
+ " box-shadow: 2pt 2pt 4pt #999;\n",
509
+ " /* unfitted */\n",
510
+ " background: var(--sklearn-color-unfitted-level-0);\n",
511
+ " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
512
+ "}\n",
513
+ "\n",
514
+ ".sk-estimator-doc-link.fitted span {\n",
515
+ " /* fitted */\n",
516
+ " background: var(--sklearn-color-fitted-level-0);\n",
517
+ " border: var(--sklearn-color-fitted-level-3);\n",
518
+ "}\n",
519
+ "\n",
520
+ ".sk-estimator-doc-link:hover span {\n",
521
+ " display: block;\n",
522
+ "}\n",
523
+ "\n",
524
+ "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
525
+ "\n",
526
+ "#sk-container-id-1 a.estimator_doc_link {\n",
527
+ " float: right;\n",
528
+ " font-size: 1rem;\n",
529
+ " line-height: 1em;\n",
530
+ " font-family: monospace;\n",
531
+ " background-color: var(--sklearn-color-background);\n",
532
+ " border-radius: 1rem;\n",
533
+ " height: 1rem;\n",
534
+ " width: 1rem;\n",
535
+ " text-decoration: none;\n",
536
+ " /* unfitted */\n",
537
+ " color: var(--sklearn-color-unfitted-level-1);\n",
538
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
539
+ "}\n",
540
+ "\n",
541
+ "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
542
+ " /* fitted */\n",
543
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
544
+ " color: var(--sklearn-color-fitted-level-1);\n",
545
+ "}\n",
546
+ "\n",
547
+ "/* On hover */\n",
548
+ "#sk-container-id-1 a.estimator_doc_link:hover {\n",
549
+ " /* unfitted */\n",
550
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
551
+ " color: var(--sklearn-color-background);\n",
552
+ " text-decoration: none;\n",
553
+ "}\n",
554
+ "\n",
555
+ "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
556
+ " /* fitted */\n",
557
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
558
+ "}\n",
559
+ "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(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-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>RandomForestClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(random_state=42)</pre></div> </div></div></div></div>"
560
+ ]
561
+ },
562
+ "metadata": {},
563
+ "execution_count": 8
564
+ }
565
+ ]
566
+ },
567
+ {
568
+ "cell_type": "code",
569
+ "source": [
570
+ "y_pred = model.predict(X_test)\n"
571
+ ],
572
+ "metadata": {
573
+ "id": "1-Upn0E32MxU"
574
+ },
575
+ "execution_count": 9,
576
+ "outputs": []
577
+ },
578
+ {
579
+ "cell_type": "code",
580
+ "source": [
581
+ "print(\"Classification Report:\")\n",
582
+ "print(classification_report(y_test, y_pred))\n"
583
+ ],
584
+ "metadata": {
585
+ "colab": {
586
+ "base_uri": "https://localhost:8080/"
587
+ },
588
+ "id": "Y8qyDEw72PJ4",
589
+ "outputId": "8b5529ac-9848-43a3-e19e-3be67f8acb0e"
590
+ },
591
+ "execution_count": 10,
592
+ "outputs": [
593
+ {
594
+ "output_type": "stream",
595
+ "name": "stdout",
596
+ "text": [
597
+ "Classification Report:\n",
598
+ " precision recall f1-score support\n",
599
+ "\n",
600
+ " 0 1.00 1.00 1.00 1939\n",
601
+ " 1 1.00 0.97 0.98 61\n",
602
+ "\n",
603
+ " accuracy 1.00 2000\n",
604
+ " macro avg 1.00 0.98 0.99 2000\n",
605
+ "weighted avg 1.00 1.00 1.00 2000\n",
606
+ "\n"
607
+ ]
608
+ }
609
+ ]
610
+ },
611
+ {
612
+ "cell_type": "code",
613
+ "source": [
614
+ "plt.figure(figsize=(6, 4))\n",
615
+ "sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt='d', cmap='Blues', xticklabels=['No Failure', 'Failure'], yticklabels=['No Failure', 'Failure'])\n",
616
+ "plt.xlabel(\"Predicted\")\n",
617
+ "plt.ylabel(\"Actual\")\n",
618
+ "plt.title(\"Confusion Matrix\")\n",
619
+ "plt.show()\n"
620
+ ],
621
+ "metadata": {
622
+ "colab": {
623
+ "base_uri": "https://localhost:8080/",
624
+ "height": 410
625
+ },
626
+ "id": "1aU22T_z2Ros",
627
+ "outputId": "dd7154d9-9cd6-49b1-eb06-e8c3c56d777b"
628
+ },
629
+ "execution_count": 11,
630
+ "outputs": [
631
+ {
632
+ "output_type": "display_data",
633
+ "data": {
634
+ "text/plain": [
635
+ "<Figure size 600x400 with 2 Axes>"
636
+ ],
637
+ "image/png": "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\n"
638
+ },
639
+ "metadata": {}
640
+ }
641
+ ]
642
+ },
643
+ {
644
+ "cell_type": "code",
645
+ "source": [
646
+ "!pip install gradio pandas numpy scikit-learn\n"
647
+ ],
648
+ "metadata": {
649
+ "colab": {
650
+ "base_uri": "https://localhost:8080/"
651
+ },
652
+ "id": "4qTFGF5PeCYY",
653
+ "outputId": "c4ca558c-e68a-4714-9b16-3164a450cd69"
654
+ },
655
+ "execution_count": 12,
656
+ "outputs": [
657
+ {
658
+ "output_type": "stream",
659
+ "name": "stdout",
660
+ "text": [
661
+ "Collecting gradio\n",
662
+ " Downloading gradio-5.21.0-py3-none-any.whl.metadata (16 kB)\n",
663
+ "Requirement already satisfied: pandas in /usr/local/lib/python3.11/dist-packages (2.2.2)\n",
664
+ "Requirement already satisfied: numpy in /usr/local/lib/python3.11/dist-packages (1.26.4)\n",
665
+ "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (1.6.1)\n",
666
+ "Collecting aiofiles<24.0,>=22.0 (from gradio)\n",
667
+ " Downloading aiofiles-23.2.1-py3-none-any.whl.metadata (9.7 kB)\n",
668
+ "Requirement already satisfied: anyio<5.0,>=3.0 in /usr/local/lib/python3.11/dist-packages (from gradio) (3.7.1)\n",
669
+ "Collecting fastapi<1.0,>=0.115.2 (from gradio)\n",
670
+ " Downloading fastapi-0.115.11-py3-none-any.whl.metadata (27 kB)\n",
671
+ "Collecting ffmpy (from gradio)\n",
672
+ " Downloading ffmpy-0.5.0-py3-none-any.whl.metadata (3.0 kB)\n",
673
+ "Collecting gradio-client==1.7.2 (from gradio)\n",
674
+ " Downloading gradio_client-1.7.2-py3-none-any.whl.metadata (7.1 kB)\n",
675
+ "Collecting groovy~=0.1 (from gradio)\n",
676
+ " Downloading groovy-0.1.2-py3-none-any.whl.metadata (6.1 kB)\n",
677
+ "Requirement already satisfied: httpx>=0.24.1 in /usr/local/lib/python3.11/dist-packages (from gradio) (0.28.1)\n",
678
+ "Requirement already satisfied: huggingface-hub>=0.28.1 in /usr/local/lib/python3.11/dist-packages (from gradio) (0.28.1)\n",
679
+ "Requirement already satisfied: jinja2<4.0 in /usr/local/lib/python3.11/dist-packages (from gradio) (3.1.5)\n",
680
+ "Collecting markupsafe~=2.0 (from gradio)\n",
681
+ " Downloading MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB)\n",
682
+ "Requirement already satisfied: orjson~=3.0 in /usr/local/lib/python3.11/dist-packages (from gradio) (3.10.15)\n",
683
+ "Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from gradio) (24.2)\n",
684
+ "Requirement already satisfied: pillow<12.0,>=8.0 in /usr/local/lib/python3.11/dist-packages (from gradio) (11.1.0)\n",
685
+ "Requirement already satisfied: pydantic>=2.0 in /usr/local/lib/python3.11/dist-packages (from gradio) (2.10.6)\n",
686
+ "Collecting pydub (from gradio)\n",
687
+ " Downloading pydub-0.25.1-py2.py3-none-any.whl.metadata (1.4 kB)\n",
688
+ "Collecting python-multipart>=0.0.18 (from gradio)\n",
689
+ " Downloading python_multipart-0.0.20-py3-none-any.whl.metadata (1.8 kB)\n",
690
+ "Requirement already satisfied: pyyaml<7.0,>=5.0 in /usr/local/lib/python3.11/dist-packages (from gradio) (6.0.2)\n",
691
+ "Collecting ruff>=0.9.3 (from gradio)\n",
692
+ " Downloading ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (25 kB)\n",
693
+ "Collecting safehttpx<0.2.0,>=0.1.6 (from gradio)\n",
694
+ " Downloading safehttpx-0.1.6-py3-none-any.whl.metadata (4.2 kB)\n",
695
+ "Collecting semantic-version~=2.0 (from gradio)\n",
696
+ " Downloading semantic_version-2.10.0-py2.py3-none-any.whl.metadata (9.7 kB)\n",
697
+ "Collecting starlette<1.0,>=0.40.0 (from gradio)\n",
698
+ " Downloading starlette-0.46.1-py3-none-any.whl.metadata (6.2 kB)\n",
699
+ "Collecting tomlkit<0.14.0,>=0.12.0 (from gradio)\n",
700
+ " Downloading tomlkit-0.13.2-py3-none-any.whl.metadata (2.7 kB)\n",
701
+ "Requirement already satisfied: typer<1.0,>=0.12 in /usr/local/lib/python3.11/dist-packages (from gradio) (0.15.2)\n",
702
+ "Requirement already satisfied: typing-extensions~=4.0 in /usr/local/lib/python3.11/dist-packages (from gradio) (4.12.2)\n",
703
+ "Collecting uvicorn>=0.14.0 (from gradio)\n",
704
+ " Downloading uvicorn-0.34.0-py3-none-any.whl.metadata (6.5 kB)\n",
705
+ "Requirement already satisfied: fsspec in /usr/local/lib/python3.11/dist-packages (from gradio-client==1.7.2->gradio) (2024.10.0)\n",
706
+ "Requirement already satisfied: websockets<16.0,>=10.0 in /usr/local/lib/python3.11/dist-packages (from gradio-client==1.7.2->gradio) (14.2)\n",
707
+ "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas) (2.8.2)\n",
708
+ "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas) (2025.1)\n",
709
+ "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas) (2025.1)\n",
710
+ "Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn) (1.13.1)\n",
711
+ "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn) (1.4.2)\n",
712
+ "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn) (3.5.0)\n",
713
+ "Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.11/dist-packages (from anyio<5.0,>=3.0->gradio) (3.10)\n",
714
+ "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.11/dist-packages (from anyio<5.0,>=3.0->gradio) (1.3.1)\n",
715
+ "Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from httpx>=0.24.1->gradio) (2025.1.31)\n",
716
+ "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.11/dist-packages (from httpx>=0.24.1->gradio) (1.0.7)\n",
717
+ "Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.11/dist-packages (from httpcore==1.*->httpx>=0.24.1->gradio) (0.14.0)\n",
718
+ "Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.28.1->gradio) (3.17.0)\n",
719
+ "Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.28.1->gradio) (2.32.3)\n",
720
+ "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.28.1->gradio) (4.67.1)\n",
721
+ "Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from pydantic>=2.0->gradio) (0.7.0)\n",
722
+ "Requirement already satisfied: pydantic-core==2.27.2 in /usr/local/lib/python3.11/dist-packages (from pydantic>=2.0->gradio) (2.27.2)\n",
723
+ "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n",
724
+ "Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.11/dist-packages (from typer<1.0,>=0.12->gradio) (8.1.8)\n",
725
+ "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.11/dist-packages (from typer<1.0,>=0.12->gradio) (1.5.4)\n",
726
+ "Requirement already satisfied: rich>=10.11.0 in /usr/local/lib/python3.11/dist-packages (from typer<1.0,>=0.12->gradio) (13.9.4)\n",
727
+ "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (3.0.0)\n",
728
+ "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.11/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (2.18.0)\n",
729
+ "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.28.1->gradio) (3.4.1)\n",
730
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.28.1->gradio) (2.3.0)\n",
731
+ "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio) (0.1.2)\n",
732
+ "Downloading gradio-5.21.0-py3-none-any.whl (46.2 MB)\n",
733
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m46.2/46.2 MB\u001b[0m \u001b[31m17.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
734
+ "\u001b[?25hDownloading gradio_client-1.7.2-py3-none-any.whl (322 kB)\n",
735
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m322.1/322.1 kB\u001b[0m \u001b[31m20.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
736
+ "\u001b[?25hDownloading aiofiles-23.2.1-py3-none-any.whl (15 kB)\n",
737
+ "Downloading fastapi-0.115.11-py3-none-any.whl (94 kB)\n",
738
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m94.9/94.9 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
739
+ "\u001b[?25hDownloading groovy-0.1.2-py3-none-any.whl (14 kB)\n",
740
+ "Downloading MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB)\n",
741
+ "Downloading python_multipart-0.0.20-py3-none-any.whl (24 kB)\n",
742
+ "Downloading ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.3 MB)\n",
743
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m11.3/11.3 MB\u001b[0m \u001b[31m49.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
744
+ "\u001b[?25hDownloading safehttpx-0.1.6-py3-none-any.whl (8.7 kB)\n",
745
+ "Downloading semantic_version-2.10.0-py2.py3-none-any.whl (15 kB)\n",
746
+ "Downloading starlette-0.46.1-py3-none-any.whl (71 kB)\n",
747
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m72.0/72.0 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
748
+ "\u001b[?25hDownloading tomlkit-0.13.2-py3-none-any.whl (37 kB)\n",
749
+ "Downloading uvicorn-0.34.0-py3-none-any.whl (62 kB)\n",
750
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.3/62.3 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
751
+ "\u001b[?25hDownloading ffmpy-0.5.0-py3-none-any.whl (6.0 kB)\n",
752
+ "Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n",
753
+ "Installing collected packages: pydub, uvicorn, tomlkit, semantic-version, ruff, python-multipart, markupsafe, groovy, ffmpy, aiofiles, starlette, safehttpx, gradio-client, fastapi, gradio\n",
754
+ " Attempting uninstall: markupsafe\n",
755
+ " Found existing installation: MarkupSafe 3.0.2\n",
756
+ " Uninstalling MarkupSafe-3.0.2:\n",
757
+ " Successfully uninstalled MarkupSafe-3.0.2\n",
758
+ "Successfully installed aiofiles-23.2.1 fastapi-0.115.11 ffmpy-0.5.0 gradio-5.21.0 gradio-client-1.7.2 groovy-0.1.2 markupsafe-2.1.5 pydub-0.25.1 python-multipart-0.0.20 ruff-0.11.0 safehttpx-0.1.6 semantic-version-2.10.0 starlette-0.46.1 tomlkit-0.13.2 uvicorn-0.34.0\n"
759
+ ]
760
+ }
761
+ ]
762
+ },
763
+ {
764
+ "cell_type": "code",
765
+ "source": [
766
+ "import gradio as gr\n",
767
+ "import pandas as pd\n",
768
+ "import numpy as np\n",
769
+ "import joblib # If you saved a trained model\n"
770
+ ],
771
+ "metadata": {
772
+ "id": "PVUuaH2XeELM"
773
+ },
774
+ "execution_count": 13,
775
+ "outputs": []
776
+ },
777
+ {
778
+ "cell_type": "code",
779
+ "source": [
780
+ "import joblib\n",
781
+ "\n",
782
+ "# Assuming 'model' is your trained predictive maintenance model\n",
783
+ "joblib.dump(model, \"predictive_maintenance_model.pkl\")\n",
784
+ "\n",
785
+ "# Verify if the file is saved\n",
786
+ "import os\n",
787
+ "print(os.listdir()) # Now, you should see 'predictive_maintenance_model.pkl'\n"
788
+ ],
789
+ "metadata": {
790
+ "colab": {
791
+ "base_uri": "https://localhost:8080/"
792
+ },
793
+ "id": "e58DPCn2es0d",
794
+ "outputId": "81a06f3a-6f11-46c1-af3b-a50194471b1a"
795
+ },
796
+ "execution_count": 16,
797
+ "outputs": [
798
+ {
799
+ "output_type": "stream",
800
+ "name": "stdout",
801
+ "text": [
802
+ "['.config', 'drive', 'predictive_maintenance_model.pkl', 'sample_data']\n"
803
+ ]
804
+ }
805
+ ]
806
+ },
807
+ {
808
+ "cell_type": "code",
809
+ "source": [
810
+ "model = joblib.load(\"predictive_maintenance_model.pkl\") # Change to your actual model path\n"
811
+ ],
812
+ "metadata": {
813
+ "id": "4CygicsXeIQe"
814
+ },
815
+ "execution_count": 17,
816
+ "outputs": []
817
+ },
818
+ {
819
+ "cell_type": "code",
820
+ "source": [
821
+ "def predict_maintenance(feature1, feature2, feature3, feature4):\n",
822
+ " input_data = np.array([[feature1, feature2, feature3, feature4]]) # Modify according to your dataset\n",
823
+ " prediction = model.predict(input_data)\n",
824
+ " return f\"Predicted Maintenance Requirement: {prediction[0]}\"\n"
825
+ ],
826
+ "metadata": {
827
+ "id": "vR4RMu9meVAY"
828
+ },
829
+ "execution_count": 18,
830
+ "outputs": []
831
+ },
832
+ {
833
+ "cell_type": "code",
834
+ "source": [
835
+ "interface = gr.Interface(\n",
836
+ " fn=predict_maintenance,\n",
837
+ " inputs=[\n",
838
+ " gr.Number(label=\"Feature 1\"),\n",
839
+ " gr.Number(label=\"Feature 2\"),\n",
840
+ " gr.Number(label=\"Feature 3\"),\n",
841
+ " gr.Number(label=\"Feature 4\"),\n",
842
+ " ],\n",
843
+ " outputs=gr.Textbox(label=\"Prediction\"),\n",
844
+ " title=\"Predictive Maintenance for Industrial Equipment\",\n",
845
+ " description=\"Enter sensor readings to predict maintenance requirements.\"\n",
846
+ ")\n",
847
+ "\n",
848
+ "interface.launch()\n"
849
+ ],
850
+ "metadata": {
851
+ "colab": {
852
+ "base_uri": "https://localhost:8080/",
853
+ "height": 645
854
+ },
855
+ "id": "ig--2AXDfCol",
856
+ "outputId": "6487a442-5192-4137-ac8b-e28972189e62"
857
+ },
858
+ "execution_count": 19,
859
+ "outputs": [
860
+ {
861
+ "output_type": "stream",
862
+ "name": "stdout",
863
+ "text": [
864
+ "Running Gradio in a Colab notebook requires sharing enabled. Automatically setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly).\n",
865
+ "\n",
866
+ "Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n",
867
+ "* Running on public URL: https://60213a30826fcd7f78.gradio.live\n",
868
+ "\n",
869
+ "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from the terminal in the working directory to deploy to Hugging Face Spaces (https://huggingface.co/spaces)\n"
870
+ ]
871
+ },
872
+ {
873
+ "output_type": "display_data",
874
+ "data": {
875
+ "text/plain": [
876
+ "<IPython.core.display.HTML object>"
877
+ ],
878
+ "text/html": [
879
+ "<div><iframe src=\"https://60213a30826fcd7f78.gradio.live\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
880
+ ]
881
+ },
882
+ "metadata": {}
883
+ },
884
+ {
885
+ "output_type": "execute_result",
886
+ "data": {
887
+ "text/plain": []
888
+ },
889
+ "metadata": {},
890
+ "execution_count": 19
891
+ }
892
+ ]
893
+ },
894
+ {
895
+ "cell_type": "code",
896
+ "source": [],
897
+ "metadata": {
898
+ "id": "6lZo0mAFfGf7"
899
+ },
900
+ "execution_count": null,
901
+ "outputs": []
902
+ }
903
+ ]
904
+ }