如何让数据集仅保留单个索引列?解决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
相关产品推荐
相关产品推荐

