Language-LAB/Python

One-hot Encoding ๊ตฌํ˜„

JS LAB 2025. 2. 11. 14:42
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“ ๋ฌธ์ œ: One-Hot Encoding of Nominal Values

์„ค๋ช…
๋ช…๋ชฉํ˜•(Nominal) ๊ฐ’์ด ํฌํ•จ๋œ 1์ฐจ์› numpy ๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ One-Hot Encoding์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
ํ•จ์ˆ˜๋Š” np.ndarray ํƒ€์ž…์˜ 1D ์ •์ˆ˜ ๋ฐฐ์—ด x๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๊ณ ,
์„ ํƒ์ ์œผ๋กœ n_col (์ถœ๋ ฅ ํ–‰๋ ฌ์˜ ์—ด ๊ฐœ์ˆ˜)์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ n_col์ด ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด, ์ž๋™์œผ๋กœ x์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด

  • x์˜ ๊ฐ ๊ฐ’์€ 0 ์ด์ƒ์ด๋ฉฐ, x์˜ ์›์†Œ ๊ฐœ์ˆ˜๋งŒํผ ํ–‰(row) ์„ ๋งŒ๋“ค๊ณ ,
  • x์˜ ๊ณ ์œ ๊ฐ’ ๊ฐœ์ˆ˜๋งŒํผ ์—ด(column) ์„ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค ์œ„์น˜์— 1์„ ํ• ๋‹นํ•˜์„ธ์š”.
  • ๋ฐ˜๋ณต๋ฌธ ์—†์ด numpy์˜ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์„ธ์š”.

์˜ˆ์ œ

x = np.array([0, 1, 2, 1, 0])
output = to_categorical(x)
print(output)

์ถœ๋ ฅ:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]

โœ… ์ •๋‹ต ์ฝ”๋“œ

import numpy as np

def to_categorical(x, n_col=None):
    if n_col is None:
        n_col = np.max(x) + 1  # ํด๋ž˜์Šค ๊ฐœ์ˆ˜ ๊ฒฐ์ •

    one_hot = np.zeros((x.shape[0], n_col))  # (์ƒ˜ํ”Œ ์ˆ˜, ํด๋ž˜์Šค ๊ฐœ์ˆ˜) ํฌ๊ธฐ์˜ 0 ํ–‰๋ ฌ ์ƒ์„ฑ
    one_hot[np.arange(x.shape[0]), x] = 1  # ํ–‰ ์ธ๋ฑ์Šค์™€ ์—ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ 1 ํ• ๋‹น

    return one_hot

# ์˜ˆ์ œ ์‹คํ–‰
x = np.array([0, 1, 2, 1, 0])
output = to_categorical(x)
print(output)

๐Ÿ“Œ ์ฝ”๋“œ ์„ค๋ช…

1๏ธโƒฃ n_col ๊ฒฐ์ • (์—ด ๊ฐœ์ˆ˜)

if n_col is None:
    n_col = np.max(x) + 1
  • n_col์ด ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, x์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’(np.max(x))์„ ๊ธฐ์ค€์œผ๋กœ +1์„ ํ•˜์—ฌ ํด๋ž˜์Šค ๊ฐœ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด x = [0, 1, 2, 1, 0] ์ด๋ฉด, ํด๋ž˜์Šค 0, 1, 2๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ n_col = 3์ด ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ One-Hot ํ–‰๋ ฌ ์ดˆ๊ธฐํ™”

one_hot = np.zeros((x.shape[0], n_col))
  • (์ƒ˜ํ”Œ ๊ฐœ์ˆ˜, ํด๋ž˜์Šค ๊ฐœ์ˆ˜) ํฌ๊ธฐ์˜ 0 ํ–‰๋ ฌ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ์—์„œ x.shape[0] = 5, n_col = 3 ์ด๋ฏ€๋กœ one_hot์˜ ํฌ๊ธฐ๋Š” (5, 3)์ด ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ํ•ต์‹ฌ ์ฝ”๋“œ: One-Hot Encoding ์ ์šฉ

