使用TF-IDF+KNN文本分类时遭遇维度不兼容错误求助
解决TF-IDF结合KNN文本分类时的维度不匹配问题
问题场景
用TF-IDF+KNN做文本分类,500条数据按450-50划分训练/测试集。训练流程如下:
- 拟合TF-IDF向量器并保存,转换训练数据为TF-IDF向量
word_vectorizer = TfidfVectorizer( stop_words='english', strip_accents='unicode', token_pattern=r'\w{1,}', analyzer='word', ngram_range=(1, 1)) word_vectorizer.fit(X_train) vfilename = 'vectorizer.joblib' joblib.dump(word_vectorizer, vfilename) _X_train = word_vectorizer.transform(X_train)
- 训练KNN模型并保存
classifier_algo.fit(_X_train, y_train) filename = f'updated_{classifier_algo}_{class_name}_model.joblib' model_hello = joblib.dump(classifier_algo, filename)
但测试加载向量器和模型后执行y_pred = model_hello.predict(_X_test)时,出现错误:
ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 289402 while Y.shape[1] == 303846
确认测试阶段未在测试集上调用fit,求解决方法。
解决方法
确保向量器与模型是同一轮训练的产物
多次训练后可能出现旧的向量器/模型文件未被覆盖,导致加载的向量器和模型对应的特征维度不匹配。重新执行完整训练流程:先拟合向量器→转换训练数据→训练模型→保存向量器和模型,覆盖旧文件,避免版本混乱。固定数据集划分的随机种子
若划分数据时未设置random_state,每次拆分的训练集内容不同,会导致TF-IDF拟合出的特征数量变化。划分时添加固定随机种子保证数据一致性:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
修正模型文件名,避免命名混乱
模型文件名用f'updated_{classifier_algo}_{class_name}_model.joblib'会导致文件名包含对象信息(如类名、内存地址),容易加载错误的模型文件。改用固定清晰的文件名,比如knn_tfidf_model.joblib,确保加载正确的模型。验证特征维度一致性
在训练阶段打印print("训练集特征维度:", _X_train.shape[1]),测试阶段打印print("测试集特征维度:", _X_test.shape[1]),确认两者维度是否一致。若不一致,说明向量器和模型不配对,需重新生成并保存。
内容的提问来源于stack exchange,提问作者Ujjwal
相关产品推荐
相关产品推荐

