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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:10:57