基于PyTorch的交叉熵基准模型在水泥强度等级预测中的应用
引言
在深度学习领域,序数回归(Ordinal Regression)是一种特殊的分类问题,其中类别之间存在明确的顺序关系。本文将以水泥强度等级预测为例,介绍如何使用PyTorch构建一个基于交叉熵损失的基准分类模型,为后续更复杂的序数回归方法提供比较基准。
数据集准备
我们使用的水泥强度数据集包含998个样本,每个样本有8个特征变量和1个响应变量(强度等级)。强度等级分为5个有序类别(1-5级),在预处理时需要将其转换为0-4的范围,这是深度学习分类任务的标准做法。
数据预处理步骤
-
数据加载与标签转换:
data_df["response"] = data_df["response"]-1 # 将标签范围从1-5转换为0-4
-
特征与标签分离:
data_labels = data_df["response"] data_features = data_df.loc[:, ["V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8"]]
-
数据集划分: 使用sklearn的
train_test_split
函数按8:2比例划分训练集和测试集,并保持类别分布一致(stratify参数)。 -
特征标准化: 对特征进行标准化处理,使每个特征的均值为0,方差为1,这对神经网络训练至关重要。
模型架构设计
我们构建了一个简单的多层感知机(MLP)模型,包含以下组件:
-
网络结构:
- 两个隐藏层,每层300个神经元
- 使用LeakyReLU激活函数
- 添加Dropout(0.2)和BatchNorm层防止过拟合
- 输出层神经元数量等于类别数(5)
-
关键实现代码:
class MLP(torch.nn.Module): def __init__(self, in_features, num_classes, num_hidden_1=300, num_hidden_2=300): super().__init__() self.my_network = torch.nn.Sequential( torch.nn.Linear(in_features, num_hidden_1, bias=False), torch.nn.LeakyReLU(), torch.nn.Dropout(0.2), torch.nn.BatchNorm1d(num_hidden_1), torch.nn.Linear(num_hidden_1, num_hidden_2, bias=False), torch.nn.LeakyReLU(), torch.nn.Dropout(0.2), torch.nn.BatchNorm1d(num_hidden_2), torch.nn.Linear(num_hidden_2, num_classes) )
模型训练
使用交叉熵损失函数和Adam优化器进行模型训练:
-
训练配置:
- 学习率:0.001
- 训练周期:50
- 批量大小:128
- 随机种子:1(确保可重复性)
-
训练过程:
for epoch in range(num_epochs): model.train() for batch_idx, (features, class_labels) in enumerate(train_loader): logits = model(features) loss = torch.nn.functional.cross_entropy(logits, class_labels) optimizer.zero_grad() loss.backward() optimizer.step()
-
损失变化: 从初始损失1.85逐渐下降到约0.50,表明模型在学习有效的特征表示。
模型评估
使用平均绝对误差(MAE)和均方误差(MSE)两个指标评估模型性能:
-
评估函数实现:
def compute_mae_and_mse(model, data_loader, device): with torch.no_grad(): mae, mse, num_examples = 0., 0., 0 for features, targets in data_loader: logits = model(features) predicted_labels = torch.argmax(logits, dim=1) mae += torch.sum(torch.abs(predicted_labels - targets)) mse += torch.sum((predicted_labels - targets)**2) return mae / num_examples, mse / num_examples
-
评估结果:
- 训练集MAE:0.22,MSE:0.27
- 测试集MAE:0.37,MSE:0.41
技术要点分析
-
序数回归与普通分类的区别:
- 普通分类任务假设类别间无序,而序数回归考虑类别间的顺序关系
- 交叉熵损失函数不考虑类别顺序,仅关注预测类别是否正确
-
模型设计考虑:
- 使用LeakyReLU而非ReLU避免神经元"死亡"问题
- 批归一化和Dropout层配合使用提高模型泛化能力
- 隐藏层不使用偏置项,依靠批归一化进行偏移
-
评估指标选择:
- 对于序数回归问题,MAE比准确率更能反映预测质量
- MSE对较大误差给予更高惩罚,反映预测的稳定性
总结与展望
本文实现了一个基于交叉熵损失的基准分类模型用于水泥强度等级预测。虽然交叉熵损失不考虑类别顺序关系,但作为基准模型仍能达到不错的性能(测试集MAE 0.37)。后续可以尝试以下改进:
- 使用专门的序数回归损失函数(如CORN或Beckham方法)
- 调整网络结构(层数、神经元数量)寻找最优配置
- 尝试不同的正则化策略进一步提高泛化能力
这个基准模型为后续更复杂的序数回归方法提供了性能比较的基础,帮助研究者评估新方法的实际改进效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考