Streamlit乳腺癌预测应用:滑块调整后预测结果不更新问题
乳腺癌预测Streamlit应用预测结果固定问题排查与解决
核心问题分析
无论调整侧边栏参数,预测结果始终一致,大概率是特征预处理缺失、模型配置问题或特征匹配错误导致,以下是针对性解决方案:
1. 补全训练阶段的特征预处理流程
模型训练时几乎都会对特征做标准化/归一化(如StandardScaler),如果预测时直接传入原始数据,模型无法识别输入差异,输出固定结果。
修改代码:
先基于训练数据计算均值和标准差,对输入数据做同标准的预处理:
# 基于训练特征矩阵计算标准化所需的均值和标准差 scaler_mean = np.mean(X, axis=0) scaler_std = np.std(X, axis=0) def predict_cancer(radius_mean, texture_mean, perimeter_mean,area_mean,smoothness_mean, compactness_mean, concavity_mean): input_data = np.array([[radius_mean, texture_mean, perimeter_mean,area_mean,smoothness_mean, compactness_mean, concavity_mean]]) # 对输入数据做标准化,与训练流程一致 input_data_scaled = (input_data - scaler_mean[:7]) / scaler_std[:7] pred = brCancer_model.predict(input_data_scaled)[0] pred_prob = brCancer_model.predict_proba(input_data_scaled)[0] # 修正医学术语:良性为非癌性,恶性为癌性 if pred == 1: return f"该患者有 {pred_prob[1]*100:.2f}% 的概率为恶性癌症(癌性)。" else: return f"该患者有 {pred_prob[0]*100:.2f}% 的概率为良性肿瘤(非癌性)。"
2. 确保SVM模型启用概率估计
默认情况下,sklearn.svm.SVC的probability参数为False,此时调用predict_proba会用近似算法计算概率,可能导致结果异常甚至固定。
解决步骤:
- 重新训练模型时添加
probability=True参数:
from sklearn.svm import SVC # 训练时启用概率估计 model = SVC(probability=True) model.fit(X_train_scaled, y_train) # 重新保存模型 pickle.dump(model, open("svm_model.sav", "wb"))
- 替换原模型文件后重新运行Streamlit应用。
3. 验证特征顺序与维度匹配
检查features_matrix.npy的特征维度是否与输入的7个参数完全一致:
# 打印训练特征矩阵的形状 print(X.shape)
如果训练时使用了更多特征,需补充对应输入参数;若仅用前7个特征,确保输入顺序与训练时完全一致。
4. 调试输入参数传递
添加调试代码确认滑块值是否正确传递:
if st.sidebar.button("Predict"): # 打印当前输入参数,确认是否随滑块调整变化 st.write("当前输入参数:", radius_mean, texture_mean, perimeter_mean, area_mean, smoothness_mean, compactness_mean, concavity_mean) prediction_result = predict_cancer(radius_mean, texture_mean,perimeter_mean,area_mean,smoothness_mean,compactness_mean,concavity_mean) st.write("预测结果:") st.write(prediction_result)
若参数无变化,需检查Streamlit环境配置;若参数正常变化,问题则集中在模型或预处理环节。
内容的提问来源于stack exchange,提问作者cristante
相关产品推荐
相关产品推荐

