fasttext的train_supervised函数有无理想参数?如何选择K折交叉验证的K值?
fastText文本分类相关问题解答
1. train_supervised 函数推荐参数
通用基准参数可作为初始调试参考,实际最优值需要匹配你的数据集特性:
lr(学习率):默认基准0.1,短文本分类可上调到0.20.3,长文本、复杂分类任务可下调到0.050.1epoch(训练轮次):小数据集设2030,大数据集设1015即可收敛,避免设太高引发过拟合wordNgrams:普通短文本分类设1即可,依赖短语、语序特征的任务可设为2~3dim(词向量维度):使用预训练向量时和预训练维度对齐即可,无预训练时常规取100、200、300,小数据集优先选低维度减少过拟合loss(损失函数):单标签分类用softmax,多标签分类用ova,大数据量追求训练速度可换用hsminCount:过滤低频词的阈值,小数据集设1,大数据集可设为3~5减少噪声干扰
你通过autotune搜索得到的参数是适配当前任务的最优值,比通用参数优先级更高。你训练得到的最优参数见下图:
2. K折交叉验证的K值选择方法
可以按照数据集规模快速确定取值范围,再通过小范围测试敲定最优值:
- 万条及以上规模数据集:优先选K=5,平衡计算成本和评估结果的稳定性,足够覆盖数据分布特征
- 千条规模的小数据集:优先选K=10,提升单折训练集的占比,降低评估偏差
- 千条以下的极小数据集:可采用留一法(K等于样本总数),不过会大幅提升计算成本
额外参考规则:要保证每一折的测试集都能覆盖所有分类标签,避免出现某一折标签缺失的情况。也可以同时测试K=3、5、10三组值,选择评估结果波动最小的即可。
3. 其他优化建议
除了自动调参、引入预训练向量之外,还可以从以下维度优化效果:
- 预处理优化:先做文本清洗,去掉乱码、特殊符号、无效停用词,中文任务提前做好分词,也可以加入领域自定义词典提升专业词汇的识别效果
- 预训练向量优化:如果你的任务是领域垂直场景,可以先拿领域内的无标注语料对通用预训练向量做增量预训练,再接入分类任务微调,效果会比直接用通用预训练向量好很多
- 数据增强:针对训练数据做同义词替换、非关键词随机删除/插入、回译等操作扩充训练集,降低过拟合风险,提升模型泛化性
- 长尾类别优化:针对分类错误的badcase做统计,对样本量少的长尾类别补充训练数据,或者调整类别权重,提升长尾类别的召回率
- 部署优化:训练完成后可以用fasttext自带的量化功能压缩模型,体积可以缩小到原来的1/10左右,精度几乎不会损失,更适合线上部署
内容的提问来源于stack exchange,提问作者Ugur Selim Ozen
相关产品推荐
相关产品推荐

