使用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
相关产品推荐
相关产品推荐

