当前位置: 首页 > news >正文

基于 RoBERTa + 多策略优化的中文商品名细粒度分类

基于 RoBERTa + 多策略优化的中文商品名细粒度分类

代码详见:https://github.com/xiaozhou-alt/Products_Name_Classification


文章目录

  • 基于 RoBERTa + 多策略优化的中文商品名细粒度分类
  • 一、项目介绍
  • 二、文件夹结构
  • 三、数据集介绍
  • 四、RoBERTa 模型介绍
    • 1、基础架构与预训练改进
    • 2、Byte-level BPE 分词机制
    • 3、上下文敏感表示学习
    • 4、项目中的微调与分类头设计
    • 5、注意力机制的商品特征聚焦
    • 6、预训练目表
  • 五、项目实现
    • 1. 文本数据增强模块
    • 2. 数据加载与预处理系统
    • 3. 数据集与数据加载器
    • 4. 商品分类模型架构
    • 5. 高级训练策略与工具
    • 6. 模型评估与可视化工具
  • 六、结果展示


一、项目介绍

本项目是一个基于预训练语言模型(BERT/RoBERTa)的中文商品分类系统,旨在实现对商品名称的自动多级标签分类。该系统能够处理复杂的商品命名文本,自动识别商品的一级和二级类别标签,为电商平台、零售系统或商品管理系统提供高效准确的商品分类服务。

系统的核心优势包括:

  • 多级标签分类:同时支持一级和二级标签的分类,提供更细致的商品类别划分
  • 数据增强技术:内置文本增强功能,通过同义词替换和随机交换等方式扩充训练数据,提高模型泛化能力
  • 类别不平衡处理:实现了加权采样器和数据集平衡策略,有效解决商品分类中常见的类别分布不均问题
  • 正则化机制:集成了标签平滑、多级 dropout 和批归一化等技术,显著降低过拟合风险
  • 智能学习率调度:采用余弦退火学习率调度器,配合学习率预热,加速模型收敛并提高性能

二、文件夹结构

Products_Name_Classification/
├── jd-dataset/               # 数据集目录├── fresh/│   ├── sample_train.txt  # 训练数据│   └── sample_test.txt   # 测试数据└── ...                   # 更多类别
├── log/
├── output/├── pic/├── models/└── prediction_errors.csv # 错误预测样本
├── train-improve.py          # 改进后的训练代码
├── train-origin.py           # 原始的训练代码
├── requirements.txt
└── README.md

三、数据集介绍

数据集下载

本项目使用的商品分类数据集包含多个主类别的商品信息,每个商品包含名称和对应的一级、二级标签。

数据集的组织结构如下:

  • 根目录下按主类别划分文件夹digital products + fresh + household appliances
  • 每个主类别文件夹下包含训练集 (sample_train.txt) 和测试集 (sample_test.txt)
  • 数据文件每行格式为:一级标签,一级标签@二级标题,商品名称

数据示例:

大家电,大家电@烘干机,皮谱水果烘干机 虹魅干果机全自动食物烘干机水果蔬菜宠物肉类食品风干机小型家用
个护健康,个护健康@按摩器,安尚按摩枕双开关无线充电电动颈椎肩颈部腰部按摩仪器颈部全身按摩器家车两用按摩靠垫靠背按摩椅 充电八头双键
厨房小电,厨房小电@咖啡机,雀巢多趣酷思(Nescafe Dolce Gusto)京东定制咖啡机超级礼盒 含玫瑰金咖啡机+冷萃&美式醇香胶囊+巴黎水*2

系统在加载数据后会进行以下处理:

  1. 解析文本文件,提取一级标签、二级标签和商品名称
  2. 平衡各主类别的样本数量,避免类别不平衡问题
  3. 从训练集中划分 20%20\%20% 作为验证集,用于监控训练过程
  4. 使用 LabelEncoder 对标签进行编码,转换为模型可处理的数值形式

四、RoBERTa 模型介绍

1、基础架构与预训练改进

RoBERTa(Robustly Optimized BERT Pretraining Approach)是 BERT 模型的优化版本,其核心架构仍基于 Transformer 编码器,但在预训练策略上进行了显著改进。模型采用多层堆叠的 Transformer 编码器块,每个块包含多头自注意力机制和前馈神经网络。

