UCS2014 commited on
Commit
155da84
·
verified ·
1 Parent(s): 7503855

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +17 -8
app.py CHANGED
@@ -15,7 +15,7 @@ import matplotlib.pyplot as plt
15
  from matplotlib.ticker import FuncFormatter
16
 
17
  import plotly.graph_objects as go
18
- from sklearn.metrics import mean_squared_error, mean_absolute_error
19
 
20
  # =========================
21
  # Constants (Ts variant)
@@ -135,6 +135,13 @@ def pearson_r(y_true, y_pred) -> float:
135
  if np.all(a == a[0]) or np.all(p == p[0]): return float("nan")
136
  return float(np.corrcoef(a, p)[0, 1])
137
 
 
 
 
 
 
 
 
138
  @st.cache_resource(show_spinner=False)
139
  def load_model(model_path: str):
140
  return joblib.load(model_path)
@@ -730,12 +737,12 @@ if st.session_state.app_step == "dev":
730
  st.session_state.results["m_train"]={
731
  "R": pearson_r(tr[TARGET], tr[PRED_COL]),
732
  "RMSE": rmse(tr[TARGET], tr[PRED_COL]),
733
- "MAE": mean_absolute_error(tr[TARGET], tr[PRED_COL])
734
  }
735
  st.session_state.results["m_test"]={
736
  "R": pearson_r(te[TARGET], te[PRED_COL]),
737
  "RMSE": rmse(te[TARGET], te[PRED_COL]),
738
- "MAE": mean_absolute_error(te[TARGET], te[PRED_COL])
739
  }
740
 
741
  tr_min = tr[FEATURES].min().to_dict(); tr_max = tr[FEATURES].max().to_dict()
@@ -744,12 +751,14 @@ if st.session_state.app_step == "dev":
744
 
745
  def _dev_block(df, m):
746
  c1,c2,c3 = st.columns(3)
747
- c1.metric("R", f"{m['R']:.3f}"); c2.metric("RMSE", f"{m['RMSE']:.2f}"); c3.metric("MAE", f"{m['MAE']:.2f}")
 
 
748
  st.markdown("""
749
  <div style='text-align: left; font-size: 0.8em; color: #6b7280; margin-top: -16px; margin-bottom: 8px;'>
750
  <strong>R:</strong> Pearson Correlation Coefficient<br>
751
  <strong>RMSE:</strong> Root Mean Square Error<br>
752
- <strong>MAE:</strong> Mean Absolute Error
753
  </div>
754
  """, unsafe_allow_html=True)
755
  col_track, col_cross = st.columns([2, 3], gap="large")
@@ -808,7 +817,7 @@ if st.session_state.app_step == "validate":
808
  st.session_state.results["m_val"]={
809
  "R": pearson_r(df[TARGET], df[PRED_COL]),
810
  "RMSE": rmse(df[TARGET], df[PRED_COL]),
811
- "MAE": mean_absolute_error(df[TARGET], df[PRED_COL])
812
  }
813
  st.session_state.results["sv_val"]={"n":len(df), "pred_min":float(df[PRED_COL].min()), "pred_max":float(df[PRED_COL].max()), "oor":oor_pct}
814
  st.session_state.results["oor_tbl"]=tbl
@@ -816,12 +825,12 @@ if st.session_state.app_step == "validate":
816
  if "Validate" in st.session_state.results:
817
  m = st.session_state.results["m_val"]
818
  c1,c2,c3 = st.columns(3)
819
- c1.metric("R", f"{m['R']:.3f}"); c2.metric("RMSE", f"{m['RMSE']:.2f}"); c3.metric("MAE", f"{m['MAE']:.2f}")
820
  st.markdown("""
821
  <div style='text-align: left; font-size: 0.8em; color: #6b7280; margin-top: -16px; margin-bottom: 8px;'>
822
  <strong>R:</strong> Pearson Correlation Coefficient<br>
823
  <strong>RMSE:</strong> Root Mean Square Error<br>
824
- <strong>MAE:</strong> Mean Absolute Error
825
  </div>
826
  """, unsafe_allow_html=True)
