From cf82ddd11de58d724a91c2d68bc1b84b08ed4bfa Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 17:01:41 -0400 Subject: [PATCH] Feature importance is now drawn --- images/feature_importance.png | Bin 0 -> 25777 bytes main.py | 48 ++++++++++++++++++---------------- readme.md | 2 +- 3 files changed, 26 insertions(+), 24 deletions(-) create mode 100644 images/feature_importance.png diff --git a/images/feature_importance.png b/images/feature_importance.png new file mode 100644 index 0000000000000000000000000000000000000000..649ad34b44f7008bf8187380dc7700c28451ef0b GIT binary patch literal 25777 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 5feda4f..3373f1b 100644 --- a/main.py +++ b/main.py @@ -41,10 +41,8 @@ def main(): y_pred = predict_target(model, X_test_normalized) # evaluation - evaluate_model(model, X, y_pred, y_test, le) - + draw_feature_importance(model, X) draw_confusion_matrix(y_test, y_pred, le) - draw_classification_report(y_test, y_pred, le) def get_label_encoder(df): @@ -91,22 +89,26 @@ def separate_features_and_target(df): y = df['Stress_Level'].cat.codes return X, y -def evaluate_model(model, X, y_pred, y_test, le): - feature_names = X.columns - - # Evaluate - print("Accuracy:", accuracy_score(y_test, y_pred)) - print("\nClassification Report:") - print(classification_report(y_test, y_pred, target_names=le.classes_)) - - print("\nConfusion Matrix:") - print(confusion_matrix(y_test, y_pred)) - +def draw_feature_importance(model, X): feature_importance = pd.DataFrame({ - 'Feature': feature_names, - 'Coefficient': model.coef_[0] + 'Feature': X.columns, + 'Coefficient': -model.coef_[0] }) - print(feature_importance.sort_values(by='Coefficient', ascending=False)) + + feature_importance['abs_coef'] = feature_importance['Coefficient'].abs() + feature_importance = feature_importance.sort_values(by='abs_coef', ascending=False) + feature_importance = feature_importance.iloc[::-1] + + colors = ['green' if c > 0 else 'red' for c in feature_importance['Coefficient']] + + plt.figure(figsize=(8,6)) + plt.barh(feature_importance['Feature'], feature_importance['Coefficient'], color=colors) + plt.xlabel("Coefficient (Impact on Stress Level)") + plt.ylabel("Feature") + plt.title("Feature Importance") + plt.axvline(0, color='black', linewidth=0.8) + plt.tight_layout() + plt.show() def train_logistic_regression(X_train, y_train): model = LogisticRegression( @@ -134,13 +136,13 @@ def inspect_data(df): print("\n") def clean_data(df): - print("Missing values:") - print(df.isnull().sum()) - print("\n") + # print("Missing values:") + # print(df.isnull().sum()) + # print("\n") - print("Duplicate rows in dataset:") - print(df.duplicated().sum()) - print("\n") + # print("Duplicate rows in dataset:") + # print(df.duplicated().sum()) + # print("\n") df_clean = df.dropna(inplace=False) return df_clean diff --git a/readme.md b/readme.md index ab11b93..f5abb2f 100644 --- a/readme.md +++ b/readme.md @@ -24,7 +24,7 @@ The target variable is the **stress level**, indicated as *low*, *moderate* or * - Students who study more are more likely to have a higher GPA and more stress. - Physical activity has a negative correlation with other activities, one being study and therefore stress. - Students who sleep more were less likely to be very stressed. -- No extreme outliers were observed. +- Some outliers were observed and will be need to be removed before training for more accurrate results. **Figures:** ![Feature Distributions Historgram](images/feature_distributions_histogram.png)