从数学角度看,RoBERTa 的核心计算单元是自注意力机制,对于输入序列中的每个位置i,其输出表示由以下公式计算:

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V

其中 QQQ(查询矩阵)、KKK(键矩阵)、VVV(值矩阵)由输入嵌入通过线性变换得到,dkd_kdk 是注意力头的维度。多头注意力则是将多个自注意力的输出拼接后通过线性变换得到:

MultiHead(Q,K,V)=Concat(head1,...,headh)WOheadi=Attention(QWiQ,KWiK,VWiV)\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O \\ \ \\ \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) MultiHead(Q,K,V)=Concat(head1,...,headh)WO headi=Attention(QWiQ,KWiK,VWiV)

RoBERTa 的主要改进包括:动态掩码机制(每个训练步骤随机生成掩码)、移除下一句预测任务、使用更长的训练序列(512 tokens)和更大的批次大小,这些改进使其能更充分地学习语言规律。

🤓🤓🤓小周有话说
如果把 BERT 比作在固定题库中学习的学生,RoBERTa 就是一位采用更灵活学习策略的优等生。它不再局限于 固定的练习题(静态掩码),而是每次学习都 随机生成新的练习题(动态掩码);不再浪费精力记忆句子顺序(移除下一句预测),而是专注于深入理解更长的文本内容。这种学习方式让 RoBERTa 对语言的理解更加深刻,就像我们通过多种方式反复阅读一篇文章比只读一次能获得更多信息一样。

2、Byte-level BPE 分词机制

RoBERTa 采用 Byte-level BPE(Byte-level Byte Pair Encoding)分词算法,与 BERT 使用的 WordPiece 分词不同,这种机制直接在字节级别操作,能够处理任何 Unicode 字符,无需预先定义词汇表。

分词过程分为 两个阶段:首先将文本拆分为 Unicode 字符序列,然后通过迭代合并最频繁的字符对来构建子词单元。对于中文等表意文字,这种机制能够更好地处理未登录词和复杂词汇组合,分词结果更细粒度。

在项目代码中,通过RobertaTokenizer.from_pretrained(model_name)加载的分词器正是采用这种机制,将商品名称转换为模型可理解的输入序列:

# 代码中分词器的使用
if model_name.startswith('roberta'):tokenizer = RobertaTokenizer.from_pretrained(model_name)

🤓🤓🤓小周有话说
Byte-level BPE 就像一位精通所有语言的 翻译官。对于 "无线蓝牙耳机" 这样的商品名称,传统分词可能会遇到未见过的组合,而 RoBERTa 的分词器会先拆分成最基本的字符单元,再根据上下文和训练经验,将常用组合合并成有意义的 “词语片段”。这就像我们看到陌生的复合词时,会先识别每个字,再根据经验推断整体含义,使得模型即使遇到新品牌或新产品名称,也能准确理解其构成和含义。

3、上下文敏感表示学习

RoBERTa 能够生成上下文敏感的 词向量表示,即同一个词在不同语境下会有不同的向量表示,这通过深层 Transformer 结构实现:
hil=TransformerBlock(hil−1,h1:i−1l−1,hi+1:nl−1)h_i^l = \text{TransformerBlock}(h_i^{l-1}, h_{1:i-1}^{l-1}, h_{i+1:n}^{l-1}) hil=TransformerBlock(hil1,h1:i1l1,hi+1:nl1)
其中 hilh_i^lhil 表示第 lll 层中第 iii 个词的隐藏状态,它不仅依赖于当前词的输入,还依赖于同一层中其他所有词的隐藏状态。这种机制使模型能够捕捉词语在 不同上下文中的语义变化

在项目中,我们通过outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)获取这些上下文表示,并使用[CLS]标记的输出作为整个商品名称的语义摘要:

# 代码中使用RoBERTa的上下文表示
outputs = self.bert(input_ids=input_ids,attention_mask=attention_mask,output_attentions=True
)
cls_output = outputs.pooler_output  # 使用[CLS]标记的输出

🤓🤓🤓小周有话说
上下文敏感表示就像一位细心的观察者。当看到 “苹果” 这个词时,它会根据上下文判断是指水果还是科技公司 —— 在 “我买了一个苹果” 中强调其作为水果的属性,在 “苹果发布了新手机” 中则聚焦于其品牌含义。在我们的商品分类系统中,这意味着模型能区分 “小米手机” 和 “小米粥” 中的 “小米” 是完全不同的概念,从而做出更准确的分类。

