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

如何让数据集仅保留单个索引列?解决Flask部署MultinomialNB特征不匹配错误

解决MultinomialNB特征数不匹配问题(25 vs 28)

问题根源

训练模型时误将2个多余的索引列当作特征纳入训练集,导致模型学习时期望输入28个特征;但部署Flask时仅传入25个有效业务特征,引发特征数不匹配的ValueError。

解决步骤

  • 清理数据集,移除多余索引列
    用Pandas加载数据集后,删除不需要的索引列,只保留1个目标索引列(或直接不保留索引列,根据业务需求):

    import pandas as pd
    
    # 加载数据集
    df = pd.read_csv("your_dataset.csv")
    # 替换为实际多余的索引列名称,比如'Unnamed: 0'、'extra_index'
    df = df.drop(['Unnamed: 0', 'extra_index'], axis=1)
    # 若需指定某列为索引,执行以下语句(可选)
    df = df.set_index('target_index_col')
    
  • 重新训练模型,确保特征数一致
    分离有效特征和标签列,仅用业务特征训练模型:

    from sklearn.naive_bayes import MultinomialNB
    from sklearn.model_selection import train_test_split
    
    # 替换为实际标签列名称,比如'class_label'
    X = df.drop('class_label', axis=1)
    y = df['class_label']
    
    # 划分训练测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 重新训练模型
    model = MultinomialNB()
    model.fit(X_train, y_train)
    
    # 验证特征数:输出应为(样本数, 25)
    print(X_train.shape)
    
  • Flask部署时保持输入特征匹配
    接口接收数据后,必须保证输入的特征列与训练集的列名、顺序完全一致,不能包含多余索引列:

    from flask import Flask, request, jsonify
    import pandas as pd
    
    app = Flask(__name__)
    # 假设已加载重新训练好的model
    
    @app.route('/predict', methods=['POST'])
    def predict():
        input_data = request.get_json()
        # 用训练集的列名构造输入DataFrame,确保特征匹配
        input_df = pd.DataFrame([input_data], columns=X_train.columns)
        prediction = model.predict(input_df)
        return jsonify({'prediction': str(prediction[0])})
    
    if __name__ == '__main__':
        app.run(debug=True)
    

关键验证

  • 训练前确认X.shape[1]等于25,确保没有多余特征
  • 部署时输入的特征列必须和X_train.columns完全对齐,避免遗漏或新增列

内容的提问来源于stack exchange,提问作者Karthik Bhandary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:46:09