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

使用DictVectorizer时MultinomialNB出现维度不匹配错误求助

解决MultinomialNB分类时的Dimension Mismatch错误

我碰到过不少开发者在用MultinomialNB结合DictVectorizer做分类时遇到这个维度不匹配的错误,结合你给出的代码片段,大概率是这几个环节出了问题,咱们一步步排查:

1. 先排查最常见的问题:特征与标签的样本数不匹配

你的training_data是由(特征字典, 类别标签)组成的列表,但拆分X和y的代码没写完(X, y = list...),如果拆分逻辑出错,很容易导致X的样本数和y的样本数不一致。

修正后的拆分方式:

# 正确拆分特征和标签
X = [item[0] for item in training_data]
y = [item[1] for item in training_data]

# 先做个断言检查,确保两者数量一致
assert len(X) == len(y), "特征和标签的样本数不匹配,请检查training_data的生成逻辑!"

另外,也得确认raw_data里有没有缺失的text或category字段,缺失值会导致training_data的元素不完整,进而影响样本数:

# 检查原始数据的缺失情况
print(raw_data.isnull().sum())
# 过滤掉有缺失的行
raw_data = raw_data.dropna(subset=['text', 'category'])

2. 检查DictVectorizer的使用是否规范

DictVectorizer需要先拟合训练数据,再转换(如果是测试数据只能用transform,不能再fit_transform),否则会导致特征维度不一致。

正确的特征向量化流程:

from sklearn.feature_extraction import DictVectorizer

# 初始化向量器
vec = DictVectorizer()
# 拟合训练数据并转换为特征矩阵
X_vec = vec.fit_transform(X)

# 打印特征矩阵的形状,确认样本数和特征数
print(f"特征矩阵形状:{X_vec.shape}")
print(f"标签数量:{len(y)}")

3. LabelEncoder的转换要确保与特征样本数一致

LabelEncoder处理后的标签必须是一维数组,且长度和特征矩阵的行数完全一致:

from sklearn.preprocessing import LabelEncoder
from sklearn.naive_bayes import MultinomialNB

# 初始化标签编码器
le = LabelEncoder()
y_encoded = le.fit_transform(y)

# 再次断言检查维度匹配
assert X_vec.shape[0] == y_encoded.shape[0], "特征矩阵的样本数与编码后的标签数不匹配!"

# 现在可以正常训练模型了
clf = MultinomialNB()
clf.fit(X_vec, y_encoded)

小优化:简化你的词频统计函数

你自己写的tok_freq可以用collections.Counter来简化,既简洁又不容易出错:

from collections import Counter

def tok_freq(inpt):
    return dict(Counter(create_token(inpt)))

总结一下,这个错误90%以上的概率是特征样本数和标签数不一致,或者特征向量化时维度不统一,按照上面的步骤排查和修正,应该就能解决问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:15:16