4、项目中的微调与分类头设计

在商品分类任务中,我们基于预训练的 RoBERTa 模型进行微调,在其顶部添加自定义的分类层以适应特定任务。模型结构如下:

  1. 底层:预训练的 RoBERTa 模型,负责提取文本的深层 语义特征
  2. 中间层:两个全连接层,配合批归一化和 dropout 防止过拟合
  3. 顶层:两个并行的输出层,分别预测商品的 一级标签二级标签

数学上,分类过程可表示为:

primary_logits=Wp⋅GELU(W2⋅GELU(W1⋅hCLS+b1)+b2)+bpsecondary_logits=Ws⋅GELU(W2⋅GELU(W1⋅hCLS+b1)+b2)+bs\text{primary\_logits} = W_p \cdot \text{GELU}(W_2 \cdot \text{GELU}(W_1 \cdot h_{\text{CLS}} + b_1) + b_2) + b_p \\ \ \\ \text{secondary\_logits} = W_s \cdot \text{GELU}(W_2 \cdot \text{GELU}(W_1 \cdot h_{\text{CLS}} + b_1) + b_2) + b_s primary_logits=WpGELU(W2GELU(W1hCLS+b1)+b2)+bp secondary_logits=WsGELU(W2GELU(W1hCLS+b1)+b2)+bs

其中 hCLSh_{\text{CLS}}hCLS 是 RoBERTa 输出的 [CLS] 标记表示,W1,W2W_1, W_2W1,W2 是中间层权重,Wp,WsW_p, W_sWp,Ws 是分类层权重,GELU\text{GELU}GELU 是激活函数。

🤓🤓🤓小周有话说
如果把预训练的 RoBERTa 比作一位博学的 通用学者,那么微调过程就是让这位学者专门学习商品分类知识。我们保留了它强大的语言理解能力(底层 RoBERTa),再通过额外的 "专业课程"(中间层)帮助它聚焦于商品特征,最后通过 "考试标准"(分类头)让它学会输出符合我们需求的分类结果。这种方式比从头训练一个模型效率高得多,就像一位全科医生通过短期培训就能成为优秀的专科医生一样。

5、注意力机制的商品特征聚焦

RoBERTa 的多头注意力机制能够自动学习文本中不同词语的重要性,在商品分类任务中表现为对关键特征词的关注。注意力权重 αi,j\alpha_{i,j}αi,j 表示第 iii 个词对第 jjj 个词的关注度:

αi,j=exp⁡(qi⋅kj/dk)∑k=1nexp⁡(qi⋅kk/dk)\alpha_{i,j} = \frac{\exp\left(q_i \cdot k_j / \sqrt{d_k}\right)}{\sum_{k=1}^n \exp\left(q_i \cdot k_k / \sqrt{d_k}\right)} αi,j=k=1nexp(qikk/dk)exp(qikj/dk)

在项目中,我们通过output_attentions=True获取注意力权重,可用于分析模型关注的商品特征:

# 代码中获取注意力权重
primary_logits, secondary_logits, attentions = model(input_ids=input_ids,attention_mask=attention_mask
)

🤓🤓🤓小周有话说
注意力机制就像购物时的 “重点关注” 能力。当分析 “无线蓝牙耳机降噪长续航” 这个商品名称时,模型会自动关注 “无线蓝牙”、“耳机”、“降噪” 这些决定商品类别的关键信息,而相对忽略 “长续航” 这种次要特征。这类似于人类购物时会先看商品类型,再考虑附加功能,使得模型能像有经验的导购员一样,快速抓住商品的本质特征进行分类。

6、预训练目表

RoBERTa 采用了改进的 掩码语言模型(MLM)作为预训练目标,与 BERT 不同的是:

  1. 动态掩码:每次输入序列时 随机生成掩码,而非固定掩码
  2. 更大的批处理量:使用更大的训练批次提升训练稳定性
  3. 移除下一句预测(NSP)任务:专注于语言建模

MLM 目标通过最大化条件概率训练模型:

L=−E[∑i∈maskedlog⁡P(xi∣x¬i)]\mathcal{L} = -\mathbb{E} \left[ \sum_{i \in \text{masked}} \log P(x_i | x_{\neg i}) \right] L=E[imaskedlogP(xix¬i)]

