From b7580a4d1cbcaacb6ebf27708b88cf2c70edee26 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 16:12:24 -0400 Subject: [PATCH] Confusion matrix can now be drawn --- images/confusion_matrix.png | Bin 0 -> 20753 bytes main.py | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 images/confusion_matrix.png diff --git a/images/confusion_matrix.png b/images/confusion_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fe7553af37bf3c7630d985410d3af86675178a GIT binary patch literal 20753 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 Yv(&A6x%yy#0?;-FPgg&ebxsLQ0FFc2lmGw# literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 9dc5c06..9f6ea01 100644 --- a/main.py +++ b/main.py @@ -41,6 +41,25 @@ def main(): # evaluation evaluate_model(model, X, y_pred, y_test, le) + + draw_confusion_matrix(y_test, y_pred, le) + +def draw_confusion_matrix(y_test, y_pred, le): + y_test_decoded = le.inverse_transform(y_test) + y_pred_decoded = le.inverse_transform(y_pred) + + cm = confusion_matrix(y_test_decoded, y_pred_decoded, labels=le.classes_) + + # Plot + plt.figure(figsize=(6,5)) + sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=le.classes_, + yticklabels=le.classes_) + plt.xlabel("Predicted") + plt.ylabel("Actual") + plt.title("Confusion Matrix") + plt.tight_layout() + plt.savefig("images/confusion_matrix.png", dpi=300) # Save for README + plt.show() def predict_target(model, X_test): y_pred = model.predict(X_test)