You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask鱼类预测程序报错:X无有效特征名但模型拟合含特征名

解决Flask部署鱼类预测模型的特征名警告问题

遇到的错误提示:

UserWarning: X does not have valid feature names, but LogisticRegression was fitted with feature names

错误根源

  1. 训练代码变量混乱:明明训练的是RandomForestClassifier,结果保存的是未定义的logistic_model,等于存了个不存在的模型;而且警告里提到的LogisticRegression根本没在代码里正确初始化训练。
  2. 预测数据格式不匹配:训练时模型是基于带特征名的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:54:27