🤓🤓🤓小周有话说
RoBERTa 的预训练过程就像做 填空题。模型会看到被遮挡的句子,比如 "我买了一个 [MASK] 手机",然后学习预测被遮挡的词是什么(可能是 "智能""新" 等)。与 BERT 不同的是,每次练习时遮挡的位置都不同,而且训练量更大,这样模型能学到更全面的语言知识,在理解商品名称时表现更出色。

五、项目实现

1. 文本数据增强模块

def augment_text(text, prob=0.2):"""对中文文本进行简单的数据增强"""if not text or random.random() > prob:return text# 随机插入同义词words = list(text)if len(words) < 3:return text # 随机选择插入位置insert_pos = random.randint(1, len(words)-1)# 简单同义词替换表(可以扩展)synonyms = {'好': ['佳', '优', '良'],...}# 尝试找到可替换的词for i in range(len(words)):...# 随机交换两个字符swap_pos1 = random.randint(0, len(words)-1)swap_pos2 = random.randint(0, len(words)-1)if swap_pos1 != swap_pos2:words[swap_pos1], words[swap_pos2] = words[swap_pos2], words[swap_pos1]return ''.join(words)return text
  • 实现了基于规则的中文文本增强策略,用于增加训练数据多样性
  • 采用概率性增强机制,默认 20%20\%20% 的概率对文本进行增强,平衡原始数据和增强数据的比例
  • 包含两种增强操作:
    1. 同义词插入:在文本中随机位置插入同义词,保留原意的同时增加文本变化
    2. 随机字符交换:交换文本中两个随机字符的位置,创造微小变化
  • 维护了一个中文常用词的同义词表,可根据具体应用场景扩展
  • 对短文本(长度 < 3)不进行增强,避免破坏文本的语义完整性
  • 增强操作优先级设计:同义词插入优先于字符交换,确保语义层面的增强优先

2. 数据加载与预处理系统

def load_data(root_dir):"""从目录结构加载数据,解析为结构化DataFrame"""data = []for main_category in os.listdir(root_dir):...return pd.DataFrame(data)def balance_dataset(df, samples_per_category=100000):"""平衡数据集,确保各类别样本数量相对均衡"""balanced_dfs = []for category in df['main_category'].unique():...balanced_df = pd.concat(balanced_dfs, ignore_index=True)print(f"\n所有类别总样本数: {len(balanced_df)}")return balanced_dfdef analyze_data(df):"""分析数据集的基本统计信息,为模型设计提供依据"""print("数据集基本统计:")print(f"总样本数: {len(df)}")...
  • 数据加载与预处理模块实现了从原始文件到结构化数据的完整转换:
    • load_data()函数递归遍历目录结构,解析文件内容,提取多级标签和商品名称
    • 智能处理文本分割,正确解析包含逗号的商品名称
    • 自动识别训练集和测试集文件,为数据添加相应标记
  • 数据平衡功能采用了 类别抽样 策略:
    • 对每个主类别设置最大样本数上限(50000),防止某一类别样本过多导致模型偏向
    • 在每个类别内部按 8:28:28:2 比例分配训练集和测试集,保持数据分布一致性
    • 处理边界情况(如样本数过少时),确保每个类别至少有一个测试样本
  • 数据分析函数提供了多维度的数据集统计信息:
    • 总体样本数量统计
    • 类别分布情况分析
    • 训练 / 测试集分割比例
    • 各级标签的分布特征
    • 交叉维度的样本分布分析

3. 数据集与数据加载器