one_hot[np.arange(x.shape[0]), x] = 1

์ด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • np.arange(x.shape[0]) → [0, 1, 2, 3, 4] (ํ–‰ ์ธ๋ฑ์Šค)
  • x ์ž์ฒด๊ฐ€ ์—ด ์ธ๋ฑ์Šค → [0, 1, 2, 1, 0]
  • ๋”ฐ๋ผ์„œ:
    one_hot[0, 0] = 1  # ์ฒซ ๋ฒˆ์งธ ์ƒ˜ํ”Œ → 0๋ฒˆ ํด๋ž˜์Šค
    one_hot[1, 1] = 1  # ๋‘ ๋ฒˆ์งธ ์ƒ˜ํ”Œ → 1๋ฒˆ ํด๋ž˜์Šค
    one_hot[2, 2] = 1  # ์„ธ ๋ฒˆ์งธ ์ƒ˜ํ”Œ → 2๋ฒˆ ํด๋ž˜์Šค
    one_hot[3, 1] = 1  # ๋„ค ๋ฒˆ์งธ ์ƒ˜ํ”Œ → 1๋ฒˆ ํด๋ž˜์Šค
    one_hot[4, 0] = 1  # ๋‹ค์„ฏ ๋ฒˆ์งธ ์ƒ˜ํ”Œ → 0๋ฒˆ ํด๋ž˜์Šค
    
    ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ one_hot ํ–‰๋ ฌ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]
     [0. 1. 0.]
     [1. 0. 0.]]
    

๐ŸŽฏ ์ถ”๊ฐ€ ์„ค๋ช…: one_hot[np.arange(x.shape[0]), x] = 1 ์ž‘๋™ ์›๋ฆฌ

one_hot[row_indices, col_indices] = 1
  • row_indices = np.arange(x.shape[0]) → [0, 1, 2, 3, 4] (ํ–‰ ๋ฒˆํ˜ธ)
  • col_indices = x → [0, 1, 2, 1, 0] (๊ฐ ํ–‰์ด ์†ํ•  ์—ด ๋ฒˆํ˜ธ)
  • ๋”ฐ๋ผ์„œ ๊ฐ (ํ–‰, ์—ด) ์œ„์น˜์— 1์„ ๋„ฃ๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

โœ… ๋ฐ˜๋ณต๋ฌธ ์—†์ด ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค! ๐Ÿš€

์ด๊ฒƒ์ด ํŒฌ์‹œ ์ธ๋ฑ์‹ฑ!


๐Ÿ”ฅ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

for i in range(x.shape[0]):
    one_hot[i, x[i]] = 1

ํ•˜์ง€๋งŒ numpy์˜ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ ์—†์ด ๋” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
์ฆ‰, one_hot[np.arange(x.shape[0]), x] = 1์€ ์œ„ ๋ฐ˜๋ณต๋ฌธ์˜ ์ตœ์ ํ™”๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. โœ…


๐ŸŽฏ ์ตœ์ข… ์ •๋ฆฌ

โœ” One-Hot Encoding์„ ์ˆ˜ํ–‰ํ•˜๋Š” to_categorical() ํ•จ์ˆ˜ ๊ตฌํ˜„
โœ” ๋ฒกํ„ฐ ์—ฐ์‚ฐ(np.arange)์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต๋ฌธ ์—†์ด ๋น ๋ฅด๊ฒŒ ์‹คํ–‰
โœ” (ํ–‰, ์—ด) ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ด ํ•œ ๋ฒˆ์— ์›ํ•˜๋Š” ์œ„์น˜์— 1์„ ํ• ๋‹น
โœ” ์ตœ์ ํ™”๋œ One-Hot Encoding์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

728x90
๋ฐ˜์‘ํ˜•