ジュリア・フラックスでワンホットエンコーディングする方法
概要
ワンホットエンコーディングとは、データを分類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