Files changed (3) hide show
  1. milk_quality_prediction.py +443 -0
  2. milknew.csv +1060 -0
  3. summary_report.txt +51 -0
milk_quality_prediction.py ADDED
@@ -0,0 +1,443 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ ================================================================
3
+ MILK QUALITY PREDICTION SYSTEM
4
+ Final Year Project β€” Machine Learning (Random Forest Classifier)
5
+ Author : FYP Student
6
+ Supervisor: ML Expert
7
+ Dataset : Milk Quality Dataset (Kaggle) β€” milknew.csv
8
+ ================================================================
9
+ """
10
+
11
+ import warnings
12
+ warnings.filterwarnings("ignore")
13
+
14
+ import pandas as pd
15
+ import numpy as np
16
+ import matplotlib
17
+ matplotlib.use("Agg") # non-interactive backend for file output
18
+ import matplotlib.pyplot as plt
19
+ import matplotlib.patches as mpatches
20
+ import seaborn as sns
21
+ import os
22
+
23
+ from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
24
+ from sklearn.preprocessing import LabelEncoder, StandardScaler
25
+ from sklearn.ensemble import RandomForestClassifier
26
+ from sklearn.tree import DecisionTreeClassifier
27
+ from sklearn.linear_model import LogisticRegression
28
+ from sklearn.metrics import (accuracy_score, confusion_matrix,
29
+ classification_report, ConfusionMatrixDisplay)
30
+
31
+ # ── output folder ──────────────────────────────────────────────────────────────
32
+ OUT = "outputs"
33
+ os.makedirs(OUT, exist_ok=True)
34
+
35
+ PALETTE = {"low": "#e74c3c", "medium": "#f39c12", "high": "#2ecc71"}
36
+ LABEL_MAP = {0: "Low Quality", 1: "Medium Quality", 2: "High Quality"}
37
+
38
+ # ══════════════════════════════════════════════════════════════════════════════
39
+ # 1. DATA LOADING & PREPROCESSING
40
+ # ══════════════════════════════════════════════════════════════════════════════
41
+ print("\n" + "="*65)
42
+ print(" MILK QUALITY PREDICTION SYSTEM β€” FYP")
43
+ print("="*65)
44
+
45
+ print("\n[1/6] Loading & Preprocessing Data …")
46
+
47
+ df = pd.read_csv("milknew.csv")
48
+ df.columns = df.columns.str.strip() # strip any accidental spaces
49
+
50
+ print(f"\n βœ” Rows: {df.shape[0]} | Columns: {df.shape[1]}")
51
+ print(f"\n First 5 rows:\n{df.head().to_string(index=False)}")
52
+
53
+ # --- missing values ---
54
+ print(f"\n Missing values per column:\n{df.isnull().sum().to_string()}")
55
+ df.dropna(inplace=True)
56
+
57
+ # --- encode target ---
58
+ le = LabelEncoder()
59
+ df["Grade_enc"] = le.fit_transform(df["Grade"]) # high=0, low=1, medium=2
60
+ class_names = list(le.classes_) # ['high','low','medium']
61
+
62
+ # nicer display order
63
+ ORDER = ["low", "medium", "high"]
64
+
65
+ # --- features & target ---
66
+ FEATURES = ["pH", "Temprature", "Taste", "Odor", "Fat", "Turbidity", "Colour"]
67
+ X = df[FEATURES].values
68
+ y = df["Grade_enc"].values
69
+
70
+ # --- scale ---
71
+ scaler = StandardScaler()
72
+ X_scaled = scaler.fit_transform(X)
73
+
74
+ # --- split ---
75
+ X_train, X_test, y_train, y_test = train_test_split(
76
+ X_scaled, y, test_size=0.20, random_state=42, stratify=y)
77
+
78
+ print(f"\n Train samples : {len(X_train)}")
79
+ print(f" Test samples : {len(X_test)}")
80
+
81
+ # ══════════════════════════════════════════════════════════════════════════════
82
+ # 2. EXPLORATORY DATA ANALYSIS
83
+ # ══════════════════════════════════════════════════════════════════════════════
84
+ print("\n[2/6] Performing EDA …")
85
+
86
+ fig, axes = plt.subplots(2, 2, figsize=(14, 10))
87
+ fig.suptitle("Exploratory Data Analysis β€” Milk Quality Dataset",
88
+ fontsize=15, fontweight="bold", y=1.01)
89
+
90
+ # ── 2a Class distribution ──────────────────────────────────────────────────
91
+ ax = axes[0, 0]
92
+ counts = df["Grade"].value_counts().reindex(ORDER)
93
+ bars = ax.bar(ORDER, counts.values,
94
+ color=[PALETTE[g] for g in ORDER], edgecolor="white", width=0.55)
95
+ for b, v in zip(bars, counts.values):
96
+ ax.text(b.get_x() + b.get_width()/2, b.get_height() + 5,
97
+ str(v), ha="center", fontsize=11, fontweight="bold")
98
+ ax.set_title("Class Distribution", fontweight="bold")
99
+ ax.set_xlabel("Milk Quality Grade"); ax.set_ylabel("Count")
100
+ ax.set_ylim(0, counts.max() * 1.15)
101
+ ax.spines[["top","right"]].set_visible(False)
102
+
103
+ # ── 2b Correlation heatmap ─────────────────────────────────────────────────
104
+ ax = axes[0, 1]
105
+ corr = df[FEATURES + ["Grade_enc"]].corr()
106
+ mask = np.triu(np.ones_like(corr, dtype=bool))
107
+ sns.heatmap(corr, ax=ax, mask=mask, annot=True, fmt=".2f",
108
+ cmap="RdYlGn", center=0, linewidths=0.5,
109
+ cbar_kws={"shrink": 0.8})
110
+ ax.set_title("Feature Correlation Heatmap", fontweight="bold")
111
+
112
+ # ── 2c pH distribution by grade ───────────────────────────────────────────
113
+ ax = axes[1, 0]
114
+ for grade in ORDER:
115
+ subset = df[df["Grade"] == grade]["pH"]
116
+ ax.hist(subset, bins=20, alpha=0.65,
117
+ color=PALETTE[grade], label=grade.capitalize(), edgecolor="white")
118
+ ax.set_title("pH Distribution by Grade", fontweight="bold")
119
+ ax.set_xlabel("pH"); ax.set_ylabel("Frequency")
120
+ ax.legend()
121
+ ax.spines[["top","right"]].set_visible(False)
122
+
123
+ # ── 2d Temperature distribution by grade ──────────────────────────────────
124
+ ax = axes[1, 1]
125
+ data_by_grade = [df[df["Grade"] == g]["Temprature"].values for g in ORDER]
126
+ bp = ax.boxplot(data_by_grade, patch_artist=True, widths=0.55,
127
+ medianprops=dict(color="black", linewidth=2))
128
+ for patch, grade in zip(bp["boxes"], ORDER):
129
+ patch.set_facecolor(PALETTE[grade])
130
+ patch.set_alpha(0.75)
131
+ ax.set_xticklabels([g.capitalize() for g in ORDER])
132
+ ax.set_title("Temperature Distribution by Grade", fontweight="bold")
133
+ ax.set_xlabel("Grade"); ax.set_ylabel("Temperature (Β°C)")
134
+ ax.spines[["top","right"]].set_visible(False)
135
+
136
+ plt.tight_layout()
137
+ eda_path = f"{OUT}/01_eda_overview.png"
138
+ plt.savefig(eda_path, dpi=150, bbox_inches="tight")
139
+ plt.close()
140
+ print(f" βœ” EDA chart saved β†’ {eda_path}")
141
+
142
+ # ══════════════════════════════════════════════════════════════════════════════
143
+ # 3. MODEL DEVELOPMENT
144
+ # ══════════════════════════════════════════════════════════════════════════════
145
+ print("\n[3/6] Training Models …")
146
+
147
+ # ── 3a Hyperparameter tuning for Random Forest ─────────────────────────────
148
+ param_grid = {
149
+ "n_estimators" : [50, 100, 200],
150
+ "max_depth" : [None, 10, 20],
151
+ "min_samples_split": [2, 5],
152
+ }
153
+ gs = GridSearchCV(RandomForestClassifier(random_state=42),
154
+ param_grid, cv=5, scoring="accuracy", n_jobs=-1)
155
+ gs.fit(X_train, y_train)
156
+ best_rf = gs.best_estimator_
157
+ print(f" βœ” Best RF params : {gs.best_params_}")
158
+ print(f" βœ” Best CV accuracy: {gs.best_score_:.4f}")
159
+
160
+ # ── 3b Comparison models ────────────────────────────────────────────────────
161
+ dt = DecisionTreeClassifier(max_depth=10, random_state=42)
162
+ lr = LogisticRegression(max_iter=1000, random_state=42)
163
+ dt.fit(X_train, y_train); lr.fit(X_train, y_train)
164
+
165
+ models = {
166
+ "Random Forest" : best_rf,
167
+ "Decision Tree" : dt,
168
+ "Logistic Regression": lr,
169
+ }
170
+
171
+ # ══════════════════════════════════════════════════════════════════════════════
172
+ # 4. MODEL EVALUATION
173
+ # ══════════════════════════════════════════════════════════════════════════════
174
+ print("\n[4/6] Evaluating Models …")
175
+
176
+ results = {}
177
+ for name, mdl in models.items():
178
+ y_pred = mdl.predict(X_test)
179
+ acc = accuracy_score(y_test, y_pred)
180
+ cv_sc = cross_val_score(mdl, X_scaled, y, cv=5, scoring="accuracy")
181
+ results[name] = {
182
+ "accuracy" : acc,
183
+ "cv_mean" : cv_sc.mean(),
184
+ "cv_std" : cv_sc.std(),
185
+ "y_pred" : y_pred,
186
+ "cm" : confusion_matrix(y_test, y_pred),
187
+ "report" : classification_report(y_test, y_pred,
188
+ target_names=class_names, output_dict=True),
189
+ }
190
+ print(f"\n ── {name} ──")
191
+ print(f" Test Accuracy : {acc:.4f} | CV: {cv_sc.mean():.4f} Β± {cv_sc.std():.4f}")
192
+ print(classification_report(y_test, y_pred, target_names=class_names))
193
+
194
+ rf_res = results["Random Forest"]
195
+
196
+ # ══════════════════════════════════════════════════════════════════════════════
197
+ # 5. VISUALISATIONS
198
+ # ══════════════════════════════════════════════════════════════════════════════
199
+ print("\n[5/6] Generating Visualisations …")
200
+
201
+ # ── 5a Accuracy comparison ──���──────────────────────────────────────────────
202
+ fig, ax = plt.subplots(figsize=(9, 5))
203
+ names = list(results.keys())
204
+ accs = [results[n]["accuracy"] for n in names]
205
+ cv_m = [results[n]["cv_mean"] for n in names]
206
+ cv_s = [results[n]["cv_std"] for n in names]
207
+ x = np.arange(len(names))
208
+ w = 0.35
209
+ colors = ["#3498db", "#e67e22", "#9b59b6"]
210
+
211
+ bars1 = ax.bar(x - w/2, accs, w, label="Test Accuracy",
212
+ color=colors, edgecolor="white", alpha=0.9)
213
+ bars2 = ax.bar(x + w/2, cv_m, w, yerr=cv_s, label="CV Accuracy (mean Β± std)",
214
+ color=colors, edgecolor="white", alpha=0.55, capsize=5)
215
+
216
+ for bar in list(bars1) + list(bars2):
217
+ h = bar.get_height()
218
+ ax.text(bar.get_x() + bar.get_width()/2, h + 0.005,
219
+ f"{h:.3f}", ha="center", va="bottom", fontsize=8.5, fontweight="bold")
220
+
221
+ ax.set_xticks(x); ax.set_xticklabels(names, fontsize=11)
222
+ ax.set_ylim(0.6, 1.05)
223
+ ax.set_ylabel("Accuracy Score", fontsize=12)
224
+ ax.set_title("Model Accuracy Comparison\n(Test vs 5-Fold Cross-Validation)",
225
+ fontsize=13, fontweight="bold")
226
+ ax.legend(fontsize=10)
227
+ ax.spines[["top","right"]].set_visible(False)
228
+ ax.axhline(1.0, color="gray", linestyle="--", linewidth=0.7)
229
+ plt.tight_layout()
230
+ plt.savefig(f"{OUT}/02_accuracy_comparison.png", dpi=150, bbox_inches="tight")
231
+ plt.close()
232
+
233
+ # ── 5b Confusion matrix β€” Random Forest ─────────────────────────────────
234
+ fig, ax = plt.subplots(figsize=(7, 6))
235
+ cm_disp = ConfusionMatrixDisplay(
236
+ confusion_matrix=rf_res["cm"],
237
+ display_labels=[c.capitalize() for c in class_names])
238
+ cm_disp.plot(ax=ax, colorbar=True, cmap="Blues")
239
+ ax.set_title("Confusion Matrix β€” Random Forest", fontsize=13, fontweight="bold")
240
+ plt.tight_layout()
241
+ plt.savefig(f"{OUT}/03_confusion_matrix_rf.png", dpi=150, bbox_inches="tight")
242
+ plt.close()
243
+
244
+ # ── 5c Feature importance ──────────────────────────────────────────────────
245
+ importances = best_rf.feature_importances_
246
+ idx = np.argsort(importances)[::-1]
247
+ feat_sorted = [FEATURES[i] for i in idx]
248
+ imp_sorted = importances[idx]
249
+
250
+ fig, ax = plt.subplots(figsize=(9, 5))
251
+ bar_colors = plt.cm.RdYlGn(np.linspace(0.25, 0.85, len(feat_sorted)))[::-1]
252
+ bars = ax.barh(feat_sorted[::-1], imp_sorted[::-1],
253
+ color=bar_colors[::-1], edgecolor="white")
254
+ for bar, val in zip(bars, imp_sorted[::-1]):
255
+ ax.text(bar.get_width() + 0.003, bar.get_y() + bar.get_height()/2,
256
+ f"{val:.3f}", va="center", fontsize=10, fontweight="bold")
257
+ ax.set_xlabel("Feature Importance (Gini)", fontsize=12)
258
+ ax.set_title("Feature Importance β€” Random Forest Classifier",
259
+ fontsize=13, fontweight="bold")
260
+ ax.spines[["top","right"]].set_visible(False)
261
+ ax.set_xlim(0, imp_sorted.max() * 1.15)
262
+ plt.tight_layout()
263
+ plt.savefig(f"{OUT}/04_feature_importance.png", dpi=150, bbox_inches="tight")
264
+ plt.close()
265
+
266
+ # ── 5d Per-class F1-score comparison across models ─────────────────────────
267
+ fig, ax = plt.subplots(figsize=(10, 5))
268
+ model_names = list(results.keys())
269
+ x = np.arange(len(class_names))
270
+ width = 0.25
271
+ hatch_list = ["", "//", ".."]
272
+
273
+ for i, (mname, hatch) in enumerate(zip(model_names, hatch_list)):
274
+ f1_vals = [results[mname]["report"][c]["f1-score"] for c in class_names]
275
+ offset = (i - 1) * width
276
+ bars = ax.bar(x + offset, f1_vals, width, label=mname,
277
+ alpha=0.85, edgecolor="white", hatch=hatch)
278
+
279
+ ax.set_xticks(x)
280
+ ax.set_xticklabels([c.capitalize() for c in class_names], fontsize=11)
281
+ ax.set_ylabel("F1-Score", fontsize=12)
282
+ ax.set_ylim(0, 1.1)
283
+ ax.set_title("Per-Class F1-Score Comparison Across Models",
284
+ fontsize=13, fontweight="bold")
285
+ ax.legend(fontsize=10)
286
+ ax.axhline(1.0, color="gray", linestyle="--", linewidth=0.7)
287
+ ax.spines[["top","right"]].set_visible(False)
288
+ plt.tight_layout()
289
+ plt.savefig(f"{OUT}/05_f1_comparison.png", dpi=150, bbox_inches="tight")
290
+ plt.close()
291
+
292
+ print(" βœ” All charts saved to outputs/")
293
+
294
+ # ══════════════════════════════════════════════════════════════════════════════
295
+ # 6. PREDICTION SYSTEM (demo with 5 sample inputs)
296
+ # ══════════════════════════════════════════════════════════════════════════════
297
+ print("\n[6/6] Real-Time Prediction System Demo …")
298
+
299
+ QUALITY_LABELS = {"high": "High Quality 🟒", "low": "Low Quality πŸ”΄", "medium": "Medium Quality 🟑"}
300
+
301
+ def predict_milk_quality(ph, temperature, taste, odor, fat, turbidity, colour):
302
+ """
303
+ Predict milk quality from physicochemical properties.
304
+
305
+ Parameters
306
+ ----------
307
+ ph : float (typically 3–9.5)
308
+ temperature : float (Β°C)
309
+ taste : int (1 = good, 0 = bad)
310
+ odor : int (1 = good, 0 = bad)
311
+ fat : int (1 = present, 0 = absent)
312
+ turbidity : int (1 = turbid, 0 = clear)
313
+ colour : int (240–255 typical range)
314
+
315
+ Returns
316
+ -------
317
+ dict with grade, confidence, and per-class probabilities
318
+ """
319
+ raw = np.array([[ph, temperature, taste, odor, fat, turbidity, colour]])
320
+ scaled = scaler.transform(raw)
321
+ grade_enc = best_rf.predict(scaled)[0]
322
+ proba = best_rf.predict_proba(scaled)[0]
323
+ grade_str = le.inverse_transform([grade_enc])[0] # 'high'/'low'/'medium'
324
+ confidence = proba[grade_enc] * 100
325
+ prob_dict = {le.inverse_transform([i])[0]: round(p*100, 2)
326
+ for i, p in enumerate(proba)}
327
+ return {
328
+ "grade" : QUALITY_LABELS[grade_str],
329
+ "raw_grade" : grade_str,
330
+ "confidence" : round(confidence, 2),
331
+ "probabilities": prob_dict,
332
+ }
333
+
334
+ # ── sample predictions ───────────────────────────────────────────────────────
335
+ samples = [
336
+ # (pH, Temp, Taste, Odor, Fat, Turbidity, Colour) β€” expected grade
337
+ (6.6, 35, 1, 0, 1, 0, 254), # likely high
338
+ (8.5, 70, 1, 1, 1, 1, 246), # likely low
339
+ (6.7, 37, 0, 1, 0, 1, 253), # likely medium
340
+ (3.5, 34, 1, 1, 0, 1, 255), # likely low
341
+ (6.8, 40, 1, 1, 1, 0, 250), # likely high
342
+ ]
343
+
344
+ print("\n β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”")
345
+ print(" β”‚ MILK QUALITY PREDICTION RESULTS β”‚")
346
+ print(" β”œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€")
347
+ print(" β”‚ # β”‚ Grade β”‚ Confidenceβ”‚ Probabilities (%) β”‚")
348
+ print(" β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€")
349
+
350
+ for i, args in enumerate(samples, 1):
351
+ res = predict_milk_quality(*args)
352
+ prob_str = " ".join([f"{k[:3].upper()}:{v:.1f}" for k, v in sorted(res["probabilities"].items())])
353
+ print(f" β”‚ {i:<2} β”‚ {res['grade']:<21} β”‚ {res['confidence']:>6.2f}% β”‚ {prob_str:<22} β”‚")
354
+
355
+ print(" β””β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜")
356
+
357
+ # ── 6b Prediction dashboard visual ─────────────────────────────────────────
358
+ fig, axes = plt.subplots(1, len(samples), figsize=(14, 4))
359
+ fig.suptitle("Prediction Dashboard β€” Sample Milk Specimens",
360
+ fontsize=13, fontweight="bold")
361
+
362
+ grade_colors = {"high": "#2ecc71", "medium": "#f39c12", "low": "#e74c3c"}
363
+
364
+ for ax, args in zip(axes, samples):
365
+ res = predict_milk_quality(*args)
366
+ probs = res["probabilities"]
367
+ grades = ["high", "medium", "low"]
368
+ vals = [probs[g] for g in grades]
369
+ colors = [grade_colors[g] for g in grades]
370
+ bars = ax.bar(grades, vals, color=colors, edgecolor="white", alpha=0.85)
371
+ ax.set_ylim(0, 110)
372
+ ax.set_title(f"pH={args[0]}, T={args[1]}Β°C", fontsize=9)
373
+ ax.set_ylabel("Probability (%)", fontsize=8)
374
+ ax.tick_params(axis="x", labelsize=8)
375
+ ax.spines[["top","right"]].set_visible(False)
376
+ # annotate predicted class
377
+ best_g = res["raw_grade"]
378
+ ax.text(0.5, 0.95, f"β†’ {best_g.upper()}",
379
+ transform=ax.transAxes, ha="center", va="top",
380
+ fontsize=10, fontweight="bold", color=grade_colors[best_g],
381
+ bbox=dict(boxstyle="round,pad=0.3", fc="white", ec=grade_colors[best_g], lw=1.5))
382
+
383
+ legend_patches = [mpatches.Patch(color=grade_colors[g], label=g.capitalize()) for g in grades]
384
+ fig.legend(handles=legend_patches, loc="lower right", fontsize=9, ncol=3)
385
+ plt.tight_layout()
386
+ plt.savefig(f"{OUT}/06_prediction_dashboard.png", dpi=150, bbox_inches="tight")
387
+ plt.close()
388
+
389
+ # ══════════════════════════════════════════════════════════════════════════════
390
+ # 7. SUMMARY REPORT
391
+ # ══════════════════════════════════════════════════════════════════════════════
392
+ rf_acc = rf_res["accuracy"]
393
+ rf_cv = rf_res["cv_mean"]
394
+ rf_std = rf_res["cv_std"]
395
+ top_feat = feat_sorted[0]
396
+
397
+ report_text = f"""
398
+ ================================================================
399
+ MILK QUALITY PREDICTION SYSTEM β€” FINAL REPORT
400
+ ================================================================
401
+ Dataset : milknew.csv ({df.shape[0]} samples, {df.shape[1]-1} features)
402
+ Target : Grade β†’ Low / Medium / High
403
+ Train/Test : 80% / 20% (stratified split)
404
+
405
+ ── Model Performance Summary ────────────────────────────────────
406
+ Model Test Acc CV Acc (5-fold)
407
+ ─────────────────────────────────────────────────
408
+ Random Forest {results['Random Forest']['accuracy']:.4f} {results['Random Forest']['cv_mean']:.4f} Β± {results['Random Forest']['cv_std']:.4f}
409
+ Decision Tree {results['Decision Tree']['accuracy']:.4f} {results['Decision Tree']['cv_mean']:.4f} Β± {results['Decision Tree']['cv_std']:.4f}
410
+ Logistic Regression {results['Logistic Regression']['accuracy']:.4f} {results['Logistic Regression']['cv_mean']:.4f} Β± {results['Logistic Regression']['cv_std']:.4f}
411
+
412
+ ── Best Model: Random Forest ────────────────────────────────────
413
+ Best Hyperparameters : {gs.best_params_}
414
+ Test Accuracy : {rf_acc:.4f}
415
+ Cross-Val Accuracy : {rf_cv:.4f} Β± {rf_std:.4f}
416
+ Top Feature : {top_feat}
417
+
418
+ ── Feature Importances (Random Forest) ─────────────────────────
419
+ {chr(10).join([f" {f:<12} : {importances[FEATURES.index(f)]:.4f}" for f in feat_sorted])}
420
+
421
+ ── Classification Report (Random Forest) ────────────────────────
422
+ {classification_report(y_test, rf_res['y_pred'], target_names=class_names)}
423
+
424
+ ── Output Files ─────────────────────────────────────────────────
425
+ 01_eda_overview.png
426
+ 02_accuracy_comparison.png
427
+ 03_confusion_matrix_rf.png
428
+ 04_feature_importance.png
429
+ 05_f1_comparison.png
430
+ 06_prediction_dashboard.png
431
+ summary_report.txt
432
+ ================================================================
433
+ """
434
+
435
+ report_path = f"{OUT}/summary_report.txt"
436
+ with open(report_path, "w") as f:
437
+ f.write(report_text)
438
+
439
+ print(report_text)
440
+ print(" βœ” Summary report saved β†’", report_path)
441
+ print("\n ══════════════════════════════════════")
442
+ print(" FYP pipeline completed successfully! πŸŽ“")
443
+ print(" ══════════════════════════════════════\n")
milknew.csv ADDED
@@ -0,0 +1,1060 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ pH,Temprature,Taste,Odor,Fat ,Turbidity,Colour,Grade
2
+ 6.6,35,1,0,1,0,254,high
3
+ 6.6,36,0,1,0,1,253,high
4
+ 8.5,70,1,1,1,1,246,low
5
+ 9.5,34,1,1,0,1,255,low
6
+ 6.6,37,0,0,0,0,255,medium
7
+ 6.6,37,1,1,1,1,255,high
8
+ 5.5,45,1,0,1,1,250,low
9
+ 4.5,60,0,1,1,1,250,low
10
+ 8.1,66,1,0,1,1,255,low
11
+ 6.7,45,1,1,0,0,247,medium
12
+ 6.7,45,1,1,1,0,245,medium
13
+ 5.6,50,0,1,1,1,255,low
14
+ 8.6,55,0,1,1,1,255,low
15
+ 7.4,90,1,0,1,1,255,low
16
+ 6.8,45,0,1,1,1,255,high
17
+ 6.5,38,1,0,0,0,255,medium
18
+ 4.7,38,1,0,1,0,255,low
19
+ 3,40,1,1,1,1,255,low
20
+ 9,43,1,0,1,1,250,low
21
+ 6.8,40,1,0,1,0,245,medium
22
+ 6.6,45,0,1,1,1,250,high
23
+ 6.5,36,0,0,1,0,255,medium
24
+ 4.5,38,0,1,1,1,255,low
25
+ 6.6,45,1,1,1,1,245,high
26
+ 6.8,35,1,0,1,0,246,medium
27
+ 6.5,36,0,1,1,0,253,high
28
+ 8.5,70,0,0,0,0,246,low
29
+ 6.6,34,0,0,0,1,240,medium
30
+ 6.5,37,0,0,0,0,245,medium
31
+ 6.6,37,1,0,1,0,255,high
32
+ 6.4,45,0,1,0,0,240,medium
33
+ 6.5,40,0,1,0,1,250,low
34
+ 6.8,42,1,1,1,1,255,high
35
+ 6.7,41,1,0,0,0,247,medium
36
+ 6.7,50,1,1,1,0,245,low
37
+ 6.8,45,0,1,1,1,255,high
38
+ 8.6,55,0,1,0,0,255,low
39
+ 7.4,65,0,0,0,0,255,low
40
+ 6.8,41,0,0,0,0,255,medium
41
+ 6.5,38,1,1,1,1,255,high
42
+ 6.8,38,0,0,0,0,255,medium
43
+ 3,40,1,0,0,0,255,low
44
+ 9,43,1,1,1,1,248,low
45
+ 6.8,40,1,1,1,1,255,high
46
+ 6.6,45,0,0,0,1,250,medium
47
+ 6.5,36,0,0,0,0,247,medium
48
+ 6.6,38,0,0,0,0,255,medium
49
+ 6.8,45,1,1,1,0,245,high
50
+ 9.5,34,1,1,0,1,255,low
51
+ 6.5,37,0,0,0,0,255,medium
52
+ 6.6,37,1,1,1,1,255,high
53
+ 5.5,45,1,0,1,1,250,low
54
+ 4.5,60,0,1,1,1,250,low
55
+ 8.1,66,1,0,1,1,255,low
56
+ 6.7,45,1,1,0,0,247,medium
57
+ 6.7,45,1,1,1,0,245,medium
58
+ 5.6,50,0,1,1,1,255,low
59
+ 8.6,55,0,1,1,1,255,low
60
+ 7.4,90,1,0,1,1,255,low
61
+ 6.8,45,0,0,1,0,255,medium
62
+ 6.5,38,1,0,1,0,255,medium
63
+ 6.7,38,1,0,1,0,255,high
64
+ 3,40,1,1,1,1,255,low
65
+ 9,43,1,0,1,1,250,low
66
+ 8.6,55,0,1,1,1,255,low
67
+ 6.8,45,0,0,0,1,255,medium
68
+ 6.8,45,0,1,1,1,255,high
69
+ 6.5,38,1,0,0,0,255,medium
70
+ 4.7,38,1,0,1,0,255,low
71
+ 3,40,1,1,1,1,255,low
72
+ 9,43,1,0,1,1,250,low
73
+ 6.8,40,1,0,1,0,245,medium
74
+ 6.6,45,0,1,1,1,250,high
75
+ 6.5,36,0,0,1,0,255,medium
76
+ 4.5,38,0,1,1,1,255,low
77
+ 6.8,45,1,1,1,1,245,high
78
+ 6.5,35,1,0,1,0,246,medium
79
+ 6.8,36,0,1,1,0,253,high
80
+ 8.5,70,0,0,0,0,246,low
81
+ 6.8,34,0,0,0,1,240,medium
82
+ 6.5,37,0,0,0,0,245,medium
83
+ 6.6,37,1,0,1,0,255,high
84
+ 6.8,45,0,1,0,0,240,medium
85
+ 7.4,65,0,0,0,0,255,low
86
+ 6.8,41,0,0,1,0,255,medium
87
+ 6.5,38,1,1,1,1,255,high
88
+ 6.6,38,0,0,0,0,255,medium
89
+ 3,40,1,0,0,0,255,low
90
+ 9,43,1,1,1,1,248,low
91
+ 6.8,40,1,1,1,1,255,high
92
+ 6.6,50,0,0,0,1,250,low
93
+ 6.5,36,0,0,0,0,247,medium
94
+ 6.6,50,0,0,0,0,255,low
95
+ 6.8,45,1,1,1,0,245,high
96
+ 9.5,34,1,1,0,1,255,low
97
+ 6.5,37,0,0,0,0,255,medium
98
+ 9.5,34,1,1,0,1,255,low
99
+ 6.5,37,0,0,0,0,255,medium
100
+ 6.6,37,1,1,1,1,255,high
101
+ 5.5,45,1,0,1,1,250,low
102
+ 4.5,60,0,1,1,1,250,low
103
+ 8.1,66,1,0,1,1,255,low
104
+ 6.7,45,1,1,0,0,247,medium
105
+ 6.7,45,1,1,1,0,245,medium
106
+ 5.6,50,0,1,1,1,255,low
107
+ 6.6,35,0,1,1,1,255,high
108
+ 7.4,90,1,0,1,1,255,low
109
+ 6.8,50,0,0,1,0,255,low
110
+ 6.5,38,1,0,1,0,255,medium
111
+ 6.7,38,1,0,1,0,255,high
112
+ 3,40,1,1,1,1,255,low
113
+ 6.6,43,1,0,1,1,250,high
114
+ 8.6,55,0,1,1,1,255,low
115
+ 6.8,45,0,0,0,1,255,medium
116
+ 6.8,45,0,1,1,1,255,high
117
+ 6.5,38,1,0,0,0,255,medium
118
+ 6.6,38,1,0,1,0,255,high
119
+ 3,40,1,1,1,1,255,low
120
+ 9,43,1,0,1,1,250,low
121
+ 6.8,40,1,0,1,0,245,medium
122
+ 6.6,45,0,0,0,1,250,medium
123
+ 6.5,36,0,0,1,0,255,medium
124
+ 6.6,38,0,0,1,0,255,medium
125
+ 6.8,45,1,1,1,1,245,high
126
+ 6.5,55,1,0,1,0,246,low
127
+ 6.8,36,0,1,1,0,253,high
128
+ 8.5,70,0,0,0,0,246,low
129
+ 6.8,40,1,0,1,0,245,medium
130
+ 6.6,45,0,1,1,1,250,high
131
+ 6.5,36,0,0,1,0,255,medium
132
+ 4.5,38,0,1,1,1,255,low
133
+ 6.8,45,1,1,1,1,245,high
134
+ 6.5,35,1,0,1,0,246,medium
135
+ 6.8,36,0,1,1,0,253,high
136
+ 8.5,70,0,0,0,0,246,low
137
+ 6.8,34,0,0,0,1,240,medium
138
+ 6.5,37,0,0,0,0,245,medium
139
+ 6.6,37,1,0,1,0,255,high
140
+ 6.8,45,0,1,0,0,240,medium
141
+ 7.4,65,0,0,0,0,255,low
142
+ 6.8,41,0,0,1,0,255,medium
143
+ 6.5,38,1,1,1,1,255,high
144
+ 6.6,38,0,0,0,0,255,medium
145
+ 3,40,1,0,0,0,255,low
146
+ 9,43,1,1,1,1,248,low
147
+ 6.8,40,1,1,1,1,255,high
148
+ 6.6,50,0,0,0,1,250,low
149
+ 6.5,36,0,0,0,0,247,medium
150
+ 6.6,50,0,0,0,0,255,low
151
+ 6.8,45,1,1,1,0,245,high
152
+ 9.5,34,1,1,0,1,255,low
153
+ 6.5,37,0,0,0,0,255,medium
154
+ 9.5,34,1,1,0,1,255,low
155
+ 6.5,37,0,0,0,0,255,medium
156
+ 6.6,37,1,1,1,1,255,high
157
+ 5.5,45,1,0,1,1,250,low
158
+ 4.5,60,0,1,1,1,250,low
159
+ 8.1,66,1,0,1,1,255,low
160
+ 6.7,45,1,1,0,0,247,medium
161
+ 6.7,45,1,1,1,0,245,medium
162
+ 5.6,50,0,1,1,1,255,low
163
+ 6.6,35,0,1,1,1,255,high
164
+ 7.4,90,1,0,1,1,255,low
165
+ 6.8,50,0,0,1,0,255,low
166
+ 6.5,38,1,0,1,0,255,medium
167
+ 6.7,41,1,0,0,0,247,medium
168
+ 6.7,50,1,1,1,0,245,low
169
+ 6.8,45,0,1,1,1,255,high
170
+ 8.6,55,0,1,0,0,255,low
171
+ 7.4,65,0,0,0,0,255,low
172
+ 6.8,41,0,0,0,0,255,medium
173
+ 6.5,38,1,1,1,1,255,high
174
+ 6.8,38,0,0,0,0,255,medium
175
+ 3,40,1,0,0,0,255,low
176
+ 9,43,1,1,1,1,248,low
177
+ 6.8,40,1,1,1,1,255,high
178
+ 6.6,45,0,0,0,1,250,medium
179
+ 6.5,36,0,0,0,0,247,medium
180
+ 6.6,38,0,0,0,0,255,medium
181
+ 6.8,45,1,1,1,0,245,high
182
+ 9.5,34,1,1,0,1,255,low
183
+ 6.5,37,0,0,0,0,255,medium
184
+ 6.6,37,1,1,1,1,255,high
185
+ 5.5,45,1,0,1,1,250,low
186
+ 4.5,60,0,1,1,1,250,low
187
+ 8.1,66,1,0,1,1,255,low
188
+ 6.7,45,1,1,0,0,247,medium
189
+ 6.7,45,1,1,1,0,245,medium
190
+ 5.6,50,0,1,1,1,255,low
191
+ 8.6,55,0,1,1,1,255,low
192
+ 7.4,90,1,0,1,1,255,low
193
+ 6.8,45,0,0,1,0,255,medium
194
+ 6.5,38,1,0,1,0,255,medium
195
+ 6.7,38,1,0,1,0,255,high
196
+ 3,40,1,1,1,1,255,low
197
+ 9,43,1,0,1,1,250,low
198
+ 8.6,55,0,1,1,1,255,low
199
+ 6.8,45,0,0,0,1,255,medium
200
+ 6.8,45,0,1,1,1,255,high
201
+ 6.5,38,1,0,0,0,255,medium
202
+ 4.7,38,1,0,1,0,255,low
203
+ 3,40,1,1,1,1,255,low
204
+ 9,43,1,0,1,1,250,low
205
+ 6.8,40,1,0,1,0,245,medium
206
+ 6.5,37,0,0,0,0,255,medium
207
+ 6.6,37,1,1,1,1,255,high
208
+ 5.5,45,1,0,1,1,250,low
209
+ 4.5,60,0,1,1,1,250,low
210
+ 8.1,66,1,0,1,1,255,low
211
+ 6.7,45,1,1,0,0,247,medium
212
+ 6.7,45,1,1,1,0,245,medium
213
+ 5.6,50,0,1,1,1,255,low
214
+ 8.6,55,0,1,1,1,255,low
215
+ 7.4,90,1,0,1,1,255,low
216
+ 6.8,45,0,0,1,0,255,medium
217
+ 6.5,38,1,0,1,0,255,medium
218
+ 6.7,38,1,0,1,0,255,high
219
+ 3,40,1,1,1,1,255,low
220
+ 9,43,1,0,1,1,250,low
221
+ 8.6,55,0,1,1,1,255,low
222
+ 6.8,45,0,0,0,1,255,medium
223
+ 6.8,45,0,1,1,1,255,high
224
+ 6.5,38,1,0,0,0,255,medium
225
+ 4.7,38,1,0,1,0,255,low
226
+ 3,40,1,1,1,1,255,low
227
+ 9,43,1,0,1,1,250,low
228
+ 6.8,40,1,0,1,0,245,medium
229
+ 6.6,45,0,1,1,1,250,high
230
+ 6.5,36,0,0,1,0,255,medium
231
+ 4.5,38,0,1,1,1,255,low
232
+ 6.8,45,1,1,1,1,245,high
233
+ 6.5,35,1,0,1,0,246,medium
234
+ 6.8,36,0,1,1,0,253,high
235
+ 8.5,70,0,0,0,0,246,low
236
+ 6.8,34,0,0,0,1,240,medium
237
+ 6.5,37,0,0,0,0,245,medium
238
+ 6.6,37,1,0,1,0,255,high
239
+ 6.8,45,0,1,0,0,240,medium
240
+ 7.4,65,0,0,0,0,255,low
241
+ 6.8,41,0,0,1,0,255,medium
242
+ 6.5,38,1,1,1,1,255,high
243
+ 6.6,38,0,0,0,0,255,medium
244
+ 3,40,1,0,0,0,255,low
245
+ 9,43,1,1,1,1,248,low
246
+ 6.5,38,1,0,1,0,255,medium
247
+ 6.7,38,1,0,1,0,255,high
248
+ 3,40,1,1,1,1,255,low
249
+ 6.6,43,1,0,1,1,250,high
250
+ 8.6,55,0,1,1,1,255,low
251
+ 6.8,45,0,0,0,1,255,medium
252
+ 6.8,45,0,1,1,1,255,high
253
+ 6.5,38,1,0,0,0,255,medium
254
+ 6.6,38,1,0,1,0,255,high
255
+ 3,40,1,1,1,1,255,low
256
+ 9,43,1,0,1,1,250,low
257
+ 6.8,40,1,0,1,0,245,medium
258
+ 6.6,45,0,0,0,1,250,medium
259
+ 6.5,36,0,0,1,0,255,medium
260
+ 6.6,38,0,0,1,0,255,medium
261
+ 6.8,45,1,1,1,1,245,high
262
+ 6.5,55,1,0,1,0,246,low
263
+ 6.8,36,0,1,1,0,253,high
264
+ 8.5,70,0,0,0,0,246,low
265
+ 6.8,40,1,0,1,0,245,medium
266
+ 6.6,45,0,1,1,1,250,high
267
+ 6.5,36,0,0,1,0,255,medium
268
+ 4.5,38,0,1,1,1,255,low
269
+ 6.8,45,1,1,1,1,245,high
270
+ 6.5,35,1,0,1,0,246,medium
271
+ 6.8,36,0,1,1,0,253,high
272
+ 8.5,70,0,0,0,0,246,low
273
+ 6.8,34,0,0,0,1,240,medium
274
+ 9,43,1,1,1,1,248,low
275
+ 6.8,40,1,1,1,1,255,high
276
+ 6.6,50,0,0,0,1,250,low
277
+ 6.5,36,0,0,0,0,247,medium
278
+ 6.6,50,0,0,0,0,255,low
279
+ 6.8,45,1,1,1,0,245,high
280
+ 9.5,34,1,1,0,1,255,low
281
+ 6.5,37,0,0,0,0,255,medium
282
+ 9.5,34,1,1,0,1,255,low
283
+ 6.5,37,0,0,0,0,255,medium
284
+ 6.6,37,1,1,1,1,255,high
285
+ 5.5,45,1,0,1,1,250,low
286
+ 4.5,60,0,1,1,1,250,low
287
+ 8.1,66,1,0,1,1,255,low
288
+ 6.7,45,1,1,0,0,247,medium
289
+ 6.7,45,1,1,1,0,245,medium
290
+ 5.6,50,0,1,1,1,255,low
291
+ 6.6,35,0,1,1,1,255,high
292
+ 7.4,90,1,0,1,1,255,low
293
+ 6.8,50,0,0,1,0,255,low
294
+ 6.5,38,1,0,1,0,255,medium
295
+ 6.7,41,1,0,0,0,247,medium
296
+ 6.7,50,1,1,1,0,245,low
297
+ 6.8,45,0,1,1,1,255,high
298
+ 8.6,55,0,1,0,0,255,low
299
+ 7.4,65,0,0,0,0,255,low
300
+ 6.8,41,0,0,0,0,255,medium
301
+ 6.5,38,1,1,1,1,255,high
302
+ 6.8,38,0,0,0,0,255,medium
303
+ 3,40,1,0,0,0,255,low
304
+ 9,43,1,1,1,1,248,low
305
+ 6.8,40,1,1,1,1,255,high
306
+ 6.6,45,0,0,0,1,250,medium
307
+ 6.5,36,0,0,0,0,247,medium
308
+ 6.6,38,0,0,0,0,255,medium
309
+ 6.8,45,1,1,1,0,245,high
310
+ 9.5,34,1,1,0,1,255,low
311
+ 6.5,37,0,0,0,0,255,medium
312
+ 6.6,37,1,1,1,1,255,high
313
+ 5.5,45,1,0,1,1,250,low
314
+ 4.5,60,0,1,1,1,250,low
315
+ 8.1,66,1,0,1,1,255,low
316
+ 6.7,45,1,1,0,0,247,medium
317
+ 6.7,45,1,1,1,0,245,medium
318
+ 5.6,50,0,1,1,1,255,low
319
+ 8.6,55,0,1,1,1,255,low
320
+ 7.4,90,1,0,1,1,255,low
321
+ 6.8,45,0,0,1,0,255,medium
322
+ 6.5,38,1,0,1,0,255,medium
323
+ 6.7,38,1,0,1,0,255,high
324
+ 3,40,1,1,1,1,255,low
325
+ 9,43,1,0,1,1,250,low
326
+ 8.6,55,0,1,1,1,255,low
327
+ 6.8,45,0,0,0,1,255,medium
328
+ 6.8,45,0,1,1,1,255,high
329
+ 6.5,38,1,0,0,0,255,medium
330
+ 4.7,38,1,0,1,0,255,low
331
+ 3,40,1,1,1,1,255,low
332
+ 9,43,1,0,1,1,250,low
333
+ 6.8,40,1,0,1,0,245,medium
334
+ 6.5,37,0,0,0,0,255,medium
335
+ 6.6,37,1,1,1,1,255,high
336
+ 5.5,45,1,0,1,1,250,low
337
+ 4.5,60,0,1,1,1,250,low
338
+ 8.1,66,1,0,1,1,255,low
339
+ 6.7,45,1,1,0,0,247,medium
340
+ 6.7,45,1,1,1,0,245,medium
341
+ 5.6,50,0,1,1,1,255,low
342
+ 8.6,55,0,1,1,1,255,low
343
+ 7.4,90,1,0,1,1,255,low
344
+ 6.8,45,0,0,1,0,255,medium
345
+ 6.5,38,1,0,1,0,255,medium
346
+ 6.7,38,1,0,1,0,255,high
347
+ 3,40,1,1,1,1,255,low
348
+ 9,43,1,0,1,1,250,low
349
+ 8.6,55,0,1,1,1,255,low
350
+ 6.8,45,0,0,0,1,255,medium
351
+ 6.8,45,0,1,1,1,255,high
352
+ 6.5,38,1,0,0,0,255,medium
353
+ 4.7,38,1,0,1,0,255,low
354
+ 3,40,1,1,1,1,255,low
355
+ 9,43,1,0,1,1,250,low
356
+ 6.8,40,1,0,1,0,245,medium
357
+ 6.6,45,0,1,1,1,250,high
358
+ 6.5,36,0,0,1,0,255,medium
359
+ 4.5,38,0,1,1,1,255,low
360
+ 6.8,45,1,1,1,1,245,high
361
+ 6.5,35,1,0,1,0,246,medium
362
+ 6.8,36,0,1,1,0,253,high
363
+ 8.5,70,0,0,0,0,246,low
364
+ 6.8,34,0,0,0,1,240,medium
365
+ 6.5,37,0,0,0,0,245,medium
366
+ 6.6,37,1,0,1,0,255,high
367
+ 6.8,45,0,1,0,0,240,medium
368
+ 7.4,65,0,0,0,0,255,low
369
+ 6.8,41,0,0,1,0,255,medium
370
+ 6.5,38,1,1,1,1,255,high
371
+ 6.6,38,0,0,0,0,255,medium
372
+ 3,40,1,0,0,0,255,low
373
+ 9,43,1,1,1,1,248,low
374
+ 6.5,38,1,0,1,0,255,medium
375
+ 6.7,38,1,0,1,0,255,high
376
+ 3,40,1,1,1,1,255,low
377
+ 6.6,43,1,0,1,1,250,high
378
+ 8.6,55,0,1,1,1,255,low
379
+ 6.8,45,0,0,0,1,255,medium
380
+ 6.8,45,0,1,1,1,255,high
381
+ 6.5,38,1,0,0,0,255,medium
382
+ 6.6,38,1,0,1,0,255,high
383
+ 3,40,1,1,1,1,255,low
384
+ 9,43,1,0,1,1,250,low
385
+ 6.8,40,1,0,1,0,245,medium
386
+ 6.6,45,0,0,0,1,250,medium
387
+ 6.5,36,0,0,1,0,255,medium
388
+ 6.8,45,0,1,1,1,255,high
389
+ 6.5,38,1,0,0,0,255,medium
390
+ 4.7,38,1,0,1,0,255,low
391
+ 3,40,1,1,1,1,255,low
392
+ 9,43,1,0,1,1,250,low
393
+ 6.8,40,1,0,1,0,245,medium
394
+ 6.6,45,0,1,1,1,250,high
395
+ 6.5,36,0,0,1,0,255,medium
396
+ 4.5,38,0,1,1,1,255,low
397
+ 6.8,45,1,1,1,1,245,high
398
+ 6.5,35,1,0,1,0,246,medium
399
+ 6.8,36,0,1,1,0,253,high
400
+ 8.5,70,0,0,0,0,246,low
401
+ 6.8,34,0,0,0,1,240,medium
402
+ 6.5,37,0,0,0,0,245,medium
403
+ 6.6,37,1,0,1,0,255,high
404
+ 6.8,45,0,1,0,0,240,medium
405
+ 7.4,65,0,0,0,0,255,low
406
+ 6.8,41,0,0,1,0,255,medium
407
+ 6.5,38,1,1,1,1,255,high
408
+ 6.6,38,0,0,0,0,255,medium
409
+ 3,40,1,0,0,0,255,low
410
+ 9,43,1,1,1,1,248,low
411
+ 6.8,40,1,1,1,1,255,high
412
+ 6.6,50,0,0,0,1,250,low
413
+ 6.5,36,0,0,0,0,247,medium
414
+ 6.6,50,0,0,0,0,255,low
415
+ 6.8,45,1,1,1,0,245,high
416
+ 9.5,34,1,1,0,1,255,low
417
+ 6.5,37,0,0,0,0,255,medium
418
+ 9.5,34,1,1,0,1,255,low
419
+ 6.5,37,0,0,0,0,255,medium
420
+ 6.6,37,1,1,1,1,255,high
421
+ 5.5,45,1,0,1,1,250,low
422
+ 4.5,60,0,1,1,1,250,low
423
+ 8.1,66,1,0,1,1,255,low
424
+ 6.7,45,1,1,0,0,247,medium
425
+ 6.7,45,1,1,1,0,245,medium
426
+ 5.6,50,0,1,1,1,255,low
427
+ 6.6,35,0,1,1,1,255,high
428
+ 7.4,90,1,0,1,1,255,low
429
+ 6.8,50,0,0,1,0,255,low
430
+ 6.5,38,1,0,1,0,255,medium
431
+ 6.7,38,1,0,1,0,255,high
432
+ 3,40,1,1,1,1,255,low
433
+ 6.6,43,1,0,1,1,250,high
434
+ 8.6,55,0,1,1,1,255,low
435
+ 6.8,45,0,0,0,1,255,medium
436
+ 6.8,45,0,1,1,1,255,high
437
+ 6.5,38,1,0,0,0,255,medium
438
+ 6.6,38,1,0,1,0,255,high
439
+ 3,40,1,1,1,1,255,low
440
+ 9,43,1,0,1,1,250,low
441
+ 6.8,40,1,0,1,0,245,medium
442
+ 6.6,45,0,0,0,1,250,medium
443
+ 6.5,36,0,0,1,0,255,medium
444
+ 6.6,38,0,0,1,0,255,medium
445
+ 6.8,45,1,1,1,1,245,high
446
+ 6.5,55,1,0,1,0,246,low
447
+ 6.8,36,0,1,1,0,253,high
448
+ 8.5,70,0,0,0,0,246,low
449
+ 6.8,40,1,0,1,0,245,medium
450
+ 6.6,45,0,1,1,1,250,high
451
+ 6.5,36,0,0,1,0,255,medium
452
+ 4.5,38,0,1,1,1,255,low
453
+ 6.8,45,1,1,1,1,245,high
454
+ 6.5,35,1,0,1,0,246,medium
455
+ 6.8,36,0,1,1,0,253,high
456
+ 8.5,70,0,0,0,0,246,low
457
+ 6.6,50,0,0,0,0,255,low
458
+ 6.8,45,1,1,1,0,245,high
459
+ 9.5,34,1,1,0,1,255,low
460
+ 6.5,37,0,0,0,0,255,medium
461
+ 9.5,34,1,1,0,1,255,low
462
+ 6.5,37,0,0,0,0,255,medium
463
+ 6.6,37,1,1,1,1,255,high
464
+ 5.5,45,1,0,1,1,250,low
465
+ 4.5,60,0,1,1,1,250,low
466
+ 8.1,66,1,0,1,1,255,low
467
+ 6.7,45,1,1,0,0,247,medium
468
+ 6.7,45,1,1,1,0,245,medium
469
+ 5.6,50,0,1,1,1,255,low
470
+ 6.6,35,0,1,1,1,255,high
471
+ 7.4,90,1,0,1,1,255,low
472
+ 6.8,50,0,0,1,0,255,low
473
+ 6.5,38,1,0,1,0,255,medium
474
+ 6.7,38,1,0,1,0,255,high
475
+ 3,40,1,1,1,1,255,low
476
+ 6.6,43,1,0,1,1,250,high
477
+ 8.6,55,0,1,1,1,255,low
478
+ 6.8,45,0,0,0,1,255,medium
479
+ 6.8,45,0,1,1,1,255,high
480
+ 6.5,38,1,0,0,0,255,medium
481
+ 6.6,38,1,0,1,0,255,high
482
+ 3,40,1,1,1,1,255,low
483
+ 9,43,1,0,1,1,250,low
484
+ 6.8,40,1,0,1,0,245,medium
485
+ 6.6,45,0,0,0,1,250,medium
486
+ 6.5,36,0,0,1,0,255,medium
487
+ 6.6,38,0,0,1,0,255,medium
488
+ 6.8,45,1,1,1,1,245,high
489
+ 6.5,55,1,0,1,0,246,low
490
+ 6.8,36,0,1,1,0,253,high
491
+ 8.5,70,0,0,0,0,246,low
492
+ 6.8,40,1,0,1,0,245,medium
493
+ 6.6,45,0,1,1,1,250,high
494
+ 6.5,36,0,0,1,0,255,medium
495
+ 4.5,38,0,1,1,1,255,low
496
+ 6.8,45,1,1,1,1,245,high
497
+ 6.5,35,1,0,1,0,246,medium
498
+ 6.8,36,0,1,1,0,253,high
499
+ 8.5,70,0,0,0,0,246,low
500
+ 6.8,34,0,0,0,1,240,medium
501
+ 6.5,37,0,0,0,0,245,medium
502
+ 6.6,37,1,0,1,0,255,high
503
+ 6.8,45,0,1,0,0,240,medium
504
+ 7.4,65,0,0,0,0,255,low
505
+ 6.8,41,0,0,1,0,255,medium
506
+ 6.5,38,1,1,1,1,255,high
507
+ 6.6,38,0,0,0,0,255,medium
508
+ 3,40,1,0,0,0,255,low
509
+ 9,43,1,1,1,1,248,low
510
+ 6.8,40,1,1,1,1,255,high
511
+ 6.6,50,0,0,0,1,250,low
512
+ 6.5,36,0,0,0,0,247,medium
513
+ 6.6,50,0,0,0,0,255,low
514
+ 6.8,45,1,1,1,0,245,high
515
+ 9.5,34,1,1,0,1,255,low
516
+ 6.5,37,0,0,0,0,255,medium
517
+ 9.5,34,1,1,0,1,255,low
518
+ 6.5,37,0,0,0,0,255,medium
519
+ 6.6,37,1,1,1,1,255,high
520
+ 5.5,45,1,0,1,1,250,low
521
+ 4.5,60,0,1,1,1,250,low
522
+ 8.1,66,1,0,1,1,255,low
523
+ 6.7,45,1,1,0,0,247,medium
524
+ 6.7,45,1,1,1,0,245,medium
525
+ 5.6,50,0,1,1,1,255,low
526
+ 6.6,35,0,1,1,1,255,high
527
+ 7.4,90,1,0,1,1,255,low
528
+ 6.8,50,0,0,1,0,255,low
529
+ 6.5,38,1,0,1,0,255,medium
530
+ 6.7,41,1,0,0,0,247,medium
531
+ 6.7,50,1,1,1,0,245,low
532
+ 6.8,45,0,1,1,1,255,high
533
+ 6.6,45,0,1,0,0,255,medium
534
+ 7.4,65,0,0,0,0,255,low
535
+ 6.8,41,0,0,0,0,255,medium
536
+ 6.5,38,1,1,1,1,255,high
537
+ 6.8,38,0,0,0,0,255,medium
538
+ 3,40,1,0,0,0,255,low
539
+ 9,43,1,1,1,1,248,low
540
+ 6.8,40,1,1,1,1,255,high
541
+ 6.6,50,0,0,0,1,250,low
542
+ 6.5,36,0,0,0,0,247,medium
543
+ 6.6,38,0,0,0,0,255,medium
544
+ 6.8,45,1,1,1,0,245,high
545
+ 9.5,34,1,1,0,1,255,low
546
+ 6.5,37,0,0,0,0,255,medium
547
+ 6.6,37,1,1,1,1,255,high
548
+ 5.5,45,1,0,1,1,250,low
549
+ 6.5,40,1,0,0,0,250,medium
550
+ 8.1,66,1,0,1,1,255,low
551
+ 6.7,45,1,1,0,0,247,medium
552
+ 6.7,38,1,0,1,0,255,high
553
+ 3,40,1,1,1,1,255,low
554
+ 6.8,43,1,0,1,0,250,high
555
+ 8.6,55,0,1,1,1,255,low
556
+ 6.8,55,0,0,0,1,255,low
557
+ 6.8,45,0,1,1,1,255,high
558
+ 6.5,38,1,0,0,0,255,medium
559
+ 4.7,38,1,0,1,0,255,low
560
+ 3,40,1,1,1,1,255,low
561
+ 9,43,1,0,1,1,250,low
562
+ 6.8,40,1,0,1,0,245,medium
563
+ 6.6,45,0,1,1,1,250,high
564
+ 6.5,36,0,0,1,0,255,medium
565
+ 4.5,38,0,1,1,1,255,low
566
+ 6.8,45,1,1,1,1,245,high
567
+ 6.5,50,1,0,1,0,246,low
568
+ 6.8,36,0,1,1,0,253,high
569
+ 8.5,70,0,0,0,0,246,low
570
+ 6.8,34,0,0,0,1,240,medium
571
+ 6.5,37,0,0,0,0,245,medium
572
+ 6.6,37,1,0,1,0,255,high
573
+ 6.8,45,0,1,0,0,240,medium
574
+ 7.4,65,0,0,0,0,255,low
575
+ 6.8,41,0,0,1,0,255,medium
576
+ 6.5,38,1,1,1,1,255,high
577
+ 6.6,38,0,0,0,0,255,medium
578
+ 6.6,40,1,0,1,1,255,high
579
+ 9,43,1,1,1,1,248,low
580
+ 6.5,38,1,0,1,0,255,medium
581
+ 6.7,38,1,0,1,0,255,high
582
+ 3,40,1,1,1,1,255,low
583
+ 6.6,43,1,0,1,1,250,high
584
+ 6.8,41,0,0,1,0,255,medium
585
+ 6.5,38,1,1,1,1,255,high
586
+ 6.6,38,0,0,0,0,255,medium
587
+ 3,40,1,0,0,0,255,low
588
+ 9,43,1,1,1,1,248,low
589
+ 6.8,40,1,1,1,1,255,high
590
+ 6.6,50,0,0,0,1,250,low
591
+ 6.5,36,0,0,0,0,247,medium
592
+ 6.6,50,0,0,0,0,255,low
593
+ 6.8,45,1,1,1,0,245,high
594
+ 9.5,34,1,1,0,1,255,low
595
+ 6.5,37,0,0,0,0,255,medium
596
+ 9.5,34,1,1,0,1,255,low
597
+ 6.5,37,0,0,0,0,255,medium
598
+ 6.6,37,1,1,1,1,255,high
599
+ 5.5,45,1,0,1,1,250,low
600
+ 4.5,60,0,1,1,1,250,low
601
+ 8.1,66,1,0,1,1,255,low
602
+ 6.7,45,1,1,0,0,247,medium
603
+ 6.7,45,1,1,1,0,245,medium
604
+ 5.6,50,0,1,1,1,255,low
605
+ 6.6,35,0,1,1,1,255,high
606
+ 7.4,90,1,0,1,1,255,low
607
+ 6.8,50,0,0,1,0,255,low
608
+ 6.5,38,1,0,1,0,255,medium
609
+ 6.7,41,1,0,0,0,247,medium
610
+ 6.7,50,1,1,1,0,245,low
611
+ 6.8,45,0,1,1,1,255,high
612
+ 6.6,45,0,1,0,0,255,medium
613
+ 7.4,65,0,0,0,0,255,low
614
+ 6.8,41,0,0,0,0,255,medium
615
+ 6.5,38,1,1,1,1,255,high
616
+ 6.8,38,0,0,0,0,255,medium
617
+ 3,40,1,0,0,0,255,low
618
+ 9,43,1,1,1,1,248,low
619
+ 6.8,40,1,1,1,1,255,high
620
+ 6.6,50,0,0,0,1,250,low
621
+ 6.5,36,0,0,0,0,247,medium
622
+ 6.6,38,0,0,0,0,255,medium
623
+ 6.8,45,1,1,1,0,245,high
624
+ 9.5,34,1,1,0,1,255,low
625
+ 6.5,37,0,0,0,0,255,medium
626
+ 6.6,37,1,1,1,1,255,high
627
+ 5.5,45,1,0,1,1,250,low
628
+ 6.5,40,1,0,0,0,250,medium
629
+ 8.1,66,1,0,1,1,255,low
630
+ 6.7,45,1,1,0,0,247,medium
631
+ 6.7,38,1,0,1,0,255,high
632
+ 3,40,1,1,1,1,255,low
633
+ 6.8,43,1,0,1,0,250,high
634
+ 8.6,55,0,1,1,1,255,low
635
+ 6.8,55,0,0,0,1,255,low
636
+ 6.8,45,0,1,1,1,255,high
637
+ 6.5,38,1,0,0,0,255,medium
638
+ 4.7,38,1,0,1,0,255,low
639
+ 3,40,1,1,1,1,255,low
640
+ 9,43,1,0,1,1,250,low
641
+ 6.8,40,1,0,1,0,245,medium
642
+ 6.6,45,0,1,1,1,250,high
643
+ 6.5,36,0,0,1,0,255,medium
644
+ 4.5,38,0,1,1,1,255,low
645
+ 6.8,45,1,1,1,1,245,high
646
+ 6.5,50,1,0,1,0,246,low
647
+ 6.8,36,0,1,1,0,253,high
648
+ 8.5,70,0,0,0,0,246,low
649
+ 6.8,34,0,0,0,1,240,medium
650
+ 6.5,37,0,0,0,0,245,medium
651
+ 6.6,37,1,0,1,0,255,high
652
+ 6.8,45,0,1,0,0,240,medium
653
+ 7.4,65,0,0,0,0,255,low
654
+ 6.8,41,0,0,1,0,255,medium
655
+ 6.5,38,1,1,1,1,255,high
656
+ 6.6,38,0,0,0,0,255,medium
657
+ 6.7,38,1,0,1,0,255,high
658
+ 3,40,1,1,1,1,255,low
659
+ 9,43,1,0,1,1,250,low
660
+ 8.6,55,0,1,1,1,255,low
661
+ 6.8,45,0,0,0,1,255,medium
662
+ 6.8,45,0,1,1,1,255,high
663
+ 6.5,38,1,0,0,0,255,medium
664
+ 4.7,38,1,0,1,0,255,low
665
+ 3,40,1,1,1,1,255,low
666
+ 9,43,1,0,1,1,250,low
667
+ 6.8,40,1,0,1,0,245,medium
668
+ 6.5,37,0,0,0,0,255,medium
669
+ 6.6,37,1,1,1,1,255,high
670
+ 5.5,45,1,0,1,1,250,low
671
+ 4.5,60,0,1,1,1,250,low
672
+ 8.1,66,1,0,1,1,255,low
673
+ 6.7,45,1,1,0,0,247,medium
674
+ 6.7,45,1,1,1,0,245,medium
675
+ 5.6,50,0,1,1,1,255,low
676
+ 8.6,55,0,1,1,1,255,low
677
+ 7.4,90,1,0,1,1,255,low
678
+ 6.8,45,0,0,1,0,255,medium
679
+ 6.5,38,1,0,1,0,255,medium
680
+ 6.7,38,1,0,1,0,255,high
681
+ 3,40,1,1,1,1,255,low
682
+ 9,43,1,0,1,1,250,low
683
+ 8.6,55,0,1,1,1,255,low
684
+ 6.8,45,0,0,0,1,255,medium
685
+ 6.8,45,0,1,1,1,255,high
686
+ 6.5,38,1,0,0,0,255,medium
687
+ 4.7,38,1,0,1,0,255,low
688
+ 3,40,1,1,1,1,255,low
689
+ 9,43,1,0,1,1,250,low
690
+ 6.8,40,1,0,1,0,245,medium
691
+ 6.6,45,0,1,1,1,250,high
692
+ 6.5,36,0,0,1,0,255,medium
693
+ 4.5,38,0,1,1,1,255,low
694
+ 6.8,45,1,1,1,1,245,high
695
+ 6.5,35,1,0,1,0,246,medium
696
+ 6.8,36,0,1,1,0,253,high
697
+ 8.5,70,0,0,0,0,246,low
698
+ 6.8,34,0,0,0,1,240,medium
699
+ 6.5,37,0,0,0,0,245,medium
700
+ 6.6,37,1,0,1,0,255,high
701
+ 6.8,45,0,1,0,0,240,medium
702
+ 7.4,65,0,0,0,0,255,low
703
+ 6.8,41,0,0,1,0,255,medium
704
+ 6.5,38,1,1,1,1,255,high
705
+ 6.6,38,0,0,0,0,255,medium
706
+ 3,40,1,0,0,0,255,low
707
+ 9,43,1,1,1,1,248,low
708
+ 6.5,38,1,0,1,0,255,medium
709
+ 6.7,38,1,0,1,0,255,high
710
+ 3,40,1,1,1,1,255,low
711
+ 6.6,43,1,0,1,1,250,high
712
+ 8.6,55,0,1,1,1,255,low
713
+ 6.8,45,0,0,0,1,255,medium
714
+ 6.8,45,0,1,1,1,255,high
715
+ 6.5,38,1,0,0,0,255,medium
716
+ 6.6,38,1,0,1,0,255,high
717
+ 3,40,1,1,1,1,255,low
718
+ 9,43,1,0,1,1,250,low
719
+ 6.8,40,1,0,1,0,245,medium
720
+ 6.6,45,0,0,0,1,250,medium
721
+ 6.5,36,0,0,1,0,255,medium
722
+ 6.8,45,0,1,1,1,255,high
723
+ 6.5,38,1,0,0,0,255,medium
724
+ 4.7,38,1,0,1,0,255,low
725
+ 3,40,1,1,1,1,255,low
726
+ 9,43,1,0,1,1,250,low
727
+ 6.8,40,1,0,1,0,245,medium
728
+ 6.6,45,0,1,1,1,250,high
729
+ 6.5,36,0,0,1,0,255,medium
730
+ 4.5,38,0,1,1,1,255,low
731
+ 6.8,45,1,1,1,1,245,high
732
+ 5.5,45,1,0,1,1,250,low
733
+ 4.5,60,0,1,1,1,250,low
734
+ 8.1,66,1,0,1,1,255,low
735
+ 6.7,45,1,1,0,0,247,medium
736
+ 6.7,45,1,1,1,0,245,medium
737
+ 5.6,50,0,1,1,1,255,low
738
+ 6.6,35,0,1,1,1,255,high
739
+ 7.4,90,1,0,1,1,255,low
740
+ 6.8,50,0,0,1,0,255,low
741
+ 6.5,38,1,0,1,0,255,medium
742
+ 6.7,41,1,0,0,0,247,medium
743
+ 6.7,50,1,1,1,0,245,low
744
+ 6.8,45,0,1,1,1,255,high
745
+ 8.6,55,0,1,0,0,255,low
746
+ 7.4,65,0,0,0,0,255,low
747
+ 6.8,41,0,0,0,0,255,medium
748
+ 6.5,38,1,1,1,1,255,high
749
+ 6.8,38,0,0,0,0,255,medium
750
+ 3,40,1,0,0,0,255,low
751
+ 9,43,1,1,1,1,248,low
752
+ 6.8,40,1,1,1,1,255,high
753
+ 6.6,45,0,0,0,1,250,medium
754
+ 6.5,36,0,0,0,0,247,medium
755
+ 6.6,38,0,0,0,0,255,medium
756
+ 6.8,45,1,1,1,0,245,high
757
+ 9.5,34,1,1,0,1,255,low
758
+ 6.5,37,0,0,0,0,255,medium
759
+ 6.6,37,1,1,1,1,255,high
760
+ 5.5,45,1,0,1,1,250,low
761
+ 4.5,60,0,1,1,1,250,low
762
+ 8.1,66,1,0,1,1,255,low
763
+ 6.7,45,1,1,0,0,247,medium
764
+ 6.7,45,1,1,1,0,245,medium
765
+ 5.6,50,0,1,1,1,255,low
766
+ 8.6,55,0,1,1,1,255,low
767
+ 7.4,90,1,0,1,1,255,low
768
+ 6.8,45,0,0,1,0,255,medium
769
+ 6.5,38,1,0,1,0,255,medium
770
+ 6.7,38,1,0,1,0,255,high
771
+ 3,40,1,1,1,1,255,low
772
+ 9,43,1,0,1,1,250,low
773
+ 8.6,55,0,1,1,1,255,low
774
+ 6.8,45,0,0,0,1,255,medium
775
+ 6.8,45,0,1,1,1,255,high
776
+ 6.5,38,1,0,0,0,255,medium
777
+ 4.7,38,1,0,1,0,255,low
778
+ 3,40,1,1,1,1,255,low
779
+ 9,43,1,0,1,1,250,low
780
+ 6.8,40,1,0,1,0,245,medium
781
+ 6.5,37,0,0,0,0,255,medium
782
+ 6.6,37,1,1,1,1,255,high
783
+ 5.5,45,1,0,1,1,250,low
784
+ 4.5,60,0,1,1,1,250,low
785
+ 8.1,66,1,0,1,1,255,low
786
+ 6.7,45,1,1,0,0,247,medium
787
+ 6.7,45,1,1,1,0,245,medium
788
+ 5.6,50,0,1,1,1,255,low
789
+ 8.6,55,0,1,1,1,255,low
790
+ 7.4,90,1,0,1,1,255,low
791
+ 6.8,45,0,0,1,0,255,medium
792
+ 6.5,38,1,0,1,0,255,medium
793
+ 6.7,38,1,0,1,0,255,high
794
+ 3,40,1,1,1,1,255,low
795
+ 9,43,1,0,1,1,250,low
796
+ 8.6,55,0,1,1,1,255,low
797
+ 6.8,45,0,0,0,1,255,medium
798
+ 6.8,45,0,1,1,1,255,high
799
+ 6.5,38,1,0,0,0,255,medium
800
+ 4.7,38,1,0,1,0,255,low
801
+ 3,40,1,1,1,1,255,low
802
+ 9,43,1,0,1,1,250,low
803
+ 6.8,40,1,0,1,0,245,medium
804
+ 6.6,45,0,1,1,1,250,high
805
+ 6.5,36,0,0,1,0,255,medium
806
+ 4.5,38,0,1,1,1,255,low
807
+ 6.8,45,1,1,1,1,245,high
808
+ 6.5,35,1,0,1,0,246,medium
809
+ 6.8,36,0,1,1,0,253,high
810
+ 8.5,70,0,0,0,0,246,low
811
+ 6.8,34,0,0,0,1,240,medium
812
+ 6.5,37,0,0,0,0,245,medium
813
+ 6.6,37,1,0,1,0,255,high
814
+ 6.8,45,0,1,0,0,240,medium
815
+ 7.4,65,0,0,0,0,255,low
816
+ 6.8,41,0,0,1,0,255,medium
817
+ 6.5,38,1,1,1,1,255,high
818
+ 6.6,38,0,0,0,0,255,medium
819
+ 3,40,1,0,0,0,255,low
820
+ 9,43,1,1,1,1,248,low
821
+ 6.5,38,1,0,1,0,255,medium
822
+ 6.7,38,1,0,1,0,255,high
823
+ 6.6,40,0,0,0,0,255,medium
824
+ 6.6,43,1,0,1,1,250,high
825
+ 8.6,55,0,1,1,1,255,low
826
+ 6.8,45,0,0,0,1,255,medium
827
+ 6.8,45,0,1,1,1,255,high
828
+ 6.5,38,1,0,0,0,255,medium
829
+ 6.6,38,1,0,1,0,255,high
830
+ 3,40,1,1,1,1,255,low
831
+ 9,43,1,0,1,1,250,low
832
+ 6.8,40,1,0,1,0,245,medium
833
+ 6.6,45,0,1,1,1,250,high
834
+ 6.5,36,0,0,1,0,255,medium
835
+ 6.8,45,0,1,1,1,255,high
836
+ 6.5,38,1,0,0,0,255,medium
837
+ 4.7,38,1,0,1,0,255,low
838
+ 3,40,1,1,1,1,255,low
839
+ 9,43,1,0,1,1,250,low
840
+ 6.8,40,1,0,1,0,245,medium
841
+ 6.6,45,0,1,1,1,250,high
842
+ 6.5,36,0,0,1,0,255,medium
843
+ 4.5,38,0,1,1,1,255,low
844
+ 6.8,45,1,1,1,1,245,high
845
+ 6.5,35,1,0,1,0,246,medium
846
+ 6.8,36,0,1,1,0,253,high
847
+ 8.5,70,0,0,0,0,246,low
848
+ 6.8,34,0,0,0,1,240,medium
849
+ 6.5,37,0,1,1,1,245,low
850
+ 6.6,37,1,0,1,0,255,high
851
+ 6.8,45,0,1,0,0,240,medium
852
+ 7.4,65,0,0,0,0,255,low
853
+ 6.8,41,0,0,1,0,255,medium
854
+ 6.5,38,1,1,1,1,255,high
855
+ 6.6,38,0,0,0,0,255,medium
856
+ 3,40,1,0,0,0,255,low
857
+ 9,43,1,1,1,1,248,low
858
+ 6.8,40,1,1,1,1,255,high
859
+ 6.6,50,0,0,0,1,250,low
860
+ 6.5,36,0,0,0,0,247,medium
861
+ 6.6,50,0,0,0,0,255,low
862
+ 6.8,45,1,1,1,0,245,high
863
+ 6.6,40,1,0,0,0,255,medium
864
+ 9,43,1,1,1,1,248,low
865
+ 6.8,40,1,1,1,1,255,high
866
+ 6.6,50,0,0,0,1,250,low
867
+ 6.5,36,0,0,0,0,247,medium
868
+ 6.6,38,0,0,0,0,255,medium
869
+ 6.8,45,1,1,1,0,245,high
870
+ 9.5,34,1,1,0,1,255,low
871
+ 6.5,37,0,0,0,0,255,medium
872
+ 6.6,37,1,1,1,1,255,high
873
+ 5.5,45,1,0,1,1,250,low
874
+ 6.5,40,1,0,0,0,250,medium
875
+ 8.1,66,1,0,1,1,255,low
876
+ 6.7,45,1,1,0,0,247,medium
877
+ 6.7,38,1,0,1,0,255,high
878
+ 3,40,1,1,1,1,255,low
879
+ 6.8,43,1,0,1,0,250,high
880
+ 8.6,55,0,1,1,1,255,low
881
+ 6.8,55,0,0,0,1,255,low
882
+ 6.8,45,0,1,1,1,255,high
883
+ 6.5,38,1,0,0,0,255,medium
884
+ 4.7,38,1,0,1,0,255,low
885
+ 6.6,40,1,1,1,1,255,high
886
+ 9,43,1,0,1,1,250,low
887
+ 6.8,40,1,0,1,0,245,medium
888
+ 6.6,45,0,1,1,1,250,high
889
+ 6.5,36,0,0,1,0,255,medium
890
+ 4.5,38,0,1,1,1,255,low
891
+ 6.8,45,1,1,1,1,245,high
892
+ 6.5,50,1,0,1,0,246,low
893
+ 6.6,37,1,0,1,0,255,high
894
+ 6.8,45,0,1,0,0,240,medium
895
+ 7.4,65,0,0,0,0,255,low
896
+ 6.8,41,0,0,1,0,255,medium
897
+ 6.5,38,1,1,1,1,255,high
898
+ 6.6,38,0,0,0,0,255,medium
899
+ 6.7,38,1,0,1,0,255,high
900
+ 3,40,1,1,1,1,255,low
901
+ 6.6,43,0,0,1,0,250,medium
902
+ 8.6,55,0,1,1,1,255,low
903
+ 6.8,45,0,0,0,1,255,medium
904
+ 6.8,45,0,1,1,1,255,high
905
+ 6.5,38,1,0,0,0,255,medium
906
+ 4.7,38,1,0,1,0,255,low
907
+ 3,40,1,1,1,1,255,low
908
+ 9,43,1,0,1,1,250,low
909
+ 6.8,40,1,0,1,0,245,medium
910
+ 6.5,37,0,0,0,0,255,medium
911
+ 6.6,37,1,1,1,1,255,high
912
+ 5.5,45,1,0,1,1,250,low
913
+ 6.5,40,0,0,1,0,250,medium
914
+ 8.1,66,1,0,1,1,255,low
915
+ 6.7,45,1,1,0,0,247,medium
916
+ 6.7,45,1,1,1,0,245,medium
917
+ 5.6,50,0,1,1,1,255,low
918
+ 8.6,55,0,1,1,1,255,low
919
+ 6.7,41,1,0,0,0,247,medium
920
+ 6.7,50,1,1,1,0,245,low
921
+ 6.8,45,0,1,1,1,255,high
922
+ 8.6,55,0,1,0,0,255,low
923
+ 7.4,65,0,0,0,0,255,low
924
+ 6.8,41,0,0,0,0,255,medium
925
+ 6.5,38,1,1,1,1,255,high
926
+ 6.8,38,0,0,0,0,255,medium
927
+ 3,40,1,0,0,0,255,low
928
+ 9,43,1,1,1,1,248,low
929
+ 6.8,40,1,1,1,1,255,high
930
+ 6.6,45,0,0,0,1,250,medium
931
+ 6.5,36,0,0,0,0,247,medium
932
+ 6.6,38,0,1,1,1,255,high
933
+ 6.8,45,1,1,1,0,245,high
934
+ 9.5,34,1,1,0,1,255,low
935
+ 6.5,37,0,0,0,0,255,medium
936
+ 6.6,37,1,1,1,1,255,high
937
+ 5.5,45,1,0,1,1,250,low
938
+ 4.5,60,0,1,1,1,250,low
939
+ 8.1,66,1,0,1,1,255,low
940
+ 6.7,45,1,1,0,0,247,medium
941
+ 6.7,45,1,1,1,0,245,medium
942
+ 5.6,50,0,1,1,1,255,low
943
+ 8.6,55,0,1,1,1,255,low
944
+ 6.6,45,1,0,0,1,255,medium
945
+ 9,43,1,0,1,1,250,low
946
+ 6.8,40,1,0,1,0,245,medium
947
+ 6.6,45,0,1,1,1,250,high
948
+ 6.5,36,0,0,1,0,255,medium
949
+ 4.5,38,0,1,1,1,255,low
950
+ 6.8,45,1,1,1,1,245,high
951
+ 6.5,35,1,0,1,0,246,medium
952
+ 6.8,36,0,1,1,0,253,high
953
+ 8.5,70,0,0,0,0,246,low
954
+ 6.8,34,0,0,0,1,240,medium
955
+ 6.5,37,0,0,0,0,245,medium
956
+ 6.6,37,1,0,1,0,255,high
957
+ 6.8,45,0,1,0,0,240,medium
958
+ 7.4,65,0,0,0,0,255,low
959
+ 6.8,41,1,1,1,0,255,high
960
+ 6.5,38,1,1,1,1,255,high
961
+ 6.6,38,0,0,0,0,255,medium
962
+ 3,40,1,0,0,0,255,low
963
+ 9,43,1,1,1,1,248,low
964
+ 6.5,38,1,0,1,0,255,medium
965
+ 6.7,38,1,0,1,0,255,high
966
+ 3,40,1,1,1,1,255,low
967
+ 6.6,43,1,0,1,1,250,high
968
+ 8.6,55,0,1,1,1,255,low
969
+ 6.5,40,1,0,0,0,250,medium
970
+ 8.1,66,1,0,1,1,255,low
971
+ 6.7,45,1,1,0,0,247,medium
972
+ 6.7,38,1,0,1,0,255,high
973
+ 3,40,1,1,1,1,255,low
974
+ 6.8,43,1,0,1,0,250,high
975
+ 8.6,55,0,1,1,1,255,low
976
+ 6.8,55,0,0,0,1,255,low
977
+ 6.8,45,0,1,1,1,255,high
978
+ 6.5,38,1,0,0,0,255,medium
979
+ 4.7,38,1,0,1,0,255,low
980
+ 3,40,1,1,1,1,255,low
981
+ 9,43,1,0,1,1,250,low
982
+ 6.8,40,1,0,1,0,245,medium
983
+ 6.6,45,0,1,1,1,250,high
984
+ 6.5,36,0,0,1,0,255,medium
985
+ 4.5,38,0,1,1,1,255,low
986
+ 6.8,45,1,1,1,1,245,high
987
+ 6.5,45,1,0,0,0,246,medium
988
+ 6.8,36,0,1,1,0,253,high
989
+ 8.5,70,0,0,0,0,246,low
990
+ 6.8,34,0,0,0,1,240,medium
991
+ 6.5,37,0,0,0,0,245,medium
992
+ 6.6,37,1,0,1,0,255,high
993
+ 6.8,45,0,1,0,0,240,medium
994
+ 7.4,65,0,0,0,0,255,low
995
+ 6.8,41,0,0,1,0,255,medium
996
+ 6.5,38,1,1,1,1,255,high
997
+ 6.6,38,0,0,0,0,255,medium
998
+ 6.7,38,1,0,1,0,255,high
999
+ 3,40,1,1,1,1,255,low
1000
+ 6.6,43,0,0,0,1,250,medium
1001
+ 8.6,55,0,1,1,1,255,low
1002
+ 6.8,45,0,0,0,1,255,medium
1003
+ 6.8,45,0,1,1,1,255,high
1004
+ 6.5,38,1,0,0,0,255,medium
1005
+ 4.7,38,1,0,1,0,255,low
1006
+ 3,40,1,1,1,1,255,low
1007
+ 9,43,1,0,1,1,250,low
1008
+ 6.8,40,1,0,1,0,245,medium
1009
+ 6.5,37,0,0,0,0,255,medium
1010
+ 3,40,1,1,1,1,255,low
1011
+ 9,43,1,0,1,1,250,low
1012
+ 6.8,40,1,0,1,0,245,medium
1013
+ 6.6,45,0,1,1,1,250,high
1014
+ 6.5,36,0,0,1,0,255,medium
1015
+ 6.8,45,0,1,1,1,255,high
1016
+ 6.5,38,1,0,0,0,255,medium
1017
+ 4.7,38,1,0,1,0,255,low
1018
+ 3,40,1,1,1,1,255,low
1019
+ 9,43,1,0,1,1,250,low
1020
+ 6.8,40,1,0,1,0,245,medium
1021
+ 6.6,45,0,1,1,1,250,high
1022
+ 6.5,36,0,0,1,0,255,medium
1023
+ 4.5,38,0,1,1,1,255,low
1024
+ 6.8,45,1,1,1,1,245,high
1025
+ 6.5,35,1,0,1,0,246,medium
1026
+ 6.8,36,0,1,1,0,253,high
1027
+ 8.5,70,0,0,0,0,246,low
1028
+ 6.8,34,0,0,0,1,240,medium
1029
+ 6.5,37,0,1,1,1,245,low
1030
+ 6.6,37,1,0,1,0,255,high
1031
+ 6.8,45,0,1,0,0,240,medium
1032
+ 7.4,65,0,0,0,0,255,low
1033
+ 6.8,41,0,0,1,0,255,medium
1034
+ 6.5,38,1,1,1,1,255,high
1035
+ 6.6,38,0,0,0,0,255,medium
1036
+ 3,40,1,0,0,0,255,low
1037
+ 9,43,1,1,1,1,248,low
1038
+ 6.8,40,1,1,1,1,255,high
1039
+ 6.6,50,0,0,0,1,250,low
1040
+ 6.5,36,0,0,0,0,247,medium
1041
+ 6.6,50,0,0,0,0,255,low
1042
+ 6.8,45,1,1,1,0,245,high
1043
+ 6.6,40,1,0,0,0,255,medium
1044
+ 9,43,1,1,1,1,248,low
1045
+ 6.8,40,1,1,1,1,255,high
1046
+ 6.6,50,0,0,0,1,250,low
1047
+ 6.5,36,0,0,0,0,247,medium
1048
+ 6.6,38,0,0,0,0,255,medium
1049
+ 6.8,45,1,1,1,0,245,high
1050
+ 9.5,34,1,1,0,1,255,low
1051
+ 6.5,37,0,0,0,0,255,medium
1052
+ 6.6,37,1,1,1,1,255,high
1053
+ 5.5,45,1,0,1,1,250,low
1054
+ 6.5,40,1,0,0,0,250,medium
1055
+ 8.1,66,1,0,1,1,255,low
1056
+ 6.7,45,1,1,0,0,247,medium
1057
+ 6.7,38,1,0,1,0,255,high
1058
+ 3,40,1,1,1,1,255,low
1059
+ 6.8,43,1,0,1,0,250,high
1060
+ 8.6,55,0,1,1,1,255,low
summary_report.txt ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ ================================================================
3
+ MILK QUALITY PREDICTION SYSTEM β€” FINAL REPORT
4
+ ================================================================
5
+ Dataset : milknew.csv (1059 samples, 8 features)
6
+ Target : Grade β†’ Low / Medium / High
7
+ Train/Test : 80% / 20% (stratified split)
8
+
9
+ ── Model Performance Summary ────────────────────────────────────
10
+ Model Test Acc CV Acc (5-fold)
11
+ ─────────────────────────────────────────────────
12
+ Random Forest 0.9953 0.9962 Β± 0.0046
13
+ Decision Tree 0.9953 0.9934 Β± 0.0082
14
+ Logistic Regression 0.8302 0.8518 Β± 0.0046
15
+
16
+ ── Best Model: Random Forest ────────────────────────────────────
17
+ Best Hyperparameters : {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 50}
18
+ Test Accuracy : 0.9953
19
+ Cross-Val Accuracy : 0.9962 Β± 0.0046
20
+ Top Feature : pH
21
+
22
+ ── Feature Importances (Random Forest) ─────────────────────────
23
+ pH : 0.4024
24
+ Temprature : 0.2332
25
+ Fat : 0.1054
26
+ Turbidity : 0.0849
27
+ Odor : 0.0740
28
+ Colour : 0.0571
29
+ Taste : 0.0429
30
+
31
+ ── Classification Report (Random Forest) ────────────────────────
32
+ precision recall f1-score support
33
+
34
+ high 1.00 0.98 0.99 51
35
+ low 0.99 1.00 0.99 86
36
+ medium 1.00 1.00 1.00 75
37
+
38
+ accuracy 1.00 212
39
+ macro avg 1.00 0.99 0.99 212
40
+ weighted avg 1.00 1.00 1.00 212
41
+
42
+
43
+ ── Output Files ─────────────────────────────────────────────────
44
+ 01_eda_overview.png
45
+ 02_accuracy_comparison.png
46
+ 03_confusion_matrix_rf.png
47
+ 04_feature_importance.png
48
+ 05_f1_comparison.png
49
+ 06_prediction_dashboard.png
50
+ summary_report.txt
51
+ ================================================================