尧图精选

THUCNews中文文本分类数据集实战:从预处理到BERT微调全流程解析

🕒 发布时间:2026/10/2 9:30:49 📁 来源:尧图网络
简介THUCNews中文文本分类数据集是一份面向中文自然语言处理研究者和开发者的实验资源包含84万篇新闻文档、14个新闻类别覆盖时政、财经、体育、科技、教育等广泛领域可用于文本分类模型的训练、测试与算法对比。压缩包共46个文件大小约3.93MB其中27个Python脚本覆盖数据预处理、词典构建、模型训练等环节6个Shell脚本便于一键复现实验另有TSV数据文件、JSON映射与配置、TXT说明以及License和README文档目录结构清晰适合直接搭建实验环境。已有937人学习。资源在数据集基础上集成了多_TextClassifier测试工程包括BERT微调、RNN数据集处理、FastText训练等模块既可复现多模型融合分类实验也可借鉴预处理与调参思路通过该工程可观察不同算法在同一语料上的表现差异为后续优化提供参考对希望掌握中文文本分类完整流程或想对比多个分类器效果的学习者尤其具有实用价值。1. THUCNews 中文文本分类数据集从 84 万篇新闻里挖出的 14 个类别做中文 NLP 的人应该都绕不开 THUCNews。这个数据集由清华大学自然语言处理实验室整理从新浪新闻 2005 到 2011 年的历史数据里筛出了 84 万篇文档统一归成 14 个类别。它不是那种拿来练手的小样本而是能直接支撑文本分类模型训练、验证和对比的完整资源——从传统机器学习里的 TF-IDF LR到深度学习里的 TextCNN、BiLSTM再到 BERT 微调都拿它当基准。适合谁正在做中文文本分类研究的学生、要快速验证模型效果的公司算法工程师、以及想用真实规模数据练手的数据分析师。这类数据集的价值不在于文件本身而在于它帮你把「跑通一个分类流程」的时间从几周压缩到半天。2. 数据集的真实结构先搞清楚 84 万篇文档长什么样2.1 文件构成与类别分布THUCNews 在公开渠道最常见的版本是精简后的cnews系列由原数据集整理而来包含cnews.train.txt、cnews.val.txt、cnews.test.txt三个文件外加一个cnews.vocab.txt词表。训练集 5 万篇、验证集 5000 篇、测试集 1 万篇总计 6.5 万篇——这是社区里流传最广、也最容易直接使用的一份。如果你需要完整的 84 万篇版本可以从 THUNLP 维护的渠道获取文件会大很多但类别体系一致。14 个类别分别是体育、娱乐、家居、房产、教育、时尚、时政、游戏、社会、科技、财经、星座、美食、旅游。单看这串名字就知道它覆盖的是新闻资讯领域的高频话题不是那种学术论文里抽象的领域分类。每个类别下的文档数量不完全均等财经、体育、科技这类内容产出量大的类别文档更多星座、家居这类相对少一些。做实验的时候需要注意这种不平衡。文件内部格式极其简单逐行存储每行是一篇文档体育 中超联赛第16轮 国安2比0击败申花 提前锁定半程冠军...第一列是类别标签后面的文本是经过清洗的新闻正文。这个清洗动作是 THU 在做数据集时的一个重要贡献——原始新浪新闻里充斥着 HTML 标签、JS 代码、广告文本直接拿来训练模型效果会非常差。整理后的文本丢掉了这些干扰基本保留了新闻的标题和正文内容。验证集和测试集的类别分布与训练集一致都是随机抽样而来。做模型评估时可以直接用这个划分不需要自己再重分数据。当然如果你要做交叉验证可以自行合并重分但常规实验建议沿用官方划分方便和其他公开结果对比。2.2 下载后先做的三个检查动作拿到数据集别急着训练先花五分钟做几个检查避免后面翻车。第一步确认文件编码。THU 提供的文件是 UTF-8 编码但某些渠道的转载版可能变成 GBK 或 GB2312。用file命令看一眼file cnews.train.txt # 输出应包含 UTF-8 Unicode text如果不是 UTF-8读入时指定encodinggbk即可但更建议直接转码成 UTF-8 统一处理。第二步统计每个类别的样本数。我一般用 Python 脚本快速扫一遍from collections import Counter label_counts Counter() with open(cnews.train.txt, r, encodingutf-8) as f: for line in f: label line.split(\t)[0] label_counts[label] 1 print(label_counts.most_common())这段代码把每行按制表符分割取第一列作为标签统计全训练集的分布。逻辑很直接但这一步能帮你立刻发现两个问题标签是否有缺失值、某些类别是否少到没法训练。如果某个类别只有几百条那后面做类别加权或者数据增强就得针对它单独考虑。第三步抽样看几行文本内容确认清洗程度。有些搬运版混入了 URL、符号或者「来源新浪新闻」这种尾巴。用下面几行代码抽样查看shuf -n 5 cnews.train.txtshuf -n 5从文件中随机抽 5 行。看到的结果应该是干净的纯文本。如果发现一行里有大量特殊符号堆叠说明这份数据是二手加工过的建议换个源头重新下载别在这种版本上浪费调参时间。2.3 训练集 / 验证集 / 测试集怎么划分才合理官方给的train/val/test比例大约是 5:0.5:1这个划分完全可以按原样用。但有一种情况需要自行重分做模型对比实验时如果你的 baseline 是公开论文里的某个模型而对方用了不同的数据划分那直接对比分数没有意义。这时你需要自己固定一个随机种子重分数据保证所有模型都在同一份训练集和测试集上评估。重分的代码逻辑也不复杂import random from collections import defaultdict random.seed(42) docs_by_label defaultdict(list) with open(cnews.train.txt, r, encodingutf-8) as f: for line in f: parts line.strip().split(\t, maxsplit1) if len(parts) 2: docs_by_label[parts[0]].append(line.strip()) with open(train_80.txt, w, encodingutf-8) as ftrain, \ open(val_10.txt, w, encodingutf-8) as fval, \ open(test_10.txt, w, encodingutf-8) as ftest: for label, docs in docs_by_label.items(): random.shuffle(docs) n len(docs) train_end int(n * 0.8) val_end int(n * 0.9) ftrain.write(\n.join(docs[:train_end]) \n) fval.write(\n.join(docs[train_end:val_end]) \n) ftest.write(\n.join(docs[val_end:]) \n)这段代码按类别分层抽样保证每个类别在三个集合中的占比一致。关键在maxsplit1——如果正文里也出现了制表符只有第一个制表符被当作分隔符正文内部的制表符不会被破坏。这是很多新人在处理这个数据集时容易忽略的细节直接用split(\t)会把正文里的制表符也拆开行数对不上。按比例重分虽然灵活但代价是失去了与其他公开结果的直接可比性。我的习惯是验证模型思路时用自定义划分最终汇报实验效果时回到官方划分。3. 预处理链路从原始文本到模型输入的标准做法3.1 jieba 分词与停用词过滤的必要性中文文本分类与英文的最大差别在于没有天然的空格分隔分词是绕不开的第一步。THUCNews 虽然从标题到正文都是规范新闻语料但分词质量依然直接影响后续特征质量。jieba是中文 NLP 里使用率最高的分词工具自带默认词典支持精确模式和全模式。新闻语料里出现的人名、地名、机构名jieba 的默认词典大多能覆盖。使用代码如下import jieba import re def clean_and_segment(text): text re.sub(r[a-zA-Z0-9], , text) text re.sub(r\s, , text) words jieba.lcut(text) return [w.strip() for w in words if len(w.strip()) 1]这段代码做了两件事先用正则把英文字母和数字剔除因为新闻正文里的英文和人名翻译对新闻分类贡献不大再用jieba.lcut做精确分词返回列表。len(w.strip()) 1过滤掉单字词——单字词在新闻分类里基本是噪声比如「的」「了」「是」。当然这条不是绝对的某些类别比如「房产」里「房」这个字有强区分度但整体来看过滤单字能显著降低特征维度分类效果不会掉。分词完成后可以顺手做一些统计判断语料质量from collections import Counter word_freq Counter() with open(cnews.train.txt, r, encodingutf-8) as f: for line in f: parts line.strip().split(\t, maxsplit1) if len(parts) 2: words clean_and_segment(parts[1]) word_freq.update(words) print(总词数:, sum(word_freq.values())) print(不重复词数:, len(word_freq)) print(最常见的30个词:, word_freq.most_common(30))这类统计能帮你判断要不要额外加自定义词典。比如「区块链」「元宇宙」这类新词如果训练集来自 2011 年以前jieba 的旧版词典根本不认识会被切成「区块」「链」。如果你的任务涉及新概念需要自行维护一个用户词典并加进去jieba.load_userdict(custom_dict.txt)词典每行一个词格式是「词 词频 词性」。停用词表的选择也直接影响效果。哈工大停用词表在新闻语料上表现不错但要注意它会把「不」「没」这类否定词也滤掉。在情感分析类任务里这是致命伤但在 THUCNews 这种主题分类任务里问题不大——「这家公司不赚钱」和「这家公司赚钱」在主题上依然同属财经。如果你拿 THUCNews 做情感细分实验建议保留否定词。3.2 特征表示TF-IDF、Word2Vec 还是直接训模型预处理之后的下一步是决定用哪种特征表示方式。THUCNews 在这个问题上很适合做一次「传统方法 vs 深度方法」的对比因为数据量足够大。TF-IDF 是最经典的特征逻辑是词在当前文档中出现频率越高越重要但这个重要性会被它在整个语料中的出现频率稀释。用scikit-learn的TfidfVectorizer可以直接把分词结果转成稀疏矩阵from sklearn.feature_extraction.text import TfidfVectorizer train_texts [] train_labels [] with open(cnews.train.txt, r, encodingutf-8) as f: for line in f: parts line.strip().split(\t, maxsplit1) if len(parts) 2: train_texts.append(parts[1]) train_labels.append(parts[0]) vectorizer TfidfVectorizer(max_features50000, token_patternr\S) X_train vectorizer.fit_transform(train_texts)max_features50000限制了特征维度防止内存爆掉。token_patternr\S的作用是让 TF-IDF 直接按空白字符切分——前提是文本在上一步已经用空格连接了分词结果。如果你不小心忘了在分词后把词用空格连接这里会变成一整串中文特征提取会失败。Word2Vec 则是把词映射成稠密向量保留语义相近词之间的距离关系。训练一个专属 Word2Vec 模型只需要几行 gensim 代码from gensim.models import Word2Vec tokenized [] with open(cnews.train.txt, r, encodingutf-8) as f: for line in f: parts line.strip().split(\t, maxsplit1) if len(parts) 2: tokenized.append(clean_and_segment(parts[1])) w2v_model Word2Vec(tokenized, vector_size200, window5, min_count2, workers4, epochs5) w2v_model.save(thucnews_w2v.model)这里的vector_size200是词向量维度window5指上下文窗口大小min_count2过滤掉出现次数小于 2 的稀有词。训练完成后每个词就有了一组 200 维的数字表示下游分类模型可以拿它做 embedding 层的初始化。实际使用中window从 3 到 10 都可能影响结果但min_count设太大会丢掉长尾但可能有区分度的词设太小又会让低质量向量混进来需要根据词频统计结果权衡。3.3 序列化注意力文本长度怎么截断THUCNews 的文档长度分布跨度很大。标题可能只有十几个字符但正文可能上千字。深度学习模型无法处理变长输入需要统一的截断策略。常见做法是先统计语料长度分布再定截断阈值。我一般跑一段快速分位数统计import numpy as np seq_lengths [] with open(cnews.train.txt, r, encodingutf-8) as f: for line in f: parts line.strip().split(\t, maxsplit1) if len(parts) 2: seq_lengths.append(len(clean_and_segment(parts[1]))) seq_lengths np.array(seq_lengths) print(中位数:, np.median(seq_lengths)) print(90分位:, np.percentile(seq_lengths, 90)) print(95分位:, np.percentile(seq_lengths, 95)) print(99分位:, np.percentile(seq_lengths, 99))我处理 THUCNews 时的经验是90 分位在 800 词左右95 分位在 1200 词左右。截断长度设为 600 到 800 词比较合适——超过 800 词的文档占比很小硬塞进去只会增加计算量不会显著提升分类性能。确定截断长度后在预处理阶段把所有序列统一 pad 到固定长度from tensorflow.keras.preprocessing.sequence import pad_sequences def encode_and_pad(texts, tokenizer, max_len800): sequences tokenizer.texts_to_sequences(texts) return pad_sequences(sequences, maxlenmax_len, paddingpost, truncatingpost)paddingpost表示在序列末尾补零truncatingpost表示从末尾截断长文本。从末尾截断意味着新闻正文最后一段可能被丢弃——对新闻分类来说通常没问题核心信息一般在开头。但如果你的任务正好涉及「结论在文末」这种结构那就改成truncatingpre。这也是调参时容易被忽视的一个细节。4. 三种分类模型的选型与实战从 FastText 到 BERT4.1 为什么先跑一个 FastText baseline拿到数据集后第一个模型建议用 FastText。原因很简单它训练极快、参数少、效果不差能帮你快速验证数据链路是否通畅。FastText 的原理是用词向量的平均来代表整个句子再接到一个线性分类器上。它不需要预训练词向量自带 n-gram 特征。训练代码非常轻量from fasttext import train_supervised model train_supervised(cnews.train.txt, lr0.5, epoch25, wordNgrams2, dim200, losssoftmax) model.save_model(thucnews_fasttext.bin)注意这里的lr0.5是学习率FastText 通常需要比深度模型更高的学习率。wordNgrams2让模型额外学习双词组合的特征对短语型新闻标题很有效。dim200是词向量维度。用验证集看效果result model.test(cnews.val.txt) print(准确率:, result[1])如果测试集按官方格式存放标签\t文本model.test会自动解析。第一次跑的时候如果准确率低于 85%问题大概率不在模型而在预处理——回看分词和文本清洗部分。FastText 在 THUCNews 上的 baseline 准确率通常在 90% 上下具体数值会因数据版本不同有浮动。它的意义是给你一个参考线后续模型如果比这条线还低说明模型本身没调好而不是数据集有问题。4.2 TextCNN把卷积核搬到文本序列上TextCNN 是文本分类里最有代表性的深度模型结构简单却非常有效。它把每篇文档当作一个「序列」每个 token 查 embedding 表得到一个向量卷积核在序列维度上滑动提取局部 n-gram 特征最后做全局池化后接 softmax。用 PyTorch 实现一个简单的 TextCNNimport torch import torch.nn as nn class TextCNN(nn.Module): def __init__(self, vocab_size, embed_dim, num_classes, kernel_sizes(3, 4, 5), num_filters128): super().__init__() self.embedding nn.Embedding(vocab_size, embed_dim, padding_idx0) self.convs nn.ModuleList([ nn.Conv1d(embed_dim, num_filters, kernel_sizek) for k in kernel_sizes ]) self.fc nn.Linear(len(kernel_sizes) * num_filters, num_classes) def forward(self, x): x self.embedding(x) # (batch, seq_len, embed_dim) x x.transpose(1, 2) # (batch, embed_dim, seq_len) pooled [] for conv in self.convs: c conv(x) # (batch, num_filters, out_len) p torch.max_pool1d(c, kernel_sizec.size(2)) pooled.append(p.squeeze(2)) out torch.cat(pooled, dim1) return self.fc(out)这段代码定义了三组卷积核大小分别是 3、4、5对应三元组、四元组、五元组的 n-gram 特征。num_filters128表示每组卷积核输出 128 个通道。padding_idx0让 embedding 层的 0 向量不参与更新——因为我们在前面用 0 做了序列 padding这一步很关键否则 padding 位置也会被学习成有意义的信息产生噪声。训练过程中embedding 层有两种选择随机初始化或者用 3.2 节训好的 Word2Vec 做初始化。用 Word2Vec 初始化一般能让模型在训练初期更快收敛最终准确率也会高零点几个百分点。做法是embedding_weights torch.tensor(w2v_model.wv.vectors) model.embedding.weight.data.copy_(embedding_weights)但要注意Word2Vec 词典与 tokenizer 词典需要保持一致否则索引对应不上效果反而更差。一般我在做 Word2Vec 初始化前会先对训练集用同样的Tokenizer建词典再用这个词典去筛 Word2Vec 的向量。4.3 BERT 微调什么时候值得上BERT 系列模型在文本分类上的效果是最顶尖的但训练成本也高。如果 FastText 和 TextCNN 已经能到 93% 以上准确率而你的业务场景对准确性要求极高或者遇到了难以解决的混淆类别再考虑用 BERT。THUCNews 上用 BERT 微调有几个实际决策点。第一个是模型选择bert-base-chinese是最常见的起点如果计算资源有限可以上albert-chinese-tiny但效果会掉不少。第二个是文本长度BERT 的输入上限是 512 token而 THUCNews 很多文档远超这个长度需要截断。第三个是学习率微调一般用 2e-5 到 5e-5 之间的低学习率太大容易破坏预训练权重。一段完整的微调代码片段from transformers import BertTokenizer, BertForSequenceClassification from transformers import Trainer, TrainingArguments tokenizer BertTokenizer.from_pretrained(bert-base-chinese) model BertForSequenceClassification.from_pretrained( bert-base-chinese, num_labels14) def encode(examples): return tokenizer(examples[text], truncationTrue, max_length512, paddingTrue) training_args TrainingArguments( output_dir./results, learning_rate2e-5, per_device_train_batch_size16, per_device_eval_batch_size64, num_train_epochs3, evaluation_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, )这里max_length512是硬限制超过的部分会被截断。THUCNews 文本里真正有分类价值的信息大多在前几百字所以这个截断对结果影响不大。per_device_train_batch_size16在单张 16G 显存显卡上刚好跑得动 512 长度的中文序列。num_train_epochs3是我在 THUCNews 上试出来比较合适的轮数再多容易过拟合。BERT 微调还有一个明显的优势不需要分词。如果你前面花了很多时间处理分词问题用 BERT 时可以完全不碰 jieba直接把原始文本送进 tokenizer。中文 BERT 用的是字粒度按字编码。这也是为什么 BERT 在新词识别上表现更好——它不需要依赖词典。5. 实际训练中的避坑记录五个差点让我放弃的问题5.1 标签和文本错位多了一个空行引起的重大事故现象训练时 loss 正常下降但验证集准确率从第 2 个 epoch 开始就不涨了维持在 8% 左右跟随机猜测差不多。检查数据后发现某一行文本缺失标签行被 Python 读成了两个条目。原因下载的数据文件末尾多了一个空行或者某些行的文本里包含换行符\n导致一行被拆成两行。数据文件的解析是按行读取的任何多余或缺失的空行都会让后续所有行的标签和文本错位。解决读取时做行级校验。我后来在这类数据集上强制加了一道防线——读入后立即验证标签是否在合法集合内valid_labels set([体育, 娱乐, 家居, 房产, 教育, 时尚, 时政, 游戏, 社会, 科技, 财经, 星座, 美食, 旅游]) with open(cnews.train.txt, r, encodingutf-8) as f: lines [] for line in f: parts line.strip().split(\t, maxsplit1) if len(parts) ! 2: continue label, text parts if label not in valid_labels or len(text) 10: continue lines.append((label, text))逻辑是先判断分割后是否为两段再验证标签是否合法最后过滤掉过短的文本。这三重检查能拦截住绝大多数脏数据。从那以后我每次处理新数据集都会在数据加载的第一时间跑一遍这个校验而不是等到模型训练出问题才回头找原因。5.2 词表大小与min_count的取舍导致过拟合现象用 Word2Vec 初始化 TextCNN embedding 后训练集准确率很快到 98%验证集只能到 88%过拟合明显。原因min_count设成 1把大量只在训练集出现一次的词也纳入了词表。这些词对应的 Word2Vec 向量训练不充分相当于随机向量模型把它们当噪声记住了无法泛化到验证集。解决把min_count从 1 提高到 3重新训练 Word2Vec。词表大小大概从 12 万降到 6 万embedding 覆盖率从 84% 提升到 92%验证集准确率提升到 91%。这个参数的调整代价很小收益却很直接。5.3 验证集上的侥幸换种子后结果崩了现象同一个模型在固定验证集上跑改了random.seed后准确率波动超过 2 个百分点。一开始以为模型不稳定后来发现是验证集划分本身就不均衡。原因THUCNews 提供的验证集是按时间顺序抽样的早期新闻和晚期新闻在话题分布上有差异。验证集太小5000 篇时单次抽样结果受随机性影响大。解决用 5 折交叉验证。把训练集和验证集合并按类别分层做 5 折报告平均值和标准差。这样得到的结果比单次划分更可信。代码在 2.3 节的分层重分基础上扩展即可每折用 4/5 训练、1/5 验证循环 5 次。5.4 BERT 训练到一半显存爆掉现象bert-base-chinese微调时设置max_length512、batch_size32跑到第 10 个 step 直接报CUDA out of memory。原因512 长度的中文序列每个 token 在 BERT 里会产生 12 层 × 768 维的中间激活值显存消耗远超同长度的 TextCNN。batch_size32在 16G 显存上根本没有余量。解决先按 4.3 节的配置batch_size16跑通然后用混合精度训练。加一个参数即可training_args TrainingArguments( fp16True, # 混合精度训练显存占用约减半 # ... )fp16True让部分张量使用半精度存储和计算显存占用能降 40% 左右。如果还爆就把max_length降到 256——THUCNews 前 256 个字的信息量已经能支撑 90% 的分类准确率代价只是损失少量长文档的尾部内容。5.5 类不平衡被忽视小类别全被大类别吃掉现象星座、家居类别准确率只有 40%财经、科技都在 95% 以上。混淆矩阵显示星座的样本大量被预测为娱乐和社会。原因训练集中星座样本只有几千篇财经和科技各有几万篇。模型学到的是整体分布多数类别的梯度占主导少数类别被压制。解决在nn.CrossEntropyLoss里传入类别权重权重与样本数成反比from sklearn.utils.class_weight import compute_class_weight class_weights compute_class_weight( class_weightbalanced, classesnp.array(sorted(label_set)), ynp.array(all_labels) ) loss_fn nn.CrossEntropyLoss(weighttorch.tensor(class_weights, dtypetorch.float32))compute_class_weight自动按样本倒数归一化权重。用了这个方案后星座类别的 F1 从 0.4 提升到 0.72整体准确率从 90.1% 微升到 90.4%。代价是财经和科技这类大类别准确率掉了 0.5 个百分点但整体 F1 是明显提升的。类别权重不是万能药如果你的任务更看重整体准确率而不是各类别均衡可以考虑不加。6. 把结果做实混淆矩阵、样本级错误分析与阈值校准模型训练完拿到准确率只是第一步真正让结果有价值的是解释误差的来源。我习惯在测试集上做一次完整的错误分析输出的产物是一张混淆矩阵加一份错误样本清单。混淆矩阵直接揭示类别之间的混淆模式from sklearn.metrics import confusion_matrix, classification_report import seaborn as sns import matplotlib.pyplot as plt y_true [] y_pred [] # 遍历测试集做预测略去加载模型的代码 # y_true 和 y_pred 分别为真实标签列表和预测标签列表 cm confusion_matrix(y_true, y_pred, labelssorted(set(y_true))) sns.heatmap(cm, annotTrue, fmtd, xticklabelssorted(set(y_true)), yticklabelssorted(set(y_true))) plt.show() print(classification_report(y_true, y_pred))classification_report会输出每一类的准确率、召回率、F1 值。重点看哪些类别的 F1 低于整体水平。在 THUCNews 上「时尚」和「娱乐」之间、「家居」和「房产」之间、「时政」和「社会」之间是常见的混淆对因为它们在主题内容上确实有重叠。如果某个类别准确率低但训练样本并不少说明类别边界定义本身不够清晰这时候单纯加数据不一定有用可能需要调整标签体系。样本级错误分析更直观把预测错误的样本打印出来逐条看。我一般抽样显示 20 条# 假设 test_predictions.tsv 是预测结果格式为真实标签\t预测标签\t文本 awk -F\t $1 ! $2 {print $0} test_predictions.tsv | head -20用awk按制表符切分筛选出真实标签不等于预测标签的行取前 20 条。逐条看你会发现很多错误是「合理错误」——比如一篇写明星穿搭的新闻同时涉及时尚和娱乐人类标注者也可能给不同标签。这种错误对模型来说几乎不可能通过调参解决因为标签本身就不是互斥的。如果模型输出的是概率而非硬标签还可以做阈值校准。有些新闻置信度只有 0.35但被强制分到了概率最大的类。此时可以给分类器设置一个置信度阈值低于阈值的样本标记为「待人工审核」probabilities model.predict_proba(texts) # 每行是各类别概率 max_probs probabilities.max(axis1) low_confidence_mask max_probs 0.7 print(f{low_confidence_mask.sum()} 条样本置信度低于 0.7需人工处理)这个做法在实际业务场景里很有用它把模型的确定性显式暴露出来而不是让机器硬着头皮做一个低置信度决策。在学术实验中一般不常用因为评估指标默认要求每个样本都必须有预测结果。最后说一个我自己的习惯从那次标签错位事故之后我建立起了一个固定的数据验收流程——下载数据后先跑完整性校验、再跑分布统计、再抽样看内容全过了才允许自己进入模型训练阶段。说白了文本分类项目里 80% 的翻车都不是模型的问题而是数据从源头就埋了雷。这个流程花不了十分钟但它确实避免了好几次白训。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →