Python水质预测报错:Input contains NaN等float64不兼容值
解决水质预测程序中的「Input contains NaN, infinity or a value too large for dtype('float64')」错误
问题根源
你确认了训练CSV无NaN,但错误出在预测阶段的输入数据处理:
request.form.get()获取的是字符串类型,而模型训练用的是数值型(float64),直接存入DataFrame会导致类型不匹配,转换时生成NaN- 若表单存在未填写字段,
request.form.get()会返回None,存入DataFrame后直接变为NaN
解决方案
修改app.py的输入处理逻辑,确保所有输入转换为有效数值,同时处理空值/非数值情况:
修改后的代码
@app.route('/predict',methods=['GET', 'POST']) def predict(): prediction1 = "" if request.method == "POST": # 加载模型 clf1 = joblib.load("clfwq.pkl") # 定义辅助函数:处理表单值转float,同时处理空值/非数值 def parse_input(key): val = request.form.get(key) if not val: # 未填写时的默认值,可根据业务需求调整 return 0.0 try: return float(val) except ValueError: # 输入非有效数值时的处理,也可返回错误提示给前端 return 0.0 # 处理所有输入字段 do = parse_input("do") ph = parse_input("ph") orp = parse_input("orp") ec = parse_input("ec") tds = parse_input("tds") temp = parse_input("temp") cdo = parse_input("cdo") cph = parse_input("cph") corp = parse_input("corp") cec = parse_input("cec") ctds = parse_input("ctds") cwt = parse_input("cwt") # 构建数值型DataFrame X = pd.DataFrame([[do, ph, orp, ec, tds, temp, cdo, cph, corp, cec, ctds, cwt ]], columns = ["Do", "pH", "ORP", "EC", "TDS", "Water_Temp", "CDO","CpH","CORP", "CEC", "CTDS","CWT"]) # 调试可选:打印X的内容和类型,确认无NaN # print(X) # print(X.dtypes) # 执行预测 prediction1 = clf1.predict(X)[0] return render_template("classify.html", output = prediction1)
额外优化建议
- 前端校验:在表单页面添加输入规则,强制用户填写所有字段且输入为数值,从源头减少无效请求
- 错误反馈:若遇到无效输入,可在后端捕获异常,向前端返回明确的错误提示(比如“请输入有效的数值”)
- 训练数据校验:在
model.py中添加print(X1.dtypes),确认训练数据的字段类型均为数值型,避免后续类型不匹配
内容的提问来源于stack exchange,提问作者Aiman Azmi
相关产品推荐
相关产品推荐

