logo

줄리아 플럭스에서 원-핫 인코딩하는 방법 📂머신러닝

줄리아 플럭스에서 원-핫 인코딩하는 방법

개요

원-핫 인코딩이란, 데이터를 분류class에 따라 표준기저벡터 로 매핑하는 것을 말한다. Flux에서는 이를 위한 함수를 제공한다.

코드1

onehot()

  • onehot(x, labels, [default])

x .== labels를 반환한다. 다만 이와 완전히 같은 결과를 반환하는 것은 아니고, OneHotVector라는 타입으로 반환한다. 여러 데이터를 인코딩할 때는 아래의 onehotbatch()를 쓴다.

julia> 3 .== [1,3,4]
3-element BitVector:
 0
 1
 0

julia> Flux.onehot(3, [1,3,4])
3-element OneHotVector(::UInt32) with eltype Bool:
 ⋅
 1
 ⋅

julia> Flux.onehot(3, 1:6)
6-element OneHotVector(::UInt32) with eltype Bool:
 ⋅
 ⋅
 1
 ⋅
 ⋅
 ⋅

julia> Flux.onehot(:c, [:a,:b,:c])
3-element OneHotVector(::UInt32) with eltype Bool:
 ⋅
 ⋅
 1

기본값을 지정하면 레이블에 없는 요소를 기본값으로 레이블링한다.

julia> Flux.onehot(5, [1,2,3], 3)
3-element OneHotVector(::UInt32) with eltype Bool:
 ⋅
 ⋅
 1

onehotbatch()

  • onehotbatch(xs, labels, [default])

여러 데이터를 한 번에 인코딩할 때 쓴다. 사용 방법은 onehot()과 같다.

julia> Flux.onehotbatch([1,2,5], [1,2,3], 3)
3×3 OneHotMatrix(::Vector{UInt32}) with eltype Bool:
 1  ⋅  ⋅
 ⋅  1  ⋅
 ⋅  ⋅  1

julia> Flux.onehotbatch(['a', 'b', 'c', 'h'], 'a':'c', 'c')
3×4 OneHotMatrix(::Vector{UInt32}) with eltype Bool:
 1  ⋅  ⋅  ⋅
 ⋅  1  ⋅  ⋅
 ⋅  ⋅  1  1

onecold()

  • onecold(y::AbstractArray, labels = 1:size(y,1))

onehot(), onehotbatch()의 역변환이다. 원-핫 인코딩을 풀어준다. 입력이 OneHotVector가 아니어도 쓸 수 있다.

julia> x1 = Flux.onehot(2, 1:3)
3-element OneHotVector(::UInt32) with eltype Bool:
 ⋅
 1
 ⋅

julia> Flux.onecold(x1)
2

julia> x2 = Flux.onehot('a', ['a', 'b', 'c'])
3-element OneHotVector(::UInt32) with eltype Bool:
 1
 ⋅
 ⋅

julia> Flux.onecold(x2, 'a':'c')
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

julia> Flux.onecold([0.1, 0.2, 0.5], [:a, :b, :c])
:c

3×3 OneHotMatrix(::Vector{UInt32}) with eltype Bool:
 1  ⋅  ⋅
 ⋅  1  ⋅
 ⋅  ⋅  1

julia> x3 = Flux.onehotbatch([1,2,5], [1,2,3], 3)
3×3 OneHotMatrix(::Vector{UInt32}) with eltype Bool:
 1  ⋅  ⋅
 ⋅  1  ⋅
 ⋅  ⋅  1

julia> Flux.onecold(x3)
3-element Vector{Int64}:
 1
 2
 3

환경

  • OS: Windows10
  • Version: Julia 1.7.1, Flux 0.12.8