39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
import joblib
|
||
import xgboost as xgb
|
||
import shap
|
||
|
||
def processing(processed_dict):
|
||
# model_path = r"C:\Users\abinisha\citrus\centurion-dataform-mcard\flowx\model_1\artifacts\xgboost_model_v2.joblib"
|
||
model_path = "./xgboost_model.joblib"
|
||
model = joblib.load(model_path)
|
||
explainer = shap.TreeExplainer(model)
|
||
feature_names = model.feature_names
|
||
|
||
# build and score
|
||
X = [processed_dict[f] for f in feature_names]
|
||
dmatrix = xgb.DMatrix([X], feature_names=feature_names)
|
||
pred = float(model.predict(dmatrix)[0])
|
||
|
||
# get SHAP values as 1×n_features
|
||
shap_matrix = explainer.shap_values(dmatrix)
|
||
shap_vals = shap_matrix[0] if getattr(shap_matrix, "ndim", 1) > 1 else shap_matrix
|
||
|
||
# rank & sort features by descending SHAP impact
|
||
ranked = sorted(zip(feature_names, shap_vals),
|
||
key=lambda fv: fv[1],
|
||
reverse=True)
|
||
|
||
# build a *list* of pre-sorted reason-codes
|
||
shape_reasoncode = [
|
||
{
|
||
"feature": feat,
|
||
"value": processed_dict[feat],
|
||
"shap_rank": i+1
|
||
}
|
||
for i, (feat, _) in enumerate(ranked)
|
||
]
|
||
|
||
return {
|
||
"prediction": pred,
|
||
"shape_reasoncode": shape_reasoncode
|
||
} |