From 01b815deebb753ae0a9f3150086d93f8d0acb98e Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 18:30:48 -0400 Subject: [PATCH] Implemented feature engineering --- images/classification_report.png | Bin 16496 -> 19098 bytes images/confusion_matrix.png | Bin 20841 -> 20583 bytes main.py | 47 ++++++++++++++++++++++++------- readme.md | 14 +++++++-- 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/images/classification_report.png b/images/classification_report.png index cfd978c43c4f1572025e2cb9d42b73ae3162dc63..2b299e062cc9bb701d620d1ebfad6c3b0c3026bd 100644 GIT binary patch literal 19098 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 diff --git a/images/confusion_matrix.png b/images/confusion_matrix.png index c26882096f873eec1bd95574b5f8ab648f4b7395..e18877dc38009618f8517165906f865b56a1b27c 100644 GIT binary patch literal 20583 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
Y2vrC6VK@f>KICY*PK9Lfh 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 Nc)I$ztaD0e0sx!`{%`;Q diff --git a/main.py b/main.py index 77087ed..48017e2 100644 --- a/main.py +++ b/main.py @@ -27,9 +27,9 @@ def main(): # split into train and test data X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, stratify=y, random_state=0 - ) + ) - # feature engineering + # pre training processing X_train_normalized, X_test_normalized = normalize_features(X_train, X_test) # training @@ -40,9 +40,14 @@ def main(): # evaluation le = get_label_encoder(df_clean) - draw_feature_importance(model, X) + # draw_feature_importance(model, X) draw_confusion_matrix(y_test, y_pred, le) draw_classification_report(y_test, y_pred, le) + evaluate_accuracy(y_test, y_pred) + +def evaluate_accuracy(y_test, y_pred): + acc = accuracy_score(y_test, y_pred) + print(f"Model Accuracy: {acc:.4f}") def get_label_encoder(df): le = LabelEncoder() @@ -50,16 +55,35 @@ def get_label_encoder(df): return le def draw_classification_report(y_test, y_pred, le): - report = classification_report(y_test, y_pred, output_dict=True, target_names=le.classes_) - df_report = pd.DataFrame(report).transpose() - - df_report.loc[le.classes_, ["precision", "recall", "f1-score"]].plot( - kind="bar", figsize=(8, 5), rot=0, color=["#4C72B0", "#55A868", "#C44E52"] + report = classification_report( + y_test, y_pred, output_dict=True, target_names=le.classes_ ) + df_report = pd.DataFrame(report).transpose() + + metrics_df = df_report.loc[le.classes_, ["precision", "recall", "f1-score"]] + + ax = metrics_df.plot( + kind="bar", + figsize=(8, 5), + rot=0, + color=["#4C72B0", "#55A868", "#C44E52"] + ) + plt.title("Classification Report Metrics") plt.ylabel("Score") plt.ylim(0, 1) plt.legend(loc="lower right") + + for p in ax.patches: + height = p.get_height() + ax.annotate( + f"{height:.2f}", + (p.get_x() + p.get_width() / 2, height), + ha='center', + va='bottom', + fontsize=9 + ) + plt.tight_layout() plt.show() @@ -151,7 +175,7 @@ def remove_outliers(df): numeric_cols = df_clean.select_dtypes(include=[np.number]).columns if len(numeric_cols) == 0: - print("No numeric columns detected.") + # print("No numeric columns detected.") return df_clean mask = np.ones(len(df_clean), dtype=bool) @@ -169,7 +193,7 @@ def remove_outliers(df): df_clean = df_clean[mask] - print(f"Removed {len(df) - len(df_clean)} outliers across {len(numeric_cols)} numeric columns.") + # print(f"Removed {len(df) - len(df_clean)} outliers across {len(numeric_cols)} numeric columns.") return df_clean @@ -211,6 +235,9 @@ def draw_plots(df): def preprocess_data(df): #removing uneeded feature df.drop("Student_ID", axis=1, inplace=True) + df.drop("GPA", axis=1, inplace=True) + df.drop("Extracurricular_Hours_Per_Day", axis=1, inplace=True) + df.drop("Social_Hours_Per_Day", axis=1, inplace=True) df_clean = clean_data(df) order_data_stress_level(df_clean) df_clean = remove_outliers(df_clean) diff --git a/readme.md b/readme.md index 0eabd9a..4a50697 100644 --- a/readme.md +++ b/readme.md @@ -29,7 +29,6 @@ The target variable is the **stress level**, indicated as *low*, *moderate* or * **Figures:** ![Feature Distributions Historgram](images/feature_distributions_histogram.png) ![Scatter Plot Matrix](images/scatter_plot_matrix.png) -![Correlation Heatmap](images/correlation_heatmap.png) ![Study Boxplot](images/boxplots_study_hours_per_day.png) ![Sleep Boxplot](images/boxplots_sleep_hours_per_day.png) ![Sleep Boxplot](images/boxplots_extracurricular_hours_per_day.png) @@ -45,4 +44,15 @@ No missing values or duplicate rows were found in the dataset. Outliers in numer ![Missing Values](images/missing_values.png) ![Duplicate Entries](images/duplicate_entries.png) -![Duplicate Entries](images/removed_outliers.png) \ No newline at end of file +![Duplicate Entries](images/removed_outliers.png) + +--- + +## Feature Engineering + +To improve model performance and reduce redundancy, I performed feature engineering before training: +- **GPA** was removed because it was highly correlated with **study time**, reducing redundant information and potential multicollinearity. +- Features such as **extracurricular activity time** and **social time** were removed due to low predictive importance, minimizing noise and helping the model focus on the most relevant factors. + +![Correlation Heatmap](images/correlation_heatmap.png) +![Feature Importance](images/feature_importance.png) \ No newline at end of file