From 602623029ce88da9cb6f19f7ca51352644b14df6 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 14:08:44 -0400 Subject: [PATCH 01/16] Refactored evaluation --- main.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/main.py b/main.py index e2fc103..c17202a 100644 --- a/main.py +++ b/main.py @@ -19,7 +19,7 @@ def main(): df_clean = preprocess_data(df) # exploratory data analysis - # draw_graphs(df_clean) + # draw_plots(df_clean) # separate features and target X = df_clean.drop('Stress_Level', axis=1) @@ -37,10 +37,11 @@ def main(): # feature engineering X_train_normalized, X_test_normalized = normalize_features(X_train, X_test) + model = train_logistic_regression(X_train_normalized, X_test_normalized, y_train, y_test, le) + evaluate_model(model, X, X_test_normalized, y_test, le) + +def evaluate_model(model, X, X_test, y_test, le): feature_names = X.columns - model = train_logistic_regression(X_train_normalized, X_test_normalized, y_train, y_test, le, feature_names) - - y_pred = model.predict(X_test) # Evaluate @@ -57,12 +58,15 @@ def main(): }) print(feature_importance.sort_values(by='Coefficient', ascending=False)) -def train_logistic_regression(X_train, X_test, y_train, y_test, le, feature_names): +def train_logistic_regression(X_train, X_test, y_train, y_test, le): model = LogisticRegression( solver='lbfgs', max_iter=10000 ) + model.fit(X_train, y_train) + + return model def load_data(): @@ -121,7 +125,7 @@ def display_feature_boxplots(df): plt.title(f"{col} by Stress Level") plt.show() -def draw_graphs(df): +def draw_plots(df): display_feature_distributions_histogram(df) display_scatter_plot_matrix(df) display_correlation_heatmap(df) @@ -134,7 +138,7 @@ def preprocess_data(df): def normalize_features(X_train, X_test): scaler = MinMaxScaler() - X_train_scaled = scaler.fit_transform(X_train) + X_train_scaled = scaler.fit_transform(X_train) # fit only on training data X_test_scaled = scaler.transform(X_test) return X_train_scaled, X_test_scaled From 3625ceb1b27a8b65cac78a490200c4eb3cbde139 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 15:08:44 -0400 Subject: [PATCH 02/16] Refactored X, y separation and checked for duplicate entries --- main.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index c17202a..4d27444 100644 --- a/main.py +++ b/main.py @@ -22,12 +22,8 @@ def main(): # draw_plots(df_clean) # separate features and target - X = df_clean.drop('Stress_Level', axis=1) - y_raw = df_clean['Stress_Level'] - - # encode target le = LabelEncoder() - y = le.fit_transform(y_raw) + X, y = separate_features_and_target(df_clean, le) # split into train and test data X_train, X_test, y_train, y_test = train_test_split( @@ -38,8 +34,16 @@ def main(): X_train_normalized, X_test_normalized = normalize_features(X_train, X_test) model = train_logistic_regression(X_train_normalized, X_test_normalized, y_train, y_test, le) - evaluate_model(model, X, X_test_normalized, y_test, le) + evaluate_model(model, X, X_test_normalized, y_test, le) + +def separate_features_and_target(df, le): + X = df.drop('Stress_Level', axis=1) + y_raw = df['Stress_Level'] + # encode target + y = le.fit_transform(y_raw) + return X, y + def evaluate_model(model, X, X_test, y_test, le): feature_names = X.columns y_pred = model.predict(X_test) @@ -89,11 +93,15 @@ 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") - df.dropna(inplace=False) + print("Duplicate rows in dataset:") + print(df.duplicated().sum()) + print("\n") + + df.dropna(inplace=True) return df def order_data_stress_level(df): From de7fd0d384113ec14d843d61b10675639986ae0a Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 15:54:10 -0400 Subject: [PATCH 03/16] Refactored target prediction and cleaned up other methods --- main.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index 4d27444..9dc5c06 100644 --- a/main.py +++ b/main.py @@ -33,9 +33,18 @@ def main(): # feature engineering X_train_normalized, X_test_normalized = normalize_features(X_train, X_test) - model = train_logistic_regression(X_train_normalized, X_test_normalized, y_train, y_test, le) + # training + model = train_logistic_regression(X_train_normalized, y_train) - evaluate_model(model, X, X_test_normalized, y_test, le) + # prediction + y_pred = predict_target(model, X_test_normalized) + + # evaluation + evaluate_model(model, X, y_pred, y_test, le) + +def predict_target(model, X_test): + y_pred = model.predict(X_test) + return y_pred def separate_features_and_target(df, le): X = df.drop('Stress_Level', axis=1) @@ -44,9 +53,8 @@ def separate_features_and_target(df, le): y = le.fit_transform(y_raw) return X, y -def evaluate_model(model, X, X_test, y_test, le): +def evaluate_model(model, X, y_pred, y_test, le): feature_names = X.columns - y_pred = model.predict(X_test) # Evaluate print("Accuracy:", accuracy_score(y_test, y_pred)) @@ -62,21 +70,16 @@ def evaluate_model(model, X, X_test, y_test, le): }) print(feature_importance.sort_values(by='Coefficient', ascending=False)) -def train_logistic_regression(X_train, X_test, y_train, y_test, le): +def train_logistic_regression(X_train, y_train): model = LogisticRegression( solver='lbfgs', max_iter=10000 ) - model.fit(X_train, y_train) - - return model def load_data(): df = pd.read_csv(data_path, encoding="ascii", delimiter=",") - #removing uneeded feature - df.drop("Student_ID", axis=1, inplace=True) return df def inspect_data(df): @@ -140,6 +143,8 @@ def draw_plots(df): display_feature_boxplots(df) def preprocess_data(df): + #removing uneeded feature + df.drop("Student_ID", axis=1, inplace=True) df_clean = clean_data(df) order_data_stress_level(df_clean) return df_clean From b7580a4d1cbcaacb6ebf27708b88cf2c70edee26 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 16:12:24 -0400 Subject: [PATCH 04/16] 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) From e16e27e9fd8875ca0a26e6b9375e3b2c5a2574a2 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 16:28:56 -0400 Subject: [PATCH 05/16] Added classification report and reordered targets --- images/classification_report.png | Bin 0 -> 16519 bytes images/confusion_matrix.png | Bin 20753 -> 20719 bytes main.py | 33 ++++++++++++++++++++++++------- 3 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 images/classification_report.png diff --git a/images/classification_report.png b/images/classification_report.png new file mode 100644 index 0000000000000000000000000000000000000000..db549be83192f22b75c69aa813ecce5130bd2eb2 GIT binary patch literal 16519 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 literal 20753 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 Yv(&A6x%yy#0?;-FPgg&ebxsLQ0FFc2lmGw# diff --git a/main.py b/main.py index 9f6ea01..393dee3 100644 --- a/main.py +++ b/main.py @@ -21,9 +21,10 @@ def main(): # exploratory data analysis # draw_plots(df_clean) + le = get_label_encoder(df) + # separate features and target - le = LabelEncoder() - X, y = separate_features_and_target(df_clean, le) + X, y = separate_features_and_target(df_clean) # split into train and test data X_train, X_test, y_train, y_test = train_test_split( @@ -43,7 +44,28 @@ def main(): evaluate_model(model, X, y_pred, y_test, le) draw_confusion_matrix(y_test, y_pred, le) + + draw_classification_report(y_test, y_pred, le) +def get_label_encoder(df): + le = LabelEncoder() + le.classes_ = np.array(df['Stress_Level'].cat.categories) + 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"] + ) + plt.title("Classification Report Metrics") + plt.ylabel("Score") + plt.ylim(0, 1) + plt.legend(loc="lower right") + plt.tight_layout() + plt.show() + 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) @@ -58,18 +80,15 @@ def draw_confusion_matrix(y_test, y_pred, le): 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) return y_pred -def separate_features_and_target(df, le): +def separate_features_and_target(df): X = df.drop('Stress_Level', axis=1) - y_raw = df['Stress_Level'] - # encode target - y = le.fit_transform(y_raw) + y = df['Stress_Level'].cat.codes return X, y def evaluate_model(model, X, y_pred, y_test, le): From 93c9da88d22184984c51fb8b442834d102973dc6 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 16:40:37 -0400 Subject: [PATCH 06/16] Outliers are now removed --- images/classification_report.png | Bin 16519 -> 16496 bytes images/confusion_matrix.png | Bin 20719 -> 20841 bytes main.py | 24 +++++++++++++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/images/classification_report.png b/images/classification_report.png index db549be83192f22b75c69aa813ecce5130bd2eb2..cfd978c43c4f1572025e2cb9d42b73ae3162dc63 100644 GIT binary patch delta 13322 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 delta 13240 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 Nc)I$ztaD0e0sx!`{%`;Q literal 20719 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 diff --git a/main.py b/main.py index 393dee3..5feda4f 100644 --- a/main.py +++ b/main.py @@ -21,7 +21,7 @@ def main(): # exploratory data analysis # draw_plots(df_clean) - le = get_label_encoder(df) + le = get_label_encoder(df_clean) # separate features and target X, y = separate_features_and_target(df_clean) @@ -142,8 +142,25 @@ def clean_data(df): print(df.duplicated().sum()) print("\n") - df.dropna(inplace=True) - return df + df_clean = df.dropna(inplace=False) + return df_clean + +def remove_outliers(df): + numeric_cols = df.select_dtypes(include=['number']).columns + + df_clean = df.copy() + + for col in numeric_cols: + Q1 = df[col].quantile(0.25) + Q3 = df[col].quantile(0.75) + IQR = Q3 - Q1 + + lower_bound = Q1 - 1.5 * IQR + upper_bound = Q3 + 1.5 * IQR + + df_clean = df_clean[(df_clean[col] >= lower_bound) & (df_clean[col] <= upper_bound)] + + return df_clean def order_data_stress_level(df): df["Stress_Level"] = pd.Categorical( @@ -185,6 +202,7 @@ def preprocess_data(df): df.drop("Student_ID", axis=1, inplace=True) df_clean = clean_data(df) order_data_stress_level(df_clean) + df_clean = remove_outliers(df_clean) return df_clean def normalize_features(X_train, X_test): From cf82ddd11de58d724a91c2d68bc1b84b08ed4bfa Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 17:01:41 -0400 Subject: [PATCH 07/16] 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) From 5e375d1e6d01d283c245877ab74d5076c65732ad Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 17:43:41 -0400 Subject: [PATCH 08/16] Added data preproccessing section to readme --- images/duplicate_entries.png | Bin 0 -> 3061 bytes images/missing_values.png | Bin 0 -> 18359 bytes images/removed_outliers.png | Bin 0 -> 3336 bytes main.py | 27 ++++++++++++++++++--------- readme.md | 14 ++++++++++++-- 5 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 images/duplicate_entries.png create mode 100644 images/missing_values.png create mode 100644 images/removed_outliers.png diff --git a/images/duplicate_entries.png b/images/duplicate_entries.png new file mode 100644 index 0000000000000000000000000000000000000000..bc39f54bdf43fcd0ee9df4e31255503465aa1034 GIT binary patch literal 3061 zcmb`Jc{JPG7RP_udr>vC_1dZ!ZmUWuFg(|RRj^?<^KQvcyF!u#~Jos>+J8|XRou)=hZ_a9WD-j4gdhS^mOl= z0sxCYb8pJd%A7x{|5?jiSo}?OG=Yi%fi z#{#HD{jbiMsv|c;@^<@?K)bxV>JE%@tM8ewURzrm&z2i~*S^{I`go~0*U)WvgT`3U zzyYasZg78fagbktwA#$AYi5y=KJTQmZ8=WO#6mg)+U8@E5r^_tse*S7EU z9xJ6xsIIsu9BQ4*+;2p5u5-b+Y(b1Ny8Mkk$tw$QyuaF|31G<5Pj!5!T1pBp?-KY! zx(|wa)|#rp)oKTfsFes;;+kw2iariK-8#7&Pa||W)fSrNnRS5J&A!t2DW~UP{Cs!; z*EpHT#Z%?J*oZr;T=EGxVKnRtUZ9-=esTt%hl}PdempJOR?)HK)YFBQiapk*8i;1OqzaMq!T1O{(pRC4bdHtkcwfiF3}8jN{obzBB=&7um^)jk zSocI_*`&8fS7YuLS{K8^7;M-A$pPEZAbCfzMz>R0(OE7oYn)}VW{cV7vlj$B#n2G602N98ne*KzCiMN zf&P04qA}FN|Nc8NK#VTr6!rN2yY>3(?9!af~d|Y`qG_#U0WMla`U=%lpgo z1|2;*ia$0p{Ai&`4p5Dc%U07l#B=-Ky6=v=)4CV#OmNk{^w7|H*ZYU$l1Q09O(^$Z z^cW4_MmUx8ZqSggR#C3Pd-E9XKYAq-M~{NAn5w{uAF`ILpM5n=v$BFW^xOg#=Yqb5 zxdaN99L2nIfE}YJrVuI02WSyd=(PZ%8wNzuuQkcq)OA`PEe0D*35%M?Oig>~KnVT( zB+r`n9M2x0ls>6_^pR3grhiCw4o*KOII3dr#GS!fK_Sec%WG~7Z5vJsfCCciFrBzb z-J7if9>hlOklGOzt6TBo{#^BphhL_-HplJ-#!VE>PBaw_%c+;98C9iru;t4>;ttTN z#Ogo!mr%Kupc+=ND{Z)J!M=KTsn_Cm?2pgMEe5YMo^SqKprhSlqCUrsnw8k+uC%X< zT_jt{+uir+?g+ZGNuj?{7z`x17AmT^sxmti4&!?(m{&nKnLt*ia#Iq7A%Qw?K*|!* zx3>g4l1g90$pV*JQ~i_t4zPXY=w)ttVNY!GmSW~A&nv!+swUJSu3x6!{>x3mhXw^< z&nJorm@GHpb{%3}q_m-UHBZ!^&XH^vU8wWW=Cm*NGkY&#agZ>BluTz;%p_Y1qjgBM+AvVu%Ez{!WZhyK6 zhgg9kO5Ic|0#z{Jz6Oo+VaBL3&Adw_buwQp#<*r5EZ?GOr?OmK6pbV#v3blPBRZ(iPe@POm^1K6NPv!uVMDdwoYG)f=~-yqy(y1o#4hTmzf|qf@^mu3 zes+>H9AtMC-JHeP(?+#bC+FDJFPWB%9N`-nwBM@Z8aI4GaX(w(1=^b-N<=w=<{H&0pr$~ejN|;x+^R|P$L2es45SQzLk}%9^eCCV0j|3(il&pot z6KMJ2{dJ-ctJeIx{d---o8hh~@DQ}|7x9_{Q!bi#68?sUpUFE=>wcZVHM#PA*8#WZ^Wfb2~A2~q}=>AyK^*BVfsI?TN*`g}fBp}Q5)DL@q zy;B_=IQ1sI&D~a49=i@R^?QvlO`W6vHXo)UcJ!^zZQDs8tBx`!lO-G-A+~^Ao@udp zcD{DVgXj@v`A^}fjYH1r*hZBwFD_U8c=<{WUv^4V1a?9U{3+e2Ris?@vYeM-V8gsT z?D#Lm?-GSYE3}L}o*G3*MyoJ*^`}kaC|53Qno7#8o58n43{Uc#gM9r))P7uCvHWZV z%W7SYJ%-)z@REYjXhUpvG-T*VMfQP!`RBa}eX(k8fp^xhMCY78qVmp(w*E zDvsbfay0FFLZJ9ZrNi3cV_0>0mS>Sj{n9^O#qU7ej$*QI?Lyy6zq|UhW$M>VsM|-C za{2L$)4@x=o#_gFxh_3wWyX)3cbC~I!5$Ntf<2&ZeMF3`P}!k7a#$s~RV|4u4L zUtF*m1a z84db2#(ek--&bq)agBS)jY;hOygWqJj-kah%#Y@ub4{_$eP#)VHtyv9>#kyo3dE+^ zI@&-`?18-MFedRjhQXTy!*M5x#XP zl{nXS_Zn=$044m~G)iXGvYA3an!6ZzIETTYi~yeAu|T{RW1QU`v)^iKNez-7B(C{5 zO%M3N2LvmQ61X4{#W=abl2)lP=xn`wp^@0$?Dm?H(Y3g3J#W;1;1K_ z&CH!VX8{1~XfqUfo@TJ-e4IC|GTe59a=bbN01JX~@ifvcB~2_z^1* z^^8w|v|fV8b{(~F(-Vfj@2UYnOaFpQD%O=>v<-5?Dt2nG!8p&@KBO}94R&=zk%g;T z(aD{(3@P7}!=jQDjlJ^#Fv7`65fPn79f%jdO9jh|h^qdEx@%UlE zO(}0;{3^462-bL-Y?=~hM@_ZbDfP1HBjXP9bOFR5^M;!_xha)enl9>cU>j?4vqmvm zUm6c7)LK<$rd+uQKdCJ&%kwOiYw}7a(g^owWcKuFE1lMC0Fb$Gfz&scy+ykEBoOCb zW?;NeWlCXY@OieI;t%{K`X7SjngT1lSb(UNhInSUaDo5SO_u+w^Ed>y2gYh3fyY=7 Rlhgq~Puu8zg{EWlzX7Zt1-k$M literal 0 HcmV?d00001 diff --git a/images/missing_values.png b/images/missing_values.png new file mode 100644 index 0000000000000000000000000000000000000000..505228f76995ebe6d6ffeb583da6a8d4f3213993 GIT binary patch literal 18359 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 P06kXHR4jjJ5&ZuE29NPR literal 0 HcmV?d00001 diff --git a/images/removed_outliers.png b/images/removed_outliers.png new file mode 100644 index 0000000000000000000000000000000000000000..4db63854e53ecea0bf67c3d59627b9168d481edb GIT binary patch literal 3336 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 lower_bound) & (df_clean[col] <= upper_bound)] + + mask &= col_data.between(lower_bound, upper_bound) + + df_clean = df_clean[mask] + + print(f"Removed {len(df) - len(df_clean)} outliers across {len(numeric_cols)} numeric columns.") return df_clean diff --git a/readme.md b/readme.md index f5abb2f..0eabd9a 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. -- Some outliers were observed and will be need to be removed before training for more accurrate results. +- Some outliers were observed and will be need to be removed before training for more accurate results. **Figures:** ![Feature Distributions Historgram](images/feature_distributions_histogram.png) @@ -35,4 +35,14 @@ The target variable is the **stress level**, indicated as *low*, *moderate* or * ![Sleep Boxplot](images/boxplots_extracurricular_hours_per_day.png) ![Sleep Boxplot](images/boxplots_physical_hours_per_day.png) ![Sleep Boxplot](images/boxplots_social_hours_per_day.png) -![Sleep Boxplot](images/boxplots_gpa.png) \ No newline at end of file +![Sleep Boxplot](images/boxplots_gpa.png) + +--- + +## Data Preprocessing + +No missing values or duplicate rows were found in the dataset. Outliers in numeric features were identified using the interquartile range (IQR) method and removed before training. This helps reduce the impact of extreme values and can improve model performance. + +![Missing Values](images/missing_values.png) +![Duplicate Entries](images/duplicate_entries.png) +![Duplicate Entries](images/removed_outliers.png) \ No newline at end of file From 01b815deebb753ae0a9f3150086d93f8d0acb98e Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Mon, 20 Oct 2025 18:30:48 -0400 Subject: [PATCH 09/16] 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 From b5f6069cea6baf22c0caa6070d8d73b713db45c8 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Tue, 21 Oct 2025 16:49:11 -0400 Subject: [PATCH 10/16] Added modeling section --- main.py | 11 ++++------- readme.md | 9 +++++++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/main.py b/main.py index 48017e2..344faea 100644 --- a/main.py +++ b/main.py @@ -41,8 +41,8 @@ def main(): # evaluation le = get_label_encoder(df_clean) # draw_feature_importance(model, X) - draw_confusion_matrix(y_test, y_pred, le) - draw_classification_report(y_test, y_pred, le) + # 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): @@ -134,12 +134,9 @@ def draw_feature_importance(model, X): plt.show() def train_logistic_regression(X_train, y_train): - model = LogisticRegression( - solver='lbfgs', - max_iter=10000 - ) + model = LogisticRegression() model.fit(X_train, y_train) - return model + return model def load_data(): df = pd.read_csv(data_path, encoding="ascii", delimiter=",") diff --git a/readme.md b/readme.md index 4a50697..e28c2a6 100644 --- a/readme.md +++ b/readme.md @@ -29,12 +29,14 @@ 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) ![Sleep Boxplot](images/boxplots_physical_hours_per_day.png) ![Sleep Boxplot](images/boxplots_social_hours_per_day.png) ![Sleep Boxplot](images/boxplots_gpa.png) +![Feature Importance](images/feature_importance.png) --- @@ -54,5 +56,8 @@ To improve model performance and reduce redundancy, I performed feature engineer - **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 +--- + +## Modeling + +This model was made using **logistic regression**, it works well in this situation because it models the probability of each class based on the input features, making it effective for categorical outcomes. After experimenting with different hyperparameter settings, including various solvers and iteration limits, I found that removing them entirely did not noticeably change the model's performance, indicating that the default configuration worked well enough for this purpose. \ No newline at end of file From 5c15f6204b7571547de7a5b39290bc77470ef868 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Wed, 22 Oct 2025 08:57:57 -0400 Subject: [PATCH 11/16] The average accuracy is calculated after 1000 trainings --- images/accuracy.png | Bin 0 -> 1390 bytes main.py | 46 +++++++++++++++++++++++++------------------- readme.md | 12 ++++++++++-- 3 files changed, 36 insertions(+), 22 deletions(-) create mode 100644 images/accuracy.png diff --git a/images/accuracy.png b/images/accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..ef0b6b52c3e4f4ecd6bc03e1f872df156c5eb212 GIT binary patch literal 1390 zcmV-!1(EuRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1p`S$K~#8N?V8(_ z;~)%%w~T2l<+u>H;3`tU^yEcC0wE-9lbt>BL=WFNlL&PEA-DPS_4Ty}!CeUf2e&2! z9Ne0*fFJAr{Qlm*pX>gx?04t4*EhvuU!SQb&=+7^j5QX^zVRMp+ZVQRpNVae`+#vMmuODgEOuMd08o%!wc&9H1qEJd_gJkRyftm(<3m%^)lz$W^;Y)Pcz zF^RhubpqFJ`f)+9yAp}PRr@)p7T#I6a{|3Uw_)vz9wOPx&dy2A8(9PAA>bj zzm46rRe!t=>!f_{FfCQM@5;ee_rjq~O|)1w2!` zAFrQ7+l#uUeQto+2gq9;6oXtJtsC8{P2TW#sx8&ehtrBRC1Bb75{R1E+MwZVgLNta z(G)CFCL%?os4-;0fE@5RUU|;IuWxh+j%`B$U#@)=Z&br1+&dCr7Sjd4MezRmrVkva z)L`@}fpt1Fbp+fG100t|%I3r0Iw1|&8y^~LuNYz}64z0K4&rq&3Zwe;fsu@C#{#}y z`zT%l_t6|cJVFRl6ak8ZC1VU|ghzgKz1WW<-^O#-1#C4GC{F6Iz_}@G1AmBlP|~J{ zFY`DX&t*`bCB(`#+c^P`Y9GY|svZ3M>rR4wQMV`G%5t5?+b3p&HFY;L)UKX0W{P_+ z3D`Z4oetbonh)8kPt z2-cEjVGcO^KHneeXYr+K0ysYzkDikU2rnI4lWWl873)NP`Z0j}&H5Yx+s)R+c+H_E zfQ{fi{t&rH-a}uVkZ&wX_yejRKc2^#`r3Tj^{$PF3#5iGss=BwQSH55`^j^#eP0zY z(Dt+QYY7bw9+t4cIVs1L1S_iT*r5AfMZd_ZKjp>{h_} zMjE`Veh~QTbm@luUA(`56a8C=5O3*;ekuPjZXw_x@CX41wAPp^AF12# zU9-r!PqVgQ9$UbNzjUeFgog}+-&V4v{Y(AXG4BDN@@DV9&$R`7;b!Z6QoPQmM_Nzy zU@lU?MqhZ%tgXG>gR2a0VDBF=+<(BP-^1apM*gB5!~_C*mUYr+dn>W;Ucl`-5zkrQ za#g^UPGnG@eoTjE))v1ezQ*uF91aj0J$|_>A`*iF(d9j@fSdQxda#LJkg#73TI|a? z{)`Y@0ppFz0;KvTZPo=5oM$ND0ymz8RR$rL6|fRtCtxcUAcU1~`^@N|UBwhI#t}JV zess%D*nZ;ReG=ycoZw;dOR^M75#5Y{r9cw4fX@!P&+QdD0b?%e)}$I{ZL;>@Iwu88 z?_W_^StLb>I2^KF60j|{PQXpDDm<0tq5mr!7QiWLcC5MVDlCt2wo%v w9Nd}^aByq>qkx0p-xC53ZcPX{xG`V*UlUGXjAf!^MgRZ+07*qoM6N<$f@|rKP5=M^ literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 344faea..5cef138 100644 --- a/main.py +++ b/main.py @@ -25,29 +25,35 @@ def main(): X, y = separate_features_and_target(df_clean) # 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 - ) + accuracy_scores = [] + # run training many times using different splits to get an average accuracy score + for i in range(1000): + X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=0.2, stratify=y, random_state=i + ) - # pre training processing - X_train_normalized, X_test_normalized = normalize_features(X_train, X_test) - - # training - model = train_logistic_regression(X_train_normalized, y_train) - - # prediction - y_pred = predict_target(model, X_test_normalized) + # pre training processing + X_train_normalized, X_test_normalized = normalize_features(X_train, X_test) + + # training + model = train_logistic_regression(X_train_normalized, y_train) + + # prediction + y_pred = predict_target(model, X_test_normalized) - # evaluation - le = get_label_encoder(df_clean) - # 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) + # evaluation + le = get_label_encoder(df_clean) + # draw_feature_importance(model, X) + # draw_confusion_matrix(y_test, y_pred, le) + # draw_classification_report(y_test, y_pred, le) + accuracy = get_accuracy(y_test, y_pred) + accuracy_scores.append(accuracy) + print(f"Average Accuracy: {np.mean(accuracy_scores):.4f}") + print(f"Samples: {len(accuracy_scores)}") -def evaluate_accuracy(y_test, y_pred): - acc = accuracy_score(y_test, y_pred) - print(f"Model Accuracy: {acc:.4f}") +def get_accuracy(y_test, y_pred): + accuracy = accuracy_score(y_test, y_pred) + return accuracy def get_label_encoder(df): le = LabelEncoder() diff --git a/readme.md b/readme.md index e28c2a6..180c48a 100644 --- a/readme.md +++ b/readme.md @@ -46,7 +46,7 @@ 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) +![Removed Outliers](images/removed_outliers.png) --- @@ -60,4 +60,12 @@ To improve model performance and reduce redundancy, I performed feature engineer ## Modeling -This model was made using **logistic regression**, it works well in this situation because it models the probability of each class based on the input features, making it effective for categorical outcomes. After experimenting with different hyperparameter settings, including various solvers and iteration limits, I found that removing them entirely did not noticeably change the model's performance, indicating that the default configuration worked well enough for this purpose. \ No newline at end of file +This model was made using **logistic regression**, it works well in this situation because it models the probability of each class based on the input features, making it effective for categorical outcomes. After experimenting with different hyperparameter settings, including various solvers and iteration limits, I found that removing them entirely did not noticeably change the model's performance, indicating that the default configuration worked well enough for this purpose. + +--- + +## Results + +![Accuracy](images/accuracy.png) +![Classification Report](images/classification_report.png) +![Confusion Matrix](images/confusion_matrix.png) \ No newline at end of file From 201523cb345d5fb32f487bdc989f0b35d854ce1b Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Wed, 22 Oct 2025 09:50:22 -0400 Subject: [PATCH 12/16] Added text for results --- images/accuracy.png | Bin 1390 -> 4196 bytes readme.md | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/images/accuracy.png b/images/accuracy.png index ef0b6b52c3e4f4ecd6bc03e1f872df156c5eb212..ad4b67391e26aaf05d9a6c2c547262dc08974769 100644 GIT binary patch delta 4185 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 Y_FHoV(UT9C--0W~24?zbUDxOT2lwS1aR2}S delta 1357 zcmV-T1+x0&AnpnwiBL{Q4GJ0x0000DNk~Le000260000Z2nGNE05nB_vymY*e+2_c zL_t(|UhSIOmE#}`hPRAqEakWmx8N#L!1UxrLINQqY?GZm@k9^bIgCd(EBs?e)#DY)LFdv{^jQ_0g>9$)cCS ztA4;H`nzmNq~bA&yBBo=*KYfo<}@MTnp7S%6+uqR>FS>IPcRe(e!yRU+SI-#VSTy* zZh{|gj8h+jHC4Zj-LzGIybkN6eCBIUSn&?$08rn~_5{V$9%jt<@D&Q;e;E7BxH%`T z9r_}B)~utrqa1tzV=>eWXiRa?CIIL`)x`5)c=%`&4V8&K)^yTJ1B`v_Q=QmRydiFV z^jHm~;M$G_JX5~ipy6zTbt(bT6f9CEepC!b~HQPA>k7^&q1F9YT`|D1EeNne3-^y~G#@i=m zgEe(GGt{o0GiHi=FA3O6S|tfi^Cx&2EH~7<366$X2EYOXKSn{7aXgoU`f{`Fn7%FN zQtG2y=&XRv+SB7ve=Z2tl4fBJIQu@|AL?iErD_5=KN*jnlLrVd9a@uX(Bc*AM1J}) zfcwq*90A+S*2Q?up(cQh;645jxk%naU!9O|EK2wTsvkd|$C>)teA@M{jfV@QhA*lH zFRxMUy1j28oaE25cukJ>4yDXyuW}G{ac6-Z|RACDgQ8TA>bhJ2muGT zCIlSZnh>X)>hC_~dtbc2Vhd(*1e}}g z{c`k^yoG@2f4gVvAF12#U9-r!PqVgQ9$UbNzjUeFgog}+-&V4v{Y(AXG4BDN@@DV9 z&$R`7;b!Z6QoPQmM_NzyU@lU?MqhZ%tgXG>gR2a0VDBF=+<(BP-^1apM*gB5!~_C* zmUYr+dn>W;Ucl`-5zkrQa#g^UPGnG@eoTjE))v1ef4;`>LmUne8$EuxD^N(R#3nUXZX~4O;BWIsS|gTmj>a$^xYNCT-RQ5u9fz-~u_TV}v1x)W>QCL|dMTj^YvRx9eEw)a;P3*ePCa-OM<~Zl}w{!yL zT*`AY-mHy%2Q%0L1|h=GB|-o=*kTj^fPF&1(q|oDZ$nB Date: Wed, 22 Oct 2025 09:55:29 -0400 Subject: [PATCH 13/16] Changed heading to match project --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index e291745..e166dbd 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# Student Habits and Stress Prediction Analysis +# Student Stress Level Classifier A machine learning project that examines the habits of students with the goal of gaining insight into how their daily routines may affect their stress levels. Habits such as studying, extracurricular involvement, sleep, socialization, and physical activity, as well as performance indicators like GPA, are analyzed to understand their correlation with stress. From 3b3918a0e1bd0b19966cbbfe5dd2044f949207e9 Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Wed, 22 Oct 2025 10:46:54 -0400 Subject: [PATCH 14/16] Added conclusion section --- readme.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index e166dbd..5eccd3a 100644 --- a/readme.md +++ b/readme.md @@ -73,4 +73,14 @@ As shown in the confusion matrix, each classification yielded slightly different Also, because stress is a subjective measurement, some inconsistency in labeling is expected. Students who appear to belong to one stress category based on their activities might self-report differently due to personal coping mechanisms or varying perceptions of what "stress" means to them. This subjectivity likely contributes to occasional misclassifications, even when the model's performance is otherwise strong. ![Classification Report](images/classification_report.png) -![Confusion Matrix](images/confusion_matrix.png) \ No newline at end of file +![Confusion Matrix](images/confusion_matrix.png) + +--- + +## Conclusion + +Overall, the current state of the model is fairly reliable in predicting high-stress students. The main goal was to identify these students and provide insight into lifestyle adjustments that could help reduce stress without compromising academic performance. For students with GPAs near 4.0, this balance appears more difficult to achieve. Their elevated stress levels are often linked to the amount of time spent studying — the same factor driving their strong performance. For these students, ensuring adequate sleep (at least six hours per night) may be the most effective way to manage stress. + +Physical activity showed a small connection to lower stress levels, but this relationship was not consistent across all students. In fact, increased time spent exercising may slightly reduce GPA, suggesting that excessive physical activity could detract from study time. + +The process that produced these results was intentionally straightforward: a classification problem addressed using logistic regression to predict stress levels. Future improvements could include experimenting with more complex models such as random forests or gradient boosting. Additionally, only a single training and test split was used in this study. Incorporating cross-validation would likely provide more stable and trustworthy performance estimates by reducing the variance introduced by a single random split. \ No newline at end of file From 438ed347d6f1fdec3b4bfc4d972c257e6357ddea Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Wed, 22 Oct 2025 10:56:14 -0400 Subject: [PATCH 15/16] Added how to run section --- readme.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 5eccd3a..de2ac1f 100644 --- a/readme.md +++ b/readme.md @@ -83,4 +83,42 @@ Overall, the current state of the model is fairly reliable in predicting high-st Physical activity showed a small connection to lower stress levels, but this relationship was not consistent across all students. In fact, increased time spent exercising may slightly reduce GPA, suggesting that excessive physical activity could detract from study time. -The process that produced these results was intentionally straightforward: a classification problem addressed using logistic regression to predict stress levels. Future improvements could include experimenting with more complex models such as random forests or gradient boosting. Additionally, only a single training and test split was used in this study. Incorporating cross-validation would likely provide more stable and trustworthy performance estimates by reducing the variance introduced by a single random split. \ No newline at end of file +The process that produced these results was intentionally straightforward: a classification problem addressed using logistic regression to predict stress levels. Future improvements could include experimenting with more complex models such as random forests or gradient boosting. Additionally, only a single training and test split was used in this study. Incorporating cross-validation would likely provide more stable and trustworthy performance estimates by reducing the variance introduced by a single random split. + +--- + +## How to Run + +1. Clone the repository + + `git clone https://github.com/drewgiffin/student-stress-level-classifier` + `cd student-stress-level-classifier` + +2. Create a virtual enviornment (recommended), and activate it + + `python -m venv venv` + +- Windows + + `venv\Scripts\activate` + +- macOS / Linux + + `source venv/bin/activate` + +3. Install dependencies + + `pip install -r requirements.txt` + +4. Run the program + + `python main.py` + +### Notes: +Right now, the program only outputs the average accuracy after running the 1,000 random train/test splits. +If you want to visualize the results yourself: +1. Remove the model training loop that stores the accuracy scores. + +2. Uncomment the `draw_` methods in the main method. + +This allows you to view the analysis graphs instead of just the aggregated accuracy results. \ No newline at end of file From 3cf2d55a80dd8bb1c63977fb94be57cc802a4dbc Mon Sep 17 00:00:00 2001 From: Drew Giffin Date: Wed, 22 Oct 2025 11:07:25 -0400 Subject: [PATCH 16/16] Added references section --- readme.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index de2ac1f..c50c66e 100644 --- a/readme.md +++ b/readme.md @@ -121,4 +121,10 @@ If you want to visualize the results yourself: 2. Uncomment the `draw_` methods in the main method. -This allows you to view the analysis graphs instead of just the aggregated accuracy results. \ No newline at end of file +This allows you to view the analysis graphs instead of just the aggregated accuracy results. + +--- + +## References + +- [Study Habits and Activities of Students Dataset - Kaggle](https://www.kaggle.com/datasets/afnansaifafnan/study-habits-and-activities-of-students) \ No newline at end of file