# Import Libraries import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import os import joblib # Load Dataset df = pd.read_csv("hospital_readmissions.csv") # Basic Info df.info() df.describe() # Missing Values print(df.isnull().sum()) # Readmission Distribution sns.countplot(x='readmitted', data=df) plt.title('Readmitted Class Distribution') plt.xlabel('Readmitted (0=No, 1=Yes)') plt.ylabel('Count') plt.show() # Histograms for Numeric Features numeric_features = ['time_in_hospital', 'n_lab_procedures', 'n_procedures', 'n_medications'] df[numeric_features].hist(figsize=(10,8), bins=15) plt.suptitle('Distribution of Numeric Features') plt.show() # Encoding Categorical Variables from sklearn.preprocessing import LabelEncoder label_encoders_file = "label_encoders.pkl" label_encoders_2_file = "label_encoders_2.pkl" # Load or Fit Label Encoders if os.path.exists(label_encoders_file) and os.path.exists(label_encoders_2_file): print("Loading existing label encoders...") label_encoders = joblib.load(label_encoders_file) label_encoders_2 = joblib.load(label_encoders_2_file) else: print("Fitting new label encoders...") categorical_cols = ['age', 'glucose_test', 'A1Ctest', 'change', 'diabetes_med', 'readmitted'] label_encoders = {col: LabelEncoder() for col in categorical_cols} for col, le in label_encoders.items(): df[col] = le.fit_transform(df[col].astype(str)) categorical_cols_2 = ['medical_specialty', 'diag_1', 'diag_2', 'diag_3'] label_encoders_2 = {col: LabelEncoder() for col in categorical_cols_2} for col2, le in label_encoders_2.items(): df[col2] = le.fit_transform(df[col2].astype(str)) joblib.dump(label_encoders, label_encoders_file) joblib.dump(label_encoders_2, label_encoders_2_file) print("Label encoders saved.") # Feature Engineering (Interaction Terms) from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False) interaction_terms = poly.fit_transform(df[['time_in_hospital', 'n_lab_procedures', 'n_procedures', 'n_medications']]) interaction_df = pd.DataFrame(interaction_terms, columns=poly.get_feature_names_out( ['time_in_hospital', 'n_lab_procedures', 'n_procedures', 'n_medications'])) df = pd.concat([df, interaction_df], axis=1) # Splitting the Data from sklearn.model_selection import train_test_split X = df.drop('readmitted', axis=1) y = df['readmitted'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Remove duplicate columns X_train = X_train.loc[:, ~X_train.columns.duplicated()] X_test = X_test.loc[:, ~X_test.columns.duplicated()] feature_columns_file = "feature_columns.pkl" joblib.dump(X_train.columns.tolist(), feature_columns_file) print(f"Feature columns saved as {feature_columns_file}") # Define Model Filenames rf_model_file = "rf_tuned_model.pkl" xgb_model_file = "xgb_model.pkl" lgbm_model_file = "lgbm_model.pkl" # Random Forest Classifier from sklearn.ensemble import RandomForestClassifier if os.path.exists(rf_model_file): print(f"Loading existing Random Forest model from {rf_model_file}...") rf_model = joblib.load(rf_model_file) else: print("Training Random Forest model...") rf_model = RandomForestClassifier( bootstrap=True, max_depth=10, min_samples_leaf=4, min_samples_split=5, n_estimators=200, random_state=42 ) rf_model.fit(X_train, y_train) joblib.dump(rf_model, rf_model_file) print(f"Random Forest model saved as {rf_model_file}") # XGBoost Classifier from xgboost import XGBClassifier if os.path.exists(xgb_model_file): print(f"Loading existing XGBoost model from {xgb_model_file}...") xgb_model = joblib.load(xgb_model_file) else: print("Training XGBoost model...") xgb_model = XGBClassifier( n_estimators=200, max_depth=10, learning_rate=0.1, subsample=0.8, colsample_bytree=0.8, random_state=42 ) xgb_model.fit(X_train, y_train) joblib.dump(xgb_model, xgb_model_file) print(f"XGBoost model saved as {xgb_model_file}") # LightGBM Classifier from lightgbm import LGBMClassifier if os.path.exists(lgbm_model_file): print(f"Loading existing LightGBM model from {lgbm_model_file}...") lgbm_model = joblib.load(lgbm_model_file) else: print("Training LightGBM model...") lgbm_model = LGBMClassifier( n_estimators=200, max_depth=10, learning_rate=0.1, subsample=0.8, colsample_bytree=0.8, random_state=42 ) lgbm_model.fit(X_train, y_train) joblib.dump(lgbm_model, lgbm_model_file) print(f"LightGBM model saved as {lgbm_model_file}") # Predictions y_pred_rf = rf_model.predict(X_test) y_proba_rf = rf_model.predict_proba(X_test)[:, 1] y_pred_xgb = xgb_model.predict(X_test) y_proba_xgb = xgb_model.predict_proba(X_test)[:, 1] y_pred_lgbm = lgbm_model.predict(X_test) y_proba_lgbm = lgbm_model.predict_proba(X_test)[:, 1] # Evaluation from sklearn.metrics import classification_report, roc_auc_score print("Random Forest Classification Report:\n", classification_report(y_test, y_pred_rf)) print("Random Forest ROC-AUC Score:", roc_auc_score(y_test, y_proba_rf)) print("XGBoost Classification Report:\n", classification_report(y_test, y_pred_xgb)) print("XGBoost ROC-AUC Score:", roc_auc_score(y_test, y_proba_xgb)) print("LightGBM Classification Report:\n", classification_report(y_test, y_pred_lgbm)) print("LightGBM ROC-AUC Score:", roc_auc_score(y_test, y_proba_lgbm)) # Compare Models results = { "Model": ["Random Forest", "XGBoost", "LightGBM"], "ROC-AUC Score": [roc_auc_score(y_test, y_proba_rf), roc_auc_score(y_test, y_proba_xgb), roc_auc_score(y_test, y_proba_lgbm)] } results_df = pd.DataFrame(results) print("\nModel Performance Summary:") print(results_df) # Plot Model Comparison sns.barplot(data=results_df, x="Model", y="ROC-AUC Score", palette="viridis") plt.title("Model ROC-AUC Comparison") plt.ylabel("ROC-AUC Score") plt.show()