10. Hugging Face API deployment
We also deployed the tuned XGBoost in Hugging Face and created a Streamlit API to generate predictions for individual transactions.
10.1 Generating the app
Since I had already trained and registered the XGBoost pipeline in Databricks, I just logged the trained pipeline to the MLFlow registry and loaded it in a Hugging Face Space backed by a Git repository via MLFlow.
Specifically, We used the following app.py and Dockerfile.
Click to expand/hide Hugging Face app.py code
```python import streamlit as st import mlflow.sklearn import pandas as pd # Load model once (update model_uri accordingly) model_uri = "./my_model" #"models:/workspace.default.fraud_detection_pipeline_model/1" model = mlflow.sklearn.load_model(model_uri) st.title("Fraud Detection Model Interface") st.write("Enter transaction details below to get a fraud prediction:") # Input fields matching your TransactionFeatures schema TX_AMOUNT = st.number_input("Transaction Amount", min_value=0.0) TX_DURING_WEEKEND = st.selectbox("Transaction During Weekend?", [0, 1]) TX_DURING_NIGHT = st.selectbox("Transaction During Night?", [0, 1]) Cust_Nb_Tx_1Day = st.number_input("Customer Number of Transactions in Last 1 Day", min_value=0) Cust_Avg_Amt_1Day = st.number_input("Customer Avg Amount Last 1 Day", min_value=0.0) Cust_Nb_Tx_7Day = st.number_input("Customer Number of Transactions in Last 7 Days", min_value=0) Cust_Avg_Amt_7Day = st.number_input("Customer Avg Amount Last 7 Days", min_value=0.0) Cust_Nb_Tx_30Day = st.number_input("Customer Number of Transactions in Last 30 Days", min_value=0) Cust_Avg_Amt_30Day = st.number_input("Customer Avg Amount Last 30 Days", min_value=0.0) Term_Nb_Tx_1Day = st.number_input("Terminal Number of Transactions in Last 1 Day", min_value=0) Term_Risk_1Day = st.number_input("Terminal Risk Level Last 1 Day", min_value=0) Term_Nb_Tx_7Day = st.number_input("Terminal Number of Transactions in Last 7 Days", min_value=0) Term_Risk_7Day = st.number_input("Terminal Risk Level Last 7 Days", min_value=0) Term_Nb_Tx_30Day = st.number_input("Terminal Number of Transactions in Last 30 Days", min_value=0) Term_Risk_30Day = st.number_input("Terminal Risk Level Last 30 Days", min_value=0) if st.button("Predict Fraud"): input_dict = { "TX_AMOUNT": TX_AMOUNT, "TX_DURING_WEEKEND": TX_DURING_WEEKEND, "TX_DURING_NIGHT": TX_DURING_NIGHT, "Cust_Nb_Tx_1Day": Cust_Nb_Tx_1Day, "Cust_Avg_Amt_1Day": Cust_Avg_Amt_1Day, "Cust_Nb_Tx_7Day": Cust_Nb_Tx_7Day, "Cust_Avg_Amt_7Day": Cust_Avg_Amt_7Day, "Cust_Nb_Tx_30Day": Cust_Nb_Tx_30Day, "Cust_Avg_Amt_30Day": Cust_Avg_Amt_30Day, "Term_Nb_Tx_1Day": Term_Nb_Tx_1Day, "Term_Risk_1Day": Term_Risk_1Day, "Term_Nb_Tx_7Day": Term_Nb_Tx_7Day, "Term_Risk_7Day": Term_Risk_7Day, "Term_Nb_Tx_30Day": Term_Nb_Tx_30Day, "Term_Risk_30Day": Term_Risk_30Day, } input_df = pd.DataFrame([input_dict]) prediction = model.predict(input_df)[0] proba = model.predict_proba(input_df)[0, 1] # Probability of class 1 (fraud) # st.success(f"Fraud Prediction: {'Fraudulent' if prediction == 1 else 'Legitimate'}") st.write(f"Probability of fraud: {proba:.2%}") ```
Click to expand/hide Hugging Face Dockerfile instructions
```Dockerfile # Use official Python 3.9 base image FROM python:3.9 # Add non-root user for permissions compliance in HF Spaces RUN useradd -m -u 1000 user # Set working directory WORKDIR /app # Copy requirements.txt separately for Docker cache efficiency COPY --chown=user ./requirements.txt requirements.txt # Install dependencies including streamlit and mlflow (add to your requirements.txt if missing) RUN pip install --no-cache-dir --upgrade -r requirements.txt # Copy all app code COPY --chown=user . /app # Fix permissions RUN mkdir -p /app/mlruns && chown -R user:user /app/mlruns # Use non-root user USER user # Set environment variables for user path and app caches ENV HOME=/home/user \ PATH=/home/user/.local/bin:$PATH \ STREAMLIT_HOME=/tmp/.streamlit \ HF_HOME=/tmp/huggingface \ STREAMLIT_BROWSER_GATHER_USAGE_STATS=false # Expose Streamlit default port EXPOSE 7860 # Run Streamlit app, binding to all interfaces and port 7860 (HF Spaces uses this port) CMD ["streamlit", "run", "app.py", "--server.port=7860", "--server.address=0.0.0.0"] ```
The Hugging Space app is live at: Hugging Face API
It is a simple Streamlit app where a user can enter values for the features of a transaction and select “Predict Fraud” to see the probability that a transaction with the selected features is fraudulent.
![]() | ![]() |
← Previous: 9. Databricks deployment | Next: Post to come! →</a> |