Flask搭建KNN前列腺癌预测网站固定输出恶性结果问题
问题根因及修复方案
固定输出恶性结果的问题由以下几个常见bug导致,按优先级排查修复即可:
- 预测结果类型不匹配,模板判断逻辑失效
model.predict()返回的是shape为(1,)的numpy数组(格式类似np.array([1])),不是Python原生整数类型。Jinja2模板在对numpy数组和整数做==判断时存在类型兼容问题,会出现固定命中某一分支、或两个判断分支都不触发的异常。
修复方式:提取预测结果的标量值转为原生整数后再传入模板,将接口中对应代码修改为:my_prediction = int(model.predict(mypred)[0]) - KNN模型缺失特征标准化步骤,距离计算完全失真
KNN算法依赖欧氏距离判断样本相似度,你传入的特征量级差异极大:perimeter、area的数值通常在几十到上千区间,而smoothness、fractal_dimension等特征取值仅在0~1的小数区间,大数值特征会完全主导距离计算结果,导致模型预测逻辑彻底失效,输出结果和输入特征无关联。
修复方式:训练阶段使用StandardScaler对训练集特征做标准化,预测阶段必须使用训练集拟合好的同一个scaler对输入特征做转换,绝对不能在预测接口中重新拟合scaler,否则会造成数据泄露,参考实现:# 以下逻辑在模型训练阶段执行,不要放到预测接口中 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_processed = scaler.fit_transform(X_train) model.fit(X_train_processed, y_train) # 预测接口内的特征处理逻辑 mypred = np.array([[rad, tex, par, area, smooth, compact,symme, frac]]) mypred_processed = scaler.transform(mypred) my_prediction = int(model.predict(mypred_processed)[0]) - 标签映射逻辑与数据集定义不匹配
公开医疗细胞分类数据集的标签定义没有统一标准,部分数据集以0标记恶性、1标记良性,也有部分定义相反。取训练集中已知类别的样本单独跑预测,确认模型输出值对应的实际类别,再调整模板中的判断条件即可。
内容的提问来源于stack exchange,提问作者Devika
相关产品推荐
相关产品推荐

