Bibek Mukherjee
commited on
Update src/api/loan_model.py
Browse files- src/api/loan_model.py +35 -12
src/api/loan_model.py
CHANGED
|
@@ -41,29 +41,52 @@ class LoanApprovalModel:
|
|
| 41 |
if load_model:
|
| 42 |
self.load_components()
|
| 43 |
|
| 44 |
-
# Add this to your load_components method
|
| 45 |
def load_components(self):
|
|
|
|
| 46 |
try:
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
try:
|
| 53 |
-
explainer_path = os.path.join(self.model_dir, 'loan_explainer.pkl')
|
| 54 |
if os.path.exists(explainer_path):
|
| 55 |
self.explainer = joblib.load(explainer_path)
|
| 56 |
-
else:
|
| 57 |
-
self.explainer = None
|
| 58 |
-
logger.warning("Explainer file not found. Explanations will be limited.")
|
| 59 |
except Exception as explainer_error:
|
| 60 |
-
logger.
|
| 61 |
self.explainer = None
|
| 62 |
-
logger.
|
| 63 |
|
| 64 |
logger.info("Model components loaded successfully")
|
|
|
|
| 65 |
except Exception as e:
|
| 66 |
logger.error(f"Error loading model components: {str(e)}")
|
|
|
|
|
|
|
|
|
|
| 67 |
raise ValueError(f"Failed to load model components: {str(e)}")
|
| 68 |
|
| 69 |
def save(self, output_dir: str = "models") -> None:
|
|
|
|
| 41 |
if load_model:
|
| 42 |
self.load_components()
|
| 43 |
|
|
|
|
| 44 |
def load_components(self):
|
| 45 |
+
"""Load the trained model and preprocessing components."""
|
| 46 |
try:
|
| 47 |
+
logger.info("Loading model components...")
|
| 48 |
+
|
| 49 |
+
# Load model
|
| 50 |
+
model_path = os.path.join(self.model_dir, 'loan_model.joblib')
|
| 51 |
+
if not os.path.exists(model_path):
|
| 52 |
+
raise FileNotFoundError(f"Model file not found at {model_path}")
|
| 53 |
+
self.model = joblib.load(model_path)
|
| 54 |
+
|
| 55 |
+
# Load scaler
|
| 56 |
+
scaler_path = os.path.join(self.model_dir, 'loan_scaler.joblib')
|
| 57 |
+
if not os.path.exists(scaler_path):
|
| 58 |
+
raise FileNotFoundError(f"Scaler file not found at {scaler_path}")
|
| 59 |
+
self.scaler = joblib.load(scaler_path)
|
| 60 |
+
|
| 61 |
+
# Load label encoders
|
| 62 |
+
encoders_path = os.path.join(self.model_dir, 'loan_label_encoders.joblib')
|
| 63 |
+
if not os.path.exists(encoders_path):
|
| 64 |
+
raise FileNotFoundError(f"Label encoders file not found at {encoders_path}")
|
| 65 |
+
self.label_encoders = joblib.load(encoders_path)
|
| 66 |
+
|
| 67 |
+
# Load feature names
|
| 68 |
+
features_path = os.path.join(self.model_dir, 'loan_feature_names.joblib')
|
| 69 |
+
if not os.path.exists(features_path):
|
| 70 |
+
raise FileNotFoundError(f"Feature names file not found at {features_path}")
|
| 71 |
+
self.feature_names = joblib.load(features_path)
|
| 72 |
+
|
| 73 |
+
# Try to load explainer if available
|
| 74 |
+
explainer_path = os.path.join(self.model_dir, 'loan_explainer.joblib')
|
| 75 |
try:
|
|
|
|
| 76 |
if os.path.exists(explainer_path):
|
| 77 |
self.explainer = joblib.load(explainer_path)
|
|
|
|
|
|
|
|
|
|
| 78 |
except Exception as explainer_error:
|
| 79 |
+
logger.warning(f"Error loading explainer: {str(explainer_error)}")
|
| 80 |
self.explainer = None
|
| 81 |
+
logger.info("Continuing without explainer. Explanations will be limited.")
|
| 82 |
|
| 83 |
logger.info("Model components loaded successfully")
|
| 84 |
+
|
| 85 |
except Exception as e:
|
| 86 |
logger.error(f"Error loading model components: {str(e)}")
|
| 87 |
+
# Add fallback mechanism for model loading errors
|
| 88 |
+
if "'LoanApprovalModel' object has no attribute 'model_path'" in str(e):
|
| 89 |
+
logger.error("Incorrect attribute reference in load_components method")
|
| 90 |
raise ValueError(f"Failed to load model components: {str(e)}")
|
| 91 |
|
| 92 |
def save(self, output_dir: str = "models") -> None:
|