拟合sklearn模型时遇样本数不一致错误ValueError: [2,16773]求解
错误原因及解决方案
核心原因
你遇到的ValueError: Found input variables with inconsistent numbers of samples: [2, 16773],本质是**CountVectorizer只能处理一维文本输入**,但你传入的X_train是包含domain和urls两列的二维DataFrame。
CountVectorizer默认会把输入的每一列当作一个样本,所以它会错误地将你的16773行2列数据识别为2个样本,而你的y_train有16773个样本,两者样本数完全不匹配,直接触发错误。
验证逻辑
你可以做个简单测试验证这个问题:
from sklearn.feature_extraction.text import CountVectorizer cv = CountVectorizer() # 传入二维DataFrame,查看输出形状 print(cv.fit_transform(X_train).shape) # 结果会是(2, xxx),而非预期的(16773, xxx)
这就证明CountVectorizer把两列当成了两个样本,而非16773个样本各带两个特征。
解决办法
有两种常用方案:
- 方案1:合并文本特征
把domain和urls两列合并成一列文本,再传入Pipeline:
# 合并训练集和测试集的特征列 X_train['combined_text'] = X_train['domain'] + ' ' + X_train['urls'] X_test['combined_text'] = X_test['domain'] + ' ' + X_test['urls'] # 使用合并后的单列文本作为模型输入 pipeline.fit(X_train['combined_text'], y_train)
- 方案2:分别处理多文本特征
如果想保留两个特征的独立信息,用ColumnTransformer分别对两列做文本向量化,再合并特征:
from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from sklearn.ensemble import RandomForestClassifier # 定义单文本列的处理管道 text_transformer = Pipeline([ ('count', CountVectorizer()), ('tfidf', TfidfTransformer()) ]) # 用ColumnTransformer分别处理两列文本特征 preprocessor = ColumnTransformer([ ('domain_process', text_transformer, 'domain'), ('urls_process', text_transformer, 'urls') ]) # 构建完整的训练管道 full_pipeline = Pipeline([ ('preprocess', preprocessor), ('clf', RandomForestClassifier()) ]) # 拟合模型 full_pipeline.fit(X_train, y_train)
内容的提问来源于stack exchange,提问作者Sharhad
相关产品推荐
相关产品推荐

