Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -14,7 +14,7 @@ MODEL_PATH = "models/svm_pipeline.joblib"
|
|
14 |
BG_PATH = "data/bg.csv"
|
15 |
|
16 |
# 模型最终需要的 8 个特征(顺序必须与训练一致)
|
17 |
-
FEATURES = ["ALB", "TP", "TBA", "
|
18 |
|
19 |
# 加载模型与背景
|
20 |
pipeline = joblib.load(MODEL_PATH)
|
@@ -52,7 +52,7 @@ def _render_force_plot(base_val: float, shap_1d: np.ndarray, feat_1d: np.ndarray
|
|
52 |
# ——将特征值按需四舍五入,减少标签长度(可根据需要微调每列小数位)
|
53 |
feat = np.asarray(feat_1d, dtype=float).copy()
|
54 |
round_map = {
|
55 |
-
"ALB": 2, "TP": 2, "TBA": 2, "
|
56 |
}
|
57 |
feat_rounded = [
|
58 |
np.round(val, round_map.get(name, 2)) for val, name in zip(feat, fnames)
|
@@ -78,20 +78,20 @@ def _coerce_float(x):
|
|
78 |
return float(x) if x is not None and x != "" else np.nan
|
79 |
|
80 |
|
81 |
-
def predict_and_explain(ALB, TP, TBA,
|
82 |
status = []
|
83 |
try:
|
84 |
# ---- 1) 取数并校验 ----
|
85 |
ALB = _coerce_float(ALB)
|
86 |
TP = _coerce_float(TP)
|
87 |
TBA = _coerce_float(TBA)
|
88 |
-
|
89 |
CREA = _coerce_float(CREA)
|
90 |
LYM = _coerce_float(LYM)
|
91 |
ALP = _coerce_float(ALP)
|
92 |
DBIL = _coerce_float(DBIL)
|
93 |
|
94 |
-
vals = [ALB, TP, TBA,
|
95 |
if any(np.isnan(v) for v in vals):
|
96 |
return None, None, "Error: 所有输入必须为数值且不可缺失。"
|
97 |
|
@@ -106,7 +106,7 @@ def predict_and_explain(ALB, TP, TBA, AST/ALT, CREA, LYM, ALP, DBIL, nsamples=20
|
|
106 |
status.append(f"Derived: PNI={PNI:.1f}, AAPR={AAPR:.3f}")
|
107 |
|
108 |
# ---- 3) 组装最终 8 特征并预测 ----
|
109 |
-
x_row = np.array([[ALB, TP, TBA,
|
110 |
|
111 |
if hasattr(pipeline, "predict_proba"):
|
112 |
classes_ = getattr(pipeline, "classes_", None)
|
@@ -227,4 +227,4 @@ with gr.Blocks() as demo:
|
|
227 |
)
|
228 |
|
229 |
if __name__ == "__main__":
|
230 |
-
demo.launch()
|
|
|
14 |
BG_PATH = "data/bg.csv"
|
15 |
|
16 |
# 模型最终需要的 8 个特征(顺序必须与训练一致)
|
17 |
+
FEATURES = ["ALB", "TP", "TBA", "AST_ALT", "CREA", "PNI", "AAPR", "DBIL"]
|
18 |
|
19 |
# 加载模型与背景
|
20 |
pipeline = joblib.load(MODEL_PATH)
|
|
|
52 |
# ——将特征值按需四舍五入,减少标签长度(可根据需要微调每列小数位)
|
53 |
feat = np.asarray(feat_1d, dtype=float).copy()
|
54 |
round_map = {
|
55 |
+
"ALB": 2, "TP": 2, "TBA": 2, "AST_ALT": 2, "CREA": 1, "PNI": 1, "AAPR": 3, "DBIL": 1
|
56 |
}
|
57 |
feat_rounded = [
|
58 |
np.round(val, round_map.get(name, 2)) for val, name in zip(feat, fnames)
|
|
|
78 |
return float(x) if x is not None and x != "" else np.nan
|
79 |
|
80 |
|
81 |
+
def predict_and_explain(ALB, TP, TBA, AST_ALT, CREA, LYM, ALP, DBIL, nsamples=200):
|
82 |
status = []
|
83 |
try:
|
84 |
# ---- 1) 取数并校验 ----
|
85 |
ALB = _coerce_float(ALB)
|
86 |
TP = _coerce_float(TP)
|
87 |
TBA = _coerce_float(TBA)
|
88 |
+
AST_ALT = _coerce_float(AST_ALT)
|
89 |
CREA = _coerce_float(CREA)
|
90 |
LYM = _coerce_float(LYM)
|
91 |
ALP = _coerce_float(ALP)
|
92 |
DBIL = _coerce_float(DBIL)
|
93 |
|
94 |
+
vals = [ALB, TP, TBA, AST_ALT, CREA, LYM, ALP, DBIL]
|
95 |
if any(np.isnan(v) for v in vals):
|
96 |
return None, None, "Error: 所有输入必须为数值且不可缺失。"
|
97 |
|
|
|
106 |
status.append(f"Derived: PNI={PNI:.1f}, AAPR={AAPR:.3f}")
|
107 |
|
108 |
# ---- 3) 组装最终 8 特征并预测 ----
|
109 |
+
x_row = np.array([[ALB, TP, TBA, AST_ALT, CREA, PNI, AAPR, DBIL]], dtype=np.float64)
|
110 |
|
111 |
if hasattr(pipeline, "predict_proba"):
|
112 |
classes_ = getattr(pipeline, "classes_", None)
|
|
|
227 |
)
|
228 |
|
229 |
if __name__ == "__main__":
|
230 |
+
demo.launch()
|