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

部署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三个字段的原始数据,模型自然无法匹配特征维度,因此报错。

具体操作步骤

  1. 加载预保存的模型与转换器:先加载训练时保存的classification.pickle模型和vectorizer.pickleTF-IDF转换器。
  2. 解析输入并提取特征字段:从API传入的JSON数据中,只提取text字段(这是模型训练时唯一使用的特征)。
  3. 转换特征格式:用加载好的TF-IDF转换器对提取出的文本执行transform操作,转换成模型需要的高维特征矩阵。
  4. 执行预测:将转换后的特征传入模型进行预测。
  5. 返回结果:整理预测结果并返回给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:24:28