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

使用GridSearchCV训练GaussianNB模型时出现样本数量不一致错误

问题原因

错误提示ValueError: Found input variables with inconsistent numbers of samples: [3, 4263]的核心原因是TfidfVectorizer的输入格式不匹配:

  • TfidfVectorizer默认接收一维数组(每个元素对应单个文本样本),但你传入的X_train是形状为(5329,3)的二维数据(3个文本特征列)。
  • TfidfVectorizer错误地将这3列当成3个"样本"处理,导致输出特征的样本数变为3,和标签集的4263个样本(5折交叉验证的训练集大小)完全不匹配。
修复方案

根据你的数据使用需求,可选择以下两种修复方式:

方式1:合并多列文本为单一列

如果3列都是文本特征且可合并为单个输入,先将多列文本合并成一列:

# 假设X_cbe是DataFrame,按行合并3列文本
X_cbe_combined = X_cbe.apply(lambda row: ' '.join(row.astype(str)), axis=1)
# 重新拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_cbe_combined, y, test_size=0.3, random_state=42)

之后保留原Pipeline结构即可,此时输入为一维文本数组,TfidfVectorizer能正确处理。

方式2:用ColumnTransformer处理多列独立特征

如果需要保留3列的独立Tfidf特征,使用ColumnTransformer分别对每列做向量化再合并:

from sklearn.compose import ColumnTransformer

# 定义预处理流程,对3列分别应用TfidfVectorizer
preprocessor = ColumnTransformer(
    transformers=[
        ('tfidf_col0', TfidfVectorizer(), 0),
        ('tfidf_col1', TfidfVectorizer(), 1),
        ('tfidf_col2', TfidfVectorizer(), 2)
    ])

# 重构Pipeline
pipe_gnb = Pipeline([
    ('preprocessor', preprocessor),
    ('to_dense', DenseTransformer()),
    ('gnb', GaussianNB())
])

# 调整参数网格,对应preprocessor下的子参数
params_gnb = {
    'preprocessor__tfidf_col0__ngram_range': [(1, 1), (1, 2)],
    'preprocessor__tfidf_col0__max_df': [0.25, 0.5],
    # 可根据需求添加其他列的参数配置
}

# 后续GridSearchCV代码保持不变
gs_gnb = GridSearchCV(pipe_gnb, params_gnb, verbose=10, cv=5, n_jobs=-1, scoring='f1', error_score='raise')
gs_gnb.fit(X_train, y_train)
额外注意事项
  • 若你使用的DenseTransformer是自定义转换器(用于将稀疏矩阵转为稠密矩阵适配GaussianNB),需确保它能正确处理ColumnTransformer输出的合并稀疏矩阵。
  • 选择方式2时,参数网格必须遵循preprocessor__[转换器名称]__[参数名]的格式,否则GridSearch无法识别参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:22:01