class ProductDataset(Dataset):"""商品分类数据集类,实现数据加载和预处理"""def __init__(self, texts, primary_labels, secondary_labels, tokenizer, max_len=128, augment=False):self.texts = texts...     def __len__(self):return len(self.texts)def __getitem__(self, idx):text = str(self.texts[idx])# 训练时应用数据增强if self.augment:text = augment_text(text)primary_label = self.primary_labels[idx]secondary_label = self.secondary_labels[idx]encoding = self.tokenizer.encode_plus(...)return {...}def create_data_loaders(train_df, test_df, tokenizer, batch_size=32, max_len=128, use_weighted_sampler=False):"""创建训练和测试数据加载器,支持加权采样处理类别不平衡"""train_dataset = ProductDataset(...)test_dataset = ProductDataset(...)# 使用加权采样器处理类别不平衡if use_weighted_sampler:# 计算一级标签的权重class_counts = torch.bincount(torch.tensor(train_df['primary_encoded'].values))...else:...return train_loader, test_loader
  • ProductDataset类实现了 PyTorch 标准数据集接口,封装了数据加载和预处理逻辑:
    • 实现了__len__方法返回样本数量,__getitem__方法获取单个样本
    • 根据augment参数控制是否在获取样本时应用数据增强(仅训练集使用)
    • 使用预训练模型的 tokenizer 对文本进行编码,转换为模型可接受的输入格式
    • 处理文本长度不一致问题,通过 padding 和 truncation 确保输入长度固定
    • 同时返回原始文本(用于后续分析)和模型输入(input_ids 和 attention_mask)
  • create_data_loaders函数创建高效的数据加载器:
    • 分别为训练集和测试集创建数据集实例,训练集启用数据增强
    • 支持加权随机采样器(WeightedRandomSampler)处理类别不平衡问题:
      1. 计算每个类别的权重(样本数越少,权重越高)
      2. 根据权重进行采样,使每个类别在训练中获得更均衡的表示
    • 配置 多线程数据加载(num_workers=4),提高数据读取效率
    • 训练集启用 shuffle(或 sampler),测试集不启用 shuffle 以保持结果可复现

4. 商品分类模型架构

class ProductClassifier(nn.Module):"""改进的商品分类模型,使用更复杂的结构和注意力机制"""def __init__(self, model_name, num_primary_labels, num_secondary_labels, dropout=0.3):super(ProductClassifier, self).__init__()# 根据模型名称选择合适的预训练模型if model_name.startswith('roberta'):self.bert = RobertaModel.from_pretrained(model_name)else:self.bert = BertModel.from_pretrained(model_name)...# 添加额外的全连接层增加模型深度self.fc1 = nn.Linear(self.hidden_size, self.hidden_size // 2)...# 使用批归一化self.bn1 = nn.BatchNorm1d(self.hidden_size // 2)...# 使用更复杂的dropout策略self.dropout1 = nn.Dropout(dropout)...# GELU激活函数比ReLU效果更好# 输出层# 初始化权重def _init_weights(self):"""初始化自定义层的权重"""nn.init.xavier_uniform_(self.fc1.weight)...def forward(self, input_ids, attention_mask):outputs = self.bert(input_ids=input_ids,attention_mask=attention_mask,output_attentions=True  # 返回注意力权重)# 使用最后一层的[CLS] token输出cls_output = outputs.pooler_output# 通过额外的全连接层x = self.dropout1(cls_output)...# 一级标签预测primary_logits = self.fc_primary(x)# 二级标签预测secondary_logits = self.fc_secondary(x)return primary_logits, secondary_logits, outputs.attentions
  • 模型采用了基于预训练语言模型的 迁移学习 架构:
    • 支持 BERT 和 RoBERTa 系列模型,根据模型名称自动选择对应的预训练模型
    • 以预训练模型作为 特征提取器,保留其丰富的语言表示能力
    • 在预训练模型之上添加自定义的 分类头,适应特定的分类任务
  • 模型结构设计考虑了多个优化点:
    • 采用 两层全连接层 逐步减小特征维度(从 hidden_sizehidden_size//4
    • 每层全连接后使用 批归一化BatchNorm1d)加速训练并提高稳定性
    • 使用 GELUGELUGELU 激活函数,相比 ReLUReLUReLU 具有更好的 梯度特性泛化能力
    • 应用 渐进式 dropout 策略(从 0.30.30.30.210.210.21 再到 0.150.150.15),平衡正则化效果和信息保留
  • 实现了多任务学习,同时预测一级二级标签:
    • 共享底层特征提取网络,减少参数数量
    • 针对不同层级的标签使用独立的输出层
    • 这种设计利用了标签间的相关性,提高整体分类性能
  • 自定义权重初始化策略:
    • 使用 Xavier 均匀初始化(xavier_uniform_)权重,确保信号在网络中有效传播
    • 偏置项初始化为 0,简化初始状态的优化过程

5. 高级训练策略与工具

这部分包含了 标签平滑损失训练与评估函数早停机制 等关键组件,共同构成了完整的模型训练系统:

