簡體   English   中英

使用Flux.jl進行邏輯回歸

[英]Logistic regression using Flux.jl

我有一個包含2個科目的學生成績的數據集,無論學生是否被大學錄取,都將得到結果。 我需要對數據進行邏輯回歸,並找到最佳參數θ以最大程度地減少損失並預測測試數據的結果。 我不是在這里嘗試建立任何復雜的非線性網絡。

數據看起來像這樣 在此處輸入圖片說明

我為邏輯回歸定義了損失函數,效果很好

predict(X) = sigmoid(X*θ)
loss(X,y) = (1 / length(y)) * sum(-y .* log.(predict(X)) .- (1 - y) .* log.(1 - predict(X)))

我需要最小化此損失函數並找到最佳θ。 我想用Flux.jl或其他任何庫來做,這使它變得更加容易。 閱讀示例后,我嘗試使用Flux.jl,但無法將成本降至最低。

我的代碼段:

function update!(ps, η = .1)
  for w in ps
    w.data .-= w.grad .* η
    print(w.data)
    w.grad .= 0
  end
end

for i = 1:400
  back!(L)
  update!((θ, b))
  @show L
end

您可以使用GLM.jl(更簡單)或Flux.jl(更復雜,但總體上更強大)。 在代碼中,我生成了數據,以便您可以檢查結果是否正確。 此外,我還有一個二進制響應變量-如果您對目標變量進行其他編碼,則可能需要稍微更改代碼。

這是要運行的代碼(您可以調整參數以提高收斂速度-我選擇了安全的參數):

using GLM, DataFrames, Flux.Tracker

srand(1)
n = 10000
df = DataFrame(s1=rand(n), s2=rand(n))
df[:y] = rand(n) .< 1 ./ (1 .+ exp.(-(1 .+ 2 .* df[1] .+ 0.5 .* df[2])))
model = glm(@formula(y~s1+s2), df, Binomial(), LogitLink())

x = Matrix(df[1:2])
y = df[3]
W = param(rand(2,1))
b = param(rand(1))
predict(x) = 1.0 ./ (1.0+exp.(-x*W .- b))
loss(x,y) = -sum(log.(predict(x[y,:]))) - sum(log.(1 - predict(x[.!y,:])))

function update!(ps, η = .0001)
  for w in ps
    w.data .-= w.grad .* η
    w.grad .= 0
  end
end

i = 1
while true
  back!(loss(x,y))
  max(maximum(abs.(W.grad)), abs(b.grad[1])) > 0.001 || break
  update!((W, b))
  i += 1
end

結果如下:

julia> model # GLM result
StatsModels.DataFrameRegressionModel{GLM.GeneralizedLinearModel{GLM.GlmResp{Array{Float64,1},Distributions.Binomial{Float64},GLM.LogitLink},GLM.DensePredChol{Float64,Base.LinAlg.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

Formula: y ~ 1 + s1 + s2

Coefficients:
             Estimate Std.Error z value Pr(>|z|)
(Intercept)  0.910347 0.0789283 11.5338   <1e-30
s1            2.18707  0.123487 17.7109   <1e-69
s2           0.556293  0.115052 4.83513    <1e-5


julia> (b, W, i) # Flux result with number of iterations needed to converge
(param([0.910362]), param([2.18705; 0.556278]), 1946)

感謝您提供的有用示例。 但是,它似乎不與我的設置(Julia 1.1,Flux 0.7.1。)一起運行,因為預測和損失函數中的1+和1-操作不會在TrackedArray對象上廣播。 幸運的是,修復很簡單(注意點!):

predict(x) = 1.0 ./ (1.0 .+ exp.(-x*W .- b))
loss(x,y) = -sum(log.(predict(x[y,:]))) - sum(log.(1 .- predict(x[.!y,:])))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM