PragmaticPete's picture
Update utils/model.py
74640ac verified
import pandas as pd
import shap
def preprocess(patient, schema):
df = pd.DataFrame([patient])
# Binary yes/no mappings
binary_fields = [
"FollowUp_Scheduled", "Language_Barrier", "Housing_Instability",
"Caregiver_Support", "Food_Insecurity", "Transportation_Access",
"Lives_Alone", "FollowUp_Within_7_Days", "Primary_Care_Established",
"Recent_Surgery"
]
for field in binary_fields:
if field in df.columns:
df[field] = df[field].map({"Yes": 1, "No": 0})
# Ordinal mappings
ordinal_maps = {
"Medication_Adherence": {"Low": 0, "Medium": 1, "High": 2},
"Health_Literacy": {"Low": 0, "Medium": 1, "High": 2},
"Gender": {"M": 1, "F": 0}
}
for col, mapping in ordinal_maps.items():
if col in df.columns:
df[col] = df[col].map(mapping)
df.drop(columns=["Chronic_Condition_List"], errors="ignore", inplace=True)
# One-hot encoding
onehot_cols = ["Primary_Diagnosis", "Discharge_Disposition", "Insurance_Type"]
df = pd.get_dummies(df, columns=[col for col in onehot_cols if col in df.columns], drop_first=True)
# Align to model schema
for col in schema:
if col not in df.columns:
df[col] = 0
df = df[schema]
return df
def predict_readmission(model, patient):
schema = model.named_steps["preprocessor"].get_feature_names_out()
X = preprocess(patient, schema)
return model.named_steps["model"].predict(X)[0]
def explain_with_shap(model, patient):
schema = model.named_steps["preprocessor"].get_feature_names_out()
X = preprocess(patient, schema)
explainer = shap.Explainer(model.named_steps["model"])
shap_values = explainer(X)
return shap_values, X