Spaces:
Sleeping
Sleeping
# 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() | |