LC_8 / scripts /check_numpy_equivalence.py
github-actions[bot]
Deploy API from GitHub Actions
4e13ce7
Raw History Blame Contribute Delete
2.33 kB
import sys
import warnings
from pathlib import Path
import numpy as np
PROJECT_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(PROJECT_ROOT))
from app.main import build_model_frame, predict_default_probability
from app.model_loader import load_model
from app.schemas import CreditApplication, MODEL_FEATURES
def predict_numpy(model, application):
model_input = application.to_model_input()
model_array = np.array(
[[model_input[feature] for feature in MODEL_FEATURES]],
dtype=np.float32,
)
with warnings.catch_warnings():
warnings.filterwarnings(
"ignore",
message="X does not have valid feature names",
category=UserWarning,
)
probabilities = model.predict_proba(model_array)
probability = float(probabilities[0][1])
prediction = int(probability >= 0.5)
return prediction, probability
def main():
model = load_model()
cases = [
CreditApplication(),
CreditApplication(AMT_CREDIT=300000, AMT_ANNUITY=18000),
CreditApplication(AMT_CREDIT=900000, AMT_GOODS_PRICE=850000),
CreditApplication(DAYS_BIRTH=-10000, DAYS_ID_PUBLISH=-2000),
CreditApplication(
EXT_SOURCE_MEAN=0.35,
EXT_SOURCE_MIN=0.2,
EXT_SOURCE_3=0.4,
),
]
max_diff = 0.0
for index, application in enumerate(cases, start=1):
model_frame = build_model_frame(application)
df_prediction, df_probability = predict_default_probability(model, model_frame)
np_prediction, np_probability = predict_numpy(model, application)
diff = abs(df_probability - np_probability)
max_diff = max(max_diff, diff)
print(f"Case {index}")
print(f" DataFrame: prediction={df_prediction}, probability={df_probability:.10f}")
print(f" NumPy: prediction={np_prediction}, probability={np_probability:.10f}")
print(f" Diff: {diff:.12f}")
if df_prediction != np_prediction:
raise RuntimeError(f"Prediction mismatch on case {index}")
if diff > 1e-8:
raise RuntimeError(f"Probability mismatch on case {index}: {diff}")
print("")
print(f"All cases matched. Max probability diff: {max_diff:.12f}")
if __name__ == "__main__":
main()