You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:40:48