使用TfidfVectorizer与LogisticRegression时特征维度不匹配问题求助
问题原因与解决方案
核心原因
你遇到的特征数不匹配问题,本质是用于转换unseen数据的TfidfVectorizer实例,和训练模型时使用的Vectorizer实例不是同一个(或者Vectorizer被重新拟合过)。正常情况下,vectorizer.transform()会严格遵循之前fit()/fit_transform()生成的词汇表,输出和训练数据维度一致的特征矩阵(哪怕unseen数据里没有训练数据的词汇,也会保留所有特征位,值为0)。出现811维特征,说明当前调用transform()的Vectorizer已经被重新拟合,词汇表被替换成了仅包含unseen数据(或其他小数据集)的词汇。
排查与修复步骤
1. 检查Vectorizer是否被意外覆盖
在你的代码中添加两处打印,确认Vectorizer的词汇表大小:
vectorizer = TfidfVectorizer(ngram_range=(1,2)) test_unseen_data = clean_df[clean_df['category']!='other'] clean_df = clean_df[clean_df['category']=='other'] X_features = vectorizer.fit_transform(clean_df['lemmatized_sentence']) print("Fit后的词汇表大小:", len(vectorizer.vocabulary_)) # 应输出22203 y_labels = clean_df['type'] # train 部分代码 # --- 这里检查是否有重新定义vectorizer或调用fit/fit_transform的代码 --- print("Transform前的词汇表大小:", len(vectorizer.vocabulary_)) # 若输出811,说明Vectorizer被重新拟合 unseen_features = vectorizer.transform(test_unseen_data['lemmatized_sentence'])
如果两次打印的数值不一致,说明train部分的代码重新初始化了Vectorizer或调用了fit()/fit_transform(),覆盖了原有的词汇表。
2. 修正代码流程
确保Vectorizer只在训练数据全集(或训练集)上拟合一次,后续所有数据转换都使用同一个Vectorizer实例:
vectorizer = TfidfVectorizer(ngram_range=(1,2)) # 1. 划分unseen数据和训练验证数据 test_unseen_data = clean_df[clean_df['category']!='other'] train_val_data = clean_df[clean_df['category']=='other'] # 2. 仅用训练验证数据拟合Vectorizer,生成词汇表 vectorizer.fit(train_val_data['lemmatized_sentence']) # 3. 转换训练验证数据为特征矩阵 X_train_val = vectorizer.transform(train_val_data['lemmatized_sentence']) y_train_val = train_val_data['type'] # 4. 划分训练集和验证集(用于调参) from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.2, random_state=42) # 5. 训练模型 from sklearn.linear_model import LogisticRegression best_log_regr = LogisticRegression() best_log_regr.fit(X_train, y_train) # 6. 转换unseen数据(使用同一个Vectorizer) unseen_features = vectorizer.transform(test_unseen_data['lemmatized_sentence']) print("unseen特征矩阵形状:", unseen_features.shape) # 应输出(745, 22203) # 7. 预测 y_pred = best_log_regr.predict(unseen_features) y_decision_func = best_log_regr.predict_proba(unseen_features)
3. 额外验证点
- 确认
test_unseen_data['lemmatized_sentence']的预处理逻辑和train_val_data完全一致(比如词形还原、停用词过滤等),避免因数据格式不一致导致的异常。 - 若unseen数据确实和训练数据无任何重叠词汇,转换后的特征矩阵会是全0,但维度仍会保持22203,不会出现维度不匹配的错误。
内容的提问来源于stack exchange,提问作者Yana
相关产品推荐
相关产品推荐

