基于Beckham平方误差重构的序数回归方法在水泥强度预测中的应用
序言
在机器学习领域,序数回归(Ordinal Regression)是一种处理有序类别标签的特殊分类任务。与普通分类不同,序数回归需要考虑类别之间的顺序关系。本文将介绍Beckham和Pal在2016年提出的基于平方误差重构的序数回归方法,并展示如何将其应用于水泥强度预测任务。
1. 序数回归问题概述
序数回归问题广泛存在于现实世界中,例如:
- 产品评分预测(1-5星)
- 疾病严重程度分级
- 本文中的水泥强度等级预测
与传统分类问题不同,序数回归中的类别具有明确的顺序关系,错误的预测也应该考虑"距离"因素。例如,将强度等级3预测为4比预测为2更接近实际情况。
2. Beckham平方误差重构方法
Beckham和Pal提出的方法核心思想是将序数回归问题重新表述为平方误差最小化问题。该方法具有以下特点:
- 参数层a:模型额外学习一个参数向量a,用于将类别概率映射到连续空间
- 预测转换:通过sigmoid函数将概率输出转换为连续预测值
- 平方误差损失:直接最小化预测值与真实标签之间的平方误差
这种方法巧妙地利用了类别间的顺序信息,同时保持了模型的可训练性。
3. 水泥强度数据集准备
我们使用的数据集包含998个样本,每个样本有8个特征和1个有序标签(强度等级1-5,实际编码为0-4)。
数据预处理步骤
-
数据获取与检查:
- 特征数量:8个
- 样本数量:998个
- 标签范围:0-4(对应原始1-5级)
-
数据分割:
- 训练集:80%
- 测试集:20%
- 使用分层抽样保持类别比例
-
特征标准化:
- 使用StandardScaler对特征进行Z-score标准化
- 先拟合训练集,再转换测试集
# 示例代码
data_df["response"] = data_df["response"]-1 # 标签从0开始
X_train, X_test, y_train, y_test = train_test_split(
data_features.values,
data_labels.values,
test_size=0.2,
random_state=1,
stratify=data_labels.values)
4. 模型架构设计
我们构建了一个多层感知机(MLP)来实现Beckham方法:
网络结构特点
-
隐藏层:
- 两个隐藏层,每层300个神经元
- 使用LeakyReLU激活函数
- 添加Dropout(0.2)和BatchNorm正则化
-
输出层:
- 输出节点数等于类别数(5)
- 不使用激活函数,输出原始logits
-
关键创新:
- 添加参数层a,初始化为接近0的小随机数
- a的维度为(num_classes, 1)
class MLP(torch.nn.Module):
def __init__(self, in_features, num_classes, num_hidden_1=300, num_hidden_2=300):
super().__init__()
self.num_classes = num_classes
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)
)
self.a = torch.nn.Parameter(torch.zeros(
num_classes).float().normal_(0.0, 0.1).view(-1, 1))
5. 训练过程实现
训练过程的核心是Beckham方法的特殊损失计算:
关键步骤
-
预测值转换:
- 首先对logits应用softmax得到类别概率
- 通过参数a和sigmoid函数将概率映射到连续空间
- 最后缩放到0-(num_classes-1)范围
-
损失计算:
- 使用简单的平方误差损失
- 直接比较连续预测值和离散标签
-
参数更新:
- 使用Adam优化器
- 学习率设为0.001
def squared_error(targets, predictions):
return torch.mean((targets.float() - predictions)**2)
def beckham_logits_to_predictions(logits, model, num_classes):
probas = torch.softmax(logits, dim=1)
predictions = ((num_classes-1)
* torch.sigmoid(probas.mm(model.a).view(-1)))
return predictions
# 训练循环中
predictions = beckham_logits_to_predictions(logits, model, model.num_classes)
loss = squared_error(predictions, class_labels)
6. 模型评估
评估序数回归模型时,我们关注两个指标:
-
平均绝对误差(MAE):
- 预测等级与实际等级的绝对差平均值
- 反映预测的准确程度
-
均方误差(MSE):
- 平方差的平均值
- 对较大误差给予更高惩罚
评估结果
在水泥强度数据集上,模型表现如下:
- 训练集MAE: 0.66
- 测试集MAE: 0.69
- 训练集MSE: 0.85
- 测试集MSE: 0.89
这些结果表明模型能够较好地学习水泥强度等级的有序关系,且在测试集上的表现与训练集接近,说明没有明显过拟合。
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:
features = features.to(device)
targets = targets.float().to(device)
logits = model(features)
predicted_labels = beckham_logits_to_labels(logits, model, model.num_classes)
num_examples += targets.size(0)
mae += torch.sum(torch.abs(predicted_labels - targets))
mse += torch.sum((predicted_labels - targets)**2)
return mae / num_examples, mse / num_examples
7. 方法优势与适用场景
Beckham平方误差重构方法具有以下优势:
- 简单有效:不需要复杂的损失函数设计
- 端到端训练:所有参数一起优化
- 物理意义明确:预测值直接对应有序等级
适用场景包括:
- 评分预测系统
- 医疗诊断分级
- 产品质量评估
- 任何具有有序类别标签的问题
8. 总结
本文详细介绍了基于Beckham平方误差重构的序数回归方法在水泥强度预测中的应用。通过添加参数层a和重新设计损失函数,我们成功地将分类问题转化为回归问题,同时保留了类别间的顺序信息。实验结果表明,该方法在水泥强度数据集上取得了良好的预测性能。
这种方法不仅适用于水泥强度预测,也可以推广到其他有序分类问题中,为处理序数回归任务提供了一种简单而有效的解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考