827
 
 
15
  from matplotlib.ticker import FuncFormatter
16
 
17
  import plotly.graph_objects as go
18
+ from sklearn.metrics import mean_squared_error
19
 
20
  # =========================
21
  # Constants (Ts variant)
 
135
  if np.all(a == a[0]) or np.all(p == p[0]): return float("nan")
136
  return float(np.corrcoef(a, p)[0, 1])
137
 
138
+ def mape(y_true, y_pred, eps: float = 1e-8) -> float:
139
+ """Mean Absolute Percentage Error in percent; ignores near-zero actuals."""
140
+ a = np.asarray(y_true, dtype=float)
141
+ p = np.asarray(y_pred, dtype=float)
142
+ denom = np.where(np.abs(a) < eps, np.nan, np.abs(a))
143
+ return float(np.nanmean(np.abs(a - p) / denom) * 100.0)
144
+
145
  @st.cache_resource(show_spinner=False)
146
  def load_model(model_path: str):
147
  return joblib.load(model_path)
 
737
  st.session_state.results["m_train"]={
738
  "R": pearson_r(tr[TARGET], tr[PRED_COL]),
739
  "RMSE": rmse(tr[TARGET], tr[PRED_COL]),
740
+ "MAPE": mape(tr[TARGET], tr[PRED_COL])
741
  }
742
  st.session_state.results["m_test"]={
743
  "R": pearson_r(te[TARGET], te[PRED_COL]),
744
  "RMSE": rmse(te[TARGET], te[PRED_COL]),
745
+ "MAPE": mape(te[TARGET], te[PRED_COL])
746
  }
747
 
748
  tr_min = tr[FEATURES].min().to_dict(); tr_max = tr[FEATURES].max().to_dict()
 
751
 
752
  def _dev_block(df, m):
753
  c1,c2,c3 = st.columns(3)
754
+ c1.metric("R", f"{m['R']:.3f}")
755
+ c2.metric("RMSE", f"{m['RMSE']:.2f}")
756
+ c3.metric("MAPE (%)", f"{m['MAPE']:.2f}")
757
  st.markdown("""
758
  <div style='text-align: left; font-size: 0.8em; color: #6b7280; margin-top: -16px; margin-bottom: 8px;'>
759
  <strong>R:</strong> Pearson Correlation Coefficient<br>
760
  <strong>RMSE:</strong> Root Mean Square Error<br>
761
+ <strong>MAPE:</strong> Mean Absolute Percentage Error
762
  </div>
763
  """, unsafe_allow_html=True)
764
  col_track, col_cross = st.columns([2, 3], gap="large")
 
817
  st.session_state.results["m_val"]={
818
  "R": pearson_r(df[TARGET], df[PRED_COL]),
819
  "RMSE": rmse(df[TARGET], df[PRED_COL]),
820
+ "MAPE": mape(df[TARGET], df[PRED_COL])
821
  }
822
  st.session_state.results["sv_val"]={"n":len(df), "pred_min":float(df[PRED_COL].min()), "pred_max":float(df[PRED_COL].max()), "oor":oor_pct}
823
  st.session_state.results["oor_tbl"]=tbl
 
825
  if "Validate" in st.session_state.results:
826
  m = st.session_state.results["m_val"]
827
  c1,c2,c3 = st.columns(3)
828
+ c1.metric("R", f"{m['R']:.3f}"); c2.metric("RMSE", f"{m['RMSE']:.2f}"); c3.metric("MAPE (%)", f"{m['MAPE']:.2f}")
829
  st.markdown("""
830
  <div style='text-align: left; font-size: 0.8em; color: #6b7280; margin-top: -16px; margin-bottom: 8px;'>
831
  <strong>R:</strong> Pearson Correlation Coefficient<br>
832
  <strong>RMSE:</strong> Root Mean Square Error<br>
833
+ <strong>MAPE:</strong> Mean Absolute Percentage Error
834
  </div>
835
  """, unsafe_allow_html=True)
836