如何让文本分类模型主动过拟合?附过拟合示例构建方法
直观展示模型过拟合与泛化失效的实验分享
最近我特意设计了一个实验,用来演示模型在测试集上表现优异,但完全没法适配未来新数据的过拟合场景,步骤和结果如下:
数据集拆分
我把手头的新闻文本数据集拆成了三个独立集合:
- 训练集:用来训练模型基础能力
- 测试集:用来做参数调优的参考(故意没做交叉验证,就是为了制造过拟合)
- 未来验证集:专门模拟“完全没见过的新数据”,用来检验模型泛化能力
模型与参数调优流程
- 用
CountVectorizer完成文本到数值特征的转换,这是文本分类的基础步骤 - 搭配
LogisticRegression做分类任务,然后用无交叉验证的网格搜索来调参:- 针对
CountVectorizer,搜索min_df(忽略出现频次过低的词)、max_df(忽略出现频次过高的词)等参数 - 针对
LogisticRegression,搜索C(正则化强度)、fit_intercept(是否拟合截距)、tol(收敛阈值)等参数
- 针对
实验结果:过拟合的典型表现
网格搜索结束后,我得到了一组在测试集上得分极高的参数组合,看起来模型性能完美。但当我把这个“最优模型”放到未来验证集上运行时,得分直接暴跌——和测试集的表现差了好几个档次,完全暴露了它过拟合的问题:模型只是记住了测试集里的特定模式和噪声,根本没学到文本数据的通用规律,自然没法应对真正的新数据。
背后的原因
问题就出在无交叉验证的网格搜索上:这种调参方式相当于把测试集当成了训练的一部分,反复根据测试集的表现调整参数,模型逐渐“适配”了测试集的特有属性,而不是学习泛化能力。这也是很多新手容易踩的坑:只看测试集得分,忽略了真正的泛化能力检验。
内容的提问来源于stack exchange,提问作者rolele
相关产品推荐
相关产品推荐

