Flask鱼类预测程序报错:X无有效特征名但模型拟合含特征名
解决Flask部署鱼类预测模型的特征名警告问题
遇到的错误提示:
UserWarning: X does not have valid feature names, but LogisticRegression was fitted with feature names
错误根源
- 训练代码变量混乱:明明训练的是RandomForestClassifier,结果保存的是未定义的
logistic_model,等于存了个不存在的模型;而且警告里提到的LogisticRegression根本没在代码里正确初始化训练。 - 预测数据格式不匹配:训练时模型是基于带特征名的DataFrame训练的,但部署时传的是numpy数组,模型识别不出特征名,因此抛出警告。
修正步骤
1. 重新训练并保存正确模型
统一训练代码里的变量,确保保存的是实际训练好的随机森林模型:
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score import pickle # 加载数据集 df = pd.read_csv('Fish.csv') X = df.drop('Species', axis=1) y = df['Species'] # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 训练随机森林模型 random_model = RandomForestClassifier() random_model.fit(X_train, y_train) # 查看模型准确率 y_pred = random_model.predict(X_test) print(f"模型准确率: {accuracy_score(y_test, y_pred):.2f}") # 保存模型 with open("model.pkl", "wb") as f: pickle.dump(random_model, f) # 测试预测(用和训练一致的格式) test_df = pd.DataFrame([[242.0,23.2,25.4,30.0,11.5200,4.0200]], columns=X.columns) print(random_model.predict(test_df))
2. 修改Flask代码,传入带特征名的数据
把表单输入转换成带特征名的DataFrame,和训练时的特征顺序、名称完全匹配:
import numpy as np import pickle import pandas as pd from flask import Flask, request, render_template app = Flask(__name__) # 加载正确的模型 with open("model.pkl", "rb") as f: random_model = pickle.load(f) # 特征名必须和训练集X的列名完全一致 FEATURE_NAMES = ['Weight', 'Length1', 'Length2', 'Length3', 'Height', 'Width'] @app.route('/') def home(): return render_template('index.html') @app.route('/predict', methods=["POST"]) def predict(): # 获取表单输入并转成数值类型 input_vals = [float(val) for val in request.form.values()] # 包装成带特征名的DataFrame input_df = pd.DataFrame([input_vals], columns=FEATURE_NAMES) # 预测并返回结果 pred = random_model.predict(input_df)[0] return render_template('index.html', prediction_text=f'该鱼的品种是:{pred}') if __name__ == '__main__': app.run(debug=True)
注意事项
- 表单输入的顺序必须和
FEATURE_NAMES的顺序完全对应,否则预测结果会出错。 - 建议前端加输入校验,确保输入内容是数值类型,避免转换失败报错。
内容的提问来源于stack exchange,提问作者Wfee
相关产品推荐
相关产品推荐