class LabelSmoothingLoss(nn.Module):"""标签平滑损失,减少过拟合风险"""# ... 实现代码def train_epoch(model, data_loader, loss_fn_primary, loss_fn_secondary, optimizer, device, scheduler, n_examples, scaler, accumulation_steps=1):"""训练一个epoch,支持梯度累积和混合精度训练"""# ... 实现代码def eval_model(model, data_loader, loss_fn_primary, loss_fn_secondary, device, n_examples):"""评估模型性能,收集预测结果用于后续分析"""# ... 实现代码class EarlyStopping:"""改进的早停机制,监控多个指标"""# ... 实现代码
  • 标签平滑损失(LabelSmoothingLoss)是一种 正则化技术
    • 不使用硬编码的 one-hot 标签,而是创建一个平滑的目标分布
      • 此处解释一下什么是one-hot 编码One-Hot 独热编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。例如:
      • 假设水果有 3 类 —— 苹果、香蕉、橙子。
        苹果 → [1, 0, 0](第一个格子亮)
        香蕉 → [0, 1, 0](第二个格子亮)
        橙子 → [0, 0, 1](第三个格子亮)
    • 减少模型对正确标签的过度自信,提高泛化能力
    • 通过参数 smoothing 控制平滑程度,平衡偏差和方差
  • 训练函数实现了多种训练技术:
    • 混合精度训练(使用 torch.cuda.amp):在不损失精度的前提下,使用半精度浮点数加速训练并减少显存占用
    • 梯度累积accumulation_steps):通过累积多个小批次的梯度来模拟更大的批次大小
    • 学习率调度scheduler):根据训练进度动态调整学习率
    • 使用 tqdm 显示训练进度和关键指标,便于实时监控训练状态
  • 评估函数不仅计算准确率和损失,还收集详细的预测结果:
    • 保存所有样本的 预测标签真实标签,用于后续的混淆矩阵分析
    • 记录原始文本,便于错误案例分析
    • 不计算梯度(with torch.no_grad ()),提高评估效率并减少显存使用
  • 早停机制 防止模型过拟合:
    • 可以监控多个指标(损失、一级准确率、二级准确率)
    • 当监控指标在指定轮次内没有显著改善时停止训练
    • 自动保存性能最佳的模型权重,确保最终使用的是泛化能力最强的模型

训练过程的输出示例如下:

6. 模型评估与可视化工具

def plot_confusion_matrix(y_true, y_pred, labels, title, chinese_font, ...):"""绘制混淆矩阵,直观展示分类结果"""# ... 实现代码def analyze_errors(texts, true_labels, pred_labels, label_names, chinese_font, top_n=20):"""分析模型预测错误的样本,找出最容易混淆的类别"""# ... 实现代码
  • 混淆矩阵可视化函数提供了丰富的功能:
    • 支持显示原始数量或归一化比例
    • 处理类别过多的情况,只显示出现次数最多的前 N 个类别
    • 确保中文标签正常显示,适配之前的字体配置
    • 保存高质量图像用于报告和分析
  • 错误分析函数深入挖掘模型的弱点:
    • 收集所有错误分类的样本,保存到 CSV 文件供详细分析
    • 统计最常见的错误分类对,找出模型容易混淆的类别
    • 可视化展示主要错误类型,为模型改进提供方向

六、结果展示

训练完成后,生成多种结果文件和可视化图表:

origin:
最终测试集: 一级准确率 0.9750, 二级准确率 0.9282
平均准确率: 0.9516

improve:
最终测试集: 一级准确率 0.9713, 二级准确率 0.9159
平均准确率: 0.9436

越 improve 越低这一块,看来得另辟蹊径进一步提高准确率,所以保存了最高的错误率、常错的类别

追求更高准确率的读者可以自行尝试更多方法,对样本进行处理

以下图表中

origin:不使用数据增强 + BERT + epoch=10
improve:数据增强 + RoBERTa + epoch = 20

  1. 训练历史图表:展示训练过程中的一级 / 二级标签准确率、损失值和学习率变化曲线,直观反映模型收敛情况。

origin:
请添加图片描述
improve:
请添加图片描述
2. 混淆矩阵:分别为一级和二级标签生成混淆矩阵,展示各类别之间的混淆程度,帮助识别容易混淆的类别对。

