部署LinearSVC模型遇特征数量不匹配错误,求输入转换方法
问题与解答
问题描述
部署模型时出现以下错误:
ValueError: X has 3 features, but LinearSVC is expecting 64852 features as input
输入数据示例:
data = [[3409, False, 'Lorum Ipsum'], [409, True, 'dolor sit amet consectetuer'], [7869, False, 'Aenean commodo ligula eget dolor']] df = pd.DataFrame(data, columns=['id', 'booleanv', 'text'])
模型训练代码:
import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import LinearSVC from sklearn.metrics import accuracy_score from sklearn.metrics import confusion_matrix from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer df = pd.read_csv('cleandata.csv') # Split dataset into training and validation set train_size = int(df.shape[0] * 0.8) train_df = df[:train_size] val_df = df[train_size:] # split text and labels X_train = train_df.text.to_numpy() Y_train = train_df.booleanv.to_numpy() X_test = val_df.text.to_numpy() Y_test = val_df.booleanv.to_numpy() tfidf = TfidfVectorizer(ngram_range=(1,1)) X_train_tf = tfidf.fit_transform(X_train) X_test_tf = tfidf.transform(X_test) model1 = LinearSVC(random_state=0, tol=1e-5) model1.fit(X_train_tf, Y_train) import pickle pickle.dump(model1, open('classification.pickle','wb')) pickle.dump(tfidf, open('vectorizer.pickle','wb'))
疑问:X_train与X_test均为数组,API输入为JSON格式,怀疑需要对输入进行转换,该判断是否正确?若正确,该如何操作?
解决方案
你的判断完全正确。
原因
训练过程中,你仅使用了数据集的text字段作为特征输入,并且通过TfidfVectorizer将文本转换成了64852维的TF-IDF特征向量。但部署时你直接传入了包含id、booleanv、text三个字段的原始数据,模型自然无法匹配特征维度,因此报错。
具体操作步骤
- 加载预保存的模型与转换器:先加载训练时保存的
classification.pickle模型和vectorizer.pickleTF-IDF转换器。 - 解析输入并提取特征字段:从API传入的JSON数据中,只提取
text字段(这是模型训练时唯一使用的特征)。 - 转换特征格式:用加载好的TF-IDF转换器对提取出的文本执行
transform操作,转换成模型需要的高维特征矩阵。 - 执行预测:将转换后的特征传入模型进行预测。
- 返回结果:整理预测结果并返回给API调用方。
代码示例
以下是一个基于Flask的API处理示例:
from flask import Flask, request, jsonify import pickle app = Flask(__name__) # 加载模型和转换器 model = pickle.load(open('classification.pickle', 'rb')) tfidf = pickle.load(open('vectorizer.pickle', 'rb')) @app.route('/predict', methods=['POST']) def predict(): # 解析JSON输入 input_data = request.get_json() # 提取text字段 texts = [item['text'] for item in input_data['data']] # 转换为模型需要的特征格式 transformed_features = tfidf.transform(texts) # 预测 predictions = model.predict(transformed_features) # 整理结果 result = [] for idx, pred in enumerate(predictions): result.append({ 'id': input_data['data'][idx]['id'], 'predicted_booleanv': bool(pred) }) return jsonify({'predictions': result}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
单条数据输入的处理示例:
# 示例单条JSON输入 input_json = {"id": 3409, "booleanv": False, "text": "Lorum Ipsum"} # 提取文本 text = [input_json['text']] # 转换特征 X_input = tfidf.transform(text) # 预测 prediction = model.predict(X_input)[0]
内容的提问来源于stack exchange,提问作者EvitaSchaap
相关产品推荐
相关产品推荐

