使用CountVectorizer处理16万条句子触发MemoryError的解决方案咨询
Q1 方案有效性说明及优化建议
你提出的分批转换方案是正确的,核心前提是你已经用全量训练数据完成了CountVectorizer的fit步骤,词表已经固定,后续分批transform得到的特征维度完全一致,不会出现特征对齐的问题。
但有两个可以优化的点:
- 没必要每次仅处理10条数据,你可以根据可用内存调整批次大小,比如单批次处理1000~2000条,效率会高很多
- 如果你后续要训练的是Sklearn框架下的决策树、随机森林等模型,这类模型原生支持稀疏矩阵输入,你完全不需要调用
toarray(),直接把生成的X稀疏矩阵送入模型训练即可,从根源上避免内存不足问题
Q2 特征维度优化方案
在必须使用CountVectorizer的前提下,你可以通过以下方法大幅降低维度,同时保留二元词组的特征信息:
- 调高
min_df阈值:你当前设置min_df=1,会保留所有仅出现过1次的极低频特征,这类特征大多是偶发的无意义词组,几乎没有泛化价值。你可以将阈值调整为35,仅保留在至少35条样本中出现过的特征,通常能直接砍掉50%以上的无效维度,还能降低过拟合风险 - 设置
max_features上限:直接指定最大特征数,比如设置为10000~20000,CountVectorizer会自动保留出现频次最高的Top N个特征,高频的一元/二元词组本身就是对任务更有价值的特征,长尾低频特征对效果提升的贡献极低 - 开启停用词过滤:设置
stop_words='english'过滤掉英文停用词,这类无意义单词组成的二元词组也会同步被过滤,能进一步压缩维度 - 后置特征筛选:如果做完上述优化后维度还是太高,可以额外对接特征选择方法,比如用卡方检验筛选和标签相关性最高的特征,或是用
TruncatedSVD对稀疏矩阵做降维,都能在尽量保留有效信息的前提下降低维度
如果后续要训练神经网络,也可以直接用稀疏张量格式输入,不需要转成稠密数组,目前主流深度学习框架都支持稀疏张量运算,能节省大量内存。
内容的提问来源于stack exchange,提问作者Mahesha999
相关产品推荐
相关产品推荐