origin:
请添加图片描述
请添加图片描述

improve:
请添加图片描述
请添加图片描述
3. 分类报告:包含精确率 (Precision)、召回率 (Recall) 和 F1 分数等详细指标,全面评估模型在每个类别上的表现。

一级标签分类报告:

precision recall f1-score support
个护健康 0.9750 0.9786 0.9768 1592
乳品冷饮 0.9970 0.9970 0.9970 667
厨卫大电 0.9662 0.9817 0.9739 931


二级标签分类报告:
precision recall f1-score support
HIFI专区 0.5556 0.6250 0.5882 8
KTV音响 0.8182 0.7500 0.7826 12
MP3_MP4 0.9815 0.9953 0.9883 213
VR眼镜 0.9500 0.9956 0.9723 229
三明治机_早餐机 0.7625 0.8243 0.7922 74

  1. 错误分析
  • 保存所有错误预测样本到 CSV 文件
  • 生成最常见的错误分类对图表
  • 分析模型容易出错的类别和原因
    请添加图片描述

总错误样本数: 862
错误样本已保存至 prediction_errors.csv

最常见的错误类型:
编号 true_label pred_label count
64 摄影摄像 数码配件 60
74 数码配件 摄影摄像 35
21 厨房小电 商用电器 28
86 智能设备 摄影摄像 28
131 视听影音 影音娱乐 24
39 大家电 生活电器 21
49 家电配件 生活电器 20
88 智能设备 生活电器 19
59 影音娱乐 视听影音 19
65 摄影摄像 智能设备 19
总错误样本数: 2522
错误样本已保存至 prediction_errors.csv

最常见的错误类型:
编号 true_label pred_label count
809 电子词典 翻译机 40
1021 进口海鲜 虾类 26
1081 饮水机 茶吧机 25
1088 鱼类 进口海鲜 24
923 翻译机 电子词典 22
188 剃_脱毛器 电动鼻毛修剪器 17
715 潮流厨电 饭菜保温板 16
763 煮茶器_电茶盘 养生壶 16
922 翻译机 点读机_笔 16
403 手持稳定器 三脚架_云台 15

  1. 预测示例:随机抽取测试集中的样本,展示商品名称、真实标签和预测标签,直观展示模型的分类效果(正确使用绿色标记,错误使用红色标记)。
    请添加图片描述
    请添加图片描述
    请添加图片描述
    如果你喜欢我的文章,不妨给小周一个免费的点赞和关注吧!
http://www.dtcms.com/a/442251.html

相关文章:

  • 做翻译兼职的网站是哪个特色的网站建设
  • 山西建设银行招聘网站crm系统的销售管理功能包括
  • 如何在C#中配置ONNX Runtime以确保准确性和目标框位置的正确性?
  • PiscCode使用YOLO识别超大分辨率高清视图实践
  • 力扣2200. 找出数组中的所有 K 近邻下标
  • 文化馆网站建设情况在微信上做彩票网站有哪些
  • 网站301怎么做企业法治建设工作计划
  • list模拟实现(简单版)【C++】
  • 烟台网站建设哪家好呢维护一个网站需要多少钱
  • 什么网站做视频最赚钱wordpress无法使用ajax
  • 对接MCP服务之sse/streamable-http模式
  • springMVC中/*与/**匹配的区别
  • 如何快速学习一个网络协议?
  • 从安装到上手实战——Docker 基础命令全解析
  • 虚拟机怎么做网站昆明seo技术培训
  • 免费dede企业网站模板wordpress qa
  • autodl 安装modelscope OCR 模型 dots_ocr 笔记心得
  • Linux中文件目录结构介绍以及对目录的操作
  • 大庆建设工程交易中心网站唐山建设信息网站
  • 第8章:扩展边界:技术之外的视野(2)
  • Java面向对象练习:Person类继承与排序
  • Day04_刷题niuke20251005
  • 四个字网站 域名网站开发项目进度表
  • 理解C++20的革命特性——协程支持1
  • 【八股】操作系统
  • 2025年第13批中国深度合成算法备案分析报告
  • 建设工程专业承包交易中心网站百度指数分析官网
  • SSMEE的仓库管理系统93c6b(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
  • 怎么自己学做网站建筑案例分析模板
  • 怎样申请一个免费网站全国加盟网站建设