File size: 4,350 Bytes
6ef41b0
 
 
 
 
 
 
 
 
 
 
 
8193c46
6ef41b0
8193c46
6ef41b0
8193c46
 
 
 
6ef41b0
8193c46
6ef41b0
 
 
 
 
 
 
 
 
 
 
8193c46
6ef41b0
 
 
8193c46
 
 
 
6ef41b0
8193c46
6ef41b0
8193c46
6ef41b0
8193c46
 
6ef41b0
8193c46
 
 
 
 
6ef41b0
 
 
 
8193c46
6ef41b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8193c46
6ef41b0
 
 
 
 
 
8193c46
6ef41b0
 
 
 
 
 
 
 
 
 
 
 
 
 
8193c46
6ef41b0
 
 
 
8193c46
6ef41b0
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import streamlit as st
import numpy as np
import pandas as pd
import os
import joblib
import pickle
try:
    from tensorflow.keras.models import load_model as keras_load_model
    KERAS_AVAILABLE = True
except Exception:
    KERAS_AVAILABLE = False

st.set_page_config(page_title="House Price Predictor (fixed model)", layout="centered")
st.title("๐Ÿ  Simple House Price Predictor")
st.write("This app loads a fixed model file: `house_price_model.h5` and predicts house price from features.")

# -----------------------
# HARD-CODED MODEL PATH
# -----------------------
MODEL_PATH = "house_price_model.h5"  # <-- hard-coded model filename

# Utility: load model from path (supports .h5, .joblib, .pkl)
def load_model_from_path(path):
    """Load model from a local path (joblib/pickle/keras .h5)."""
    ext = os.path.splitext(path)[1].lower()
    if ext in [".joblib", ".pkl"]:
        try:
            return joblib.load(path)
        except Exception:
            with open(path, "rb") as f:
                return pickle.load(f)
    if ext == ".h5":
        if not KERAS_AVAILABLE:
            raise RuntimeError("TensorFlow/Keras not available. Add `tensorflow` to requirements.txt.")
        return keras_load_model(path)
    raise ValueError("Unsupported model extension: " + ext)

# Cached loader so HF/Streamlit won't reload unnecessarily
@st.cache_resource
def load_fixed_model():
    return load_model_from_path(MODEL_PATH)

# Attempt to load the fixed model
model = None
if os.path.exists(MODEL_PATH):
    try:
        model = load_fixed_model()
        st.sidebar.success(f"Loaded model: {MODEL_PATH}")
    except Exception as e:
        st.sidebar.error(f"Failed to load {MODEL_PATH}: {e}")
        model = None
else:
    st.sidebar.warning(f"Model file not found: {MODEL_PATH}")
    st.sidebar.info("Add `house_price_model.h5` to the repo root (or your HF Space files) and re-run the app.")

st.markdown("---")
st.header("Input features")

# Feature inputs (keep these in same order your model expects)
col1, col2 = st.columns(2)
with col1:
    overall_qual = st.slider("Overall Quality (1 - 10)", 1, 10, 6)
    gr_liv_area = st.number_input("Ground living area (sq ft)", min_value=100, max_value=10000, value=1500, step=50)
    garage_cars = st.number_input("Garage capacity (cars)", min_value=0, max_value=10, value=1, step=1)
with col2:
    total_bsmt = st.number_input("Total Basement Area (sq ft)", min_value=0, max_value=10000, value=600, step=50)
    full_bath = st.number_input("Full bathrooms", min_value=0, max_value=10, value=2, step=1)
    year_built = st.number_input("Year Built", min_value=1800, max_value=2050, value=1990, step=1)

st.markdown("**Feature vector preview (in expected model order):**")
input_vector = np.array([overall_qual, gr_liv_area, garage_cars, total_bsmt, full_bath, year_built])
st.write(pd.DataFrame([input_vector], columns=["OverallQual","GrLivArea","GarageCars","TotalBsmtSF","FullBath","YearBuilt"]))

predict_button = st.button("Predict House Price")

def model_predict(model_obj, features_array):
    """Unify prediction call for sklearn-like and keras models."""
    X = np.array(features_array).reshape(1, -1)
    # Try sklearn-like predict first
    try:
        if hasattr(model_obj, "predict") and not (KERAS_AVAILABLE and hasattr(model_obj, "save")):
            preds = model_obj.predict(X)
            if isinstance(preds, (list, np.ndarray)):
                return float(np.squeeze(preds))
            return float(preds)
    except Exception:
        pass

    # Try Keras model
    if KERAS_AVAILABLE:
        try:
            preds = model_obj.predict(X)
            return float(np.squeeze(preds))
        except Exception:
            pass

    raise RuntimeError("Model type not supported for prediction or prediction failed.")

if predict_button:
    if model is None:
        st.error("Model not loaded. Ensure `house_price_model.h5` exists in repo and that `tensorflow` is installed.")
    else:
        try:
            pred = model_predict(model, input_vector)
            st.success(f"Predicted house price: {pred:,.2f} (units same as model target)")
            st.info("If value seems off, ensure model expects these features in this order and any scalers/pipelines are included.")
        except Exception as e:
            st.exception(f"Prediction failed: {e}")