CountVectorizer拟合训练+测试集防漏词,如何拆分得维度一致的X_train、X_test
实现方法
你要保证训练集和测试集特征维度一致的核心是共用同一个已经拟合好的CountVectorizer实例,有两种实现方案:
方案1:更稳妥的分步实现(推荐,不易出错)
不需要手动拆分特征矩阵,先拟合全量词汇表,再分别转换训练、测试集:
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd vectorizer = CountVectorizer(encoding='str', stop_words="english", analyzer='word') # 合并所有评论文本拟合词汇表 all_reviews = pd.concat([imdb_dataset_train['review'], reviews_test['review']]) vectorizer.fit(all_reviews) # 分别转换训练集和测试集 X_train = vectorizer.transform(imdb_dataset_train['review']) X_test = vectorizer.transform(reviews_test['review'])
该方式自动保证二者特征维度完全一致,X_train.shape[1]和X_test.shape[1]必然相等。
方案2:在你现有代码基础上修正
你现有代码存在一个小错误:执行df_union = df_union['review']后,df_union已经是单列的Series,后续再取df_union['review']会报错。同时你只需要记录训练集的行数,按行拆分特征矩阵即可:
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd vectorizer = CountVectorizer(encoding='str', stop_words="english", analyzer='word') # 先记录训练集的样本数量 train_sample_num = len(imdb_dataset_train) # 合并数据集 df_union = pd.concat([imdb_dataset_train,reviews_test]) all_reviews = df_union['review'] X = vectorizer.fit_transform(all_reviews) # 按顺序拆分,前train_sample_num行是训练集特征,剩余是测试集特征 X_train = X[:train_sample_num] X_test = X[train_sample_num:]
数据集参考


内容的提问来源于stack exchange,提问作者ghxk
相关产品推荐
相关产品推荐

