如何在Julia中实现One-Vs-Rest多分类分类算法?
实现One-Vs-Rest多分类逻辑回归(Julia版)
核心步骤拆解
要实现One-Vs-Rest(一对其余)多分类,核心是把多分类任务拆成多个二分类任务,每个任务针对一个类别训练模型,最终通过概率投票确定样本所属类别。
1. 生成二分类标签列
先为每个类别创建专属的二分类标签,把原类别列c转换成三个布尔列,分别标记样本是否属于对应类别:
# 为每个类别创建二分类标签列 df.is_class0 = df.c .== 0 # 区分类别0 vs [1,2] df.is_class1 = df.c .== 1 # 区分类别1 vs [0,2] df.is_class2 = df.c .== 2 # 区分类别2 vs [0,1]
2. 训练二分类逻辑回归模型
每个二分类模型的公式结构一致,仅因变量换成对应的标签列。这里用LogitLink(标准逻辑回归默认链接函数),你也可以保留原代码的ProbitLink:
# 逐个训练三个二分类模型 model0 = glm(@formula(is_class0 ~ x1 + x2 + x3 + y), df, Binomial(), LogitLink()) model1 = glm(@formula(is_class1 ~ x1 + x2 + x3 + y), df, Binomial(), LogitLink()) model2 = glm(@formula(is_class2 ~ x1 + x2 + x3 + y), df, Binomial(), LogitLink())
想更高效的话,用循环批量训练:
# 循环批量训练模型 label_cols = [:is_class0, :is_class1, :is_class2] models = [] for col in label_cols # 动态生成公式 fm = @formula($col ~ x1 + x2 + x3 + y) push!(models, glm(fm, df, Binomial(), LogitLink())) end
3. 基于概率的多分类预测
对任意样本,用三个模型分别预测其属于对应类别的概率,选择概率最高的类别作为最终结果:
# 单样本/批量预测函数 function ovr_predict(sample_df) # 获取三个模型的预测概率(response=true返回真实概率值) probs = [predict(model, sample_df, response=true) for model in models] # argmax返回概率最大的索引(从1开始),减1对应原类别0/1/2 return argmax(probs) - 1 end # 测试:用原数据前5行做预测 predicted = ovr_predict(df[1:5, :]) println("预测类别:", predicted)
注意事项
- 链接函数选择:
LogitLink对应标准逻辑回归,ProbitLink是正态分布链接,两者逻辑一致,按需替换即可 - 数据验证:训练前建议拆分训练集和测试集避免过拟合,可用
Lathe.preprocess.TrainTestSplit实现 - 概率解释:
predict(..., response=true)返回的是样本属于正类的概率,直接用于比较即可
内容的提问来源于stack exchange,提问作者skalarr
相关产品推荐
相关产品推荐

