NumPyでOne-Hot表現を生成!np.eye()とnp.identity()の活用術


 

機械学習において、カテゴリカルデータ(性別、色、国名など順序を持たないデータ)をモデルに入力する際、そのままでは扱えないことがあります。このような場合に用いられるのが**One-Hot表現(One-Hot Encoding)**です。One-Hot表現は、カテゴリを数値ベクトルに変換する手法で、NumPyのnp.eye()np.identity()といった関数を使うと効率的に生成できます。この記事では、One-Hot表現の基本と、np.eye()およびnp.identity()を用いたOne-Hot変換の方法について、具体的なサンプルコードを交えながら詳しく解説します。


 

One-Hot表現(One-Hot Encoding)とは?

 

One-Hot表現は、カテゴリカルデータを数値データに変換する手法の一つです。例えば、「赤」「青」「緑」という3つのカテゴリがある場合、それぞれを以下のようなベクトルで表現します。

  • : [1, 0, 0]

  • : [0, 1, 0]

  • : [0, 0, 1]

この形式では、各カテゴリがユニークな位置に「1」を持ち、それ以外の位置は「0」になります。この表現は、カテゴリ間に数値的な順序関係がないことを明確にし、機械学習モデルがカテゴリカルデータを正しく解釈するのに役立ちます。


 

1. np.eye()でOne-Hot表現を生成する

 

np.eye()関数は、対角成分が1でそれ以外の要素が0である行列(単位行列に似た形状)を作成するために使われます。One-Hot表現の生成に非常に適しています。

 

書式

 

Python
 
numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, like=None)
  • N: 行の数。通常、カテゴリの総数または出力ベクトルの次元数に相当します。

  • M (オプション): 列の数。Nと異なる値を指定することもできます。デフォルトはNと同じです。

  • k (オプション): 対角線のインデックス。0は主対角線。正の値は主対角線より上、負の値は主対角線より下を示します。One-Hot表現では通常0のままです。

  • dtype (オプション): 出力配列のデータ型。通常はintfloat

 

サンプルコード

 

 

1-1. シンプルなOne-Hotベクトル生成

 

Python
 
import numpy as np

# 3つのカテゴリ(0, 1, 2)のOne-Hot表現を生成
# N=3で3行3列の行列を作成
one_hot_matrix = np.eye(3, dtype=int)
print("3カテゴリのOne-Hot行列:\n", one_hot_matrix)

# 特定のインデックスのOne-Hotベクトルを取得
# 例えば、インデックス1(2番目のカテゴリ)のOne-Hotベクトル
# one_hot_matrix[1] は [0, 1, 0] となる

 

出力例

 

3カテゴリのOne-Hot行列:
 [[1 0 0]
 [0 1 0]
 [0 0 1]]

 

1-2. 複数のカテゴリカルデータをOne-Hot変換

 

実際のデータでは、複数のカテゴリカルな値(インデックス)を一度にOne-Hot変換したい場合があります。

Python
 
import numpy as np

# 元のカテゴリカルデータ(例えば、[2, 0, 1] は3つのデータポイントがそれぞれカテゴリ2, 0, 1に属することを示す)
categories = np.array([2, 0, 1])
num_classes = 3 # カテゴリの総数

# np.eye()でベースとなるOne-Hot行列を作成し、インデックス指定で変換
# eye(num_classes)で [[1,0,0],[0,1,0],[0,0,1]] を作成し、categoriesの値をインデックスとして選択
one_hot_encoded = np.eye(num_classes)[categories]
print("\n元のカテゴリデータ:", categories)
print("One-Hot変換後の配列:\n", one_hot_encoded)

 

出力例

 

元のカテゴリデータ: [2 0 1]
One-Hot変換後の配列:
 [[0 0 1]
 [1 0 0]
 [0 1 0]]

 

2. np.identity()でOne-Hot表現を生成する

 

np.identity()関数は、np.eye(N, M=N, k=0)の特殊なケースで、正方行列(N行N列)の単位行列のみを作成します。np.eye()とほぼ同じようにOne-Hot表現に利用できますが、列数(M)や対角線の位置(k)を調整できない点が異なります。

 

書式

 

Python
 
numpy.identity(n, dtype=<class 'float'>, *, like=None)
  • n: 行と列の数(正方行列の次元)。

  • dtype (オプション): 出力配列のデータ型。

 

サンプルコード

 

Python
 
import numpy as np

# 4つのカテゴリ(0, 1, 2, 3)のOne-Hot表現を生成
# n=4で4行4列の単位行列を作成
one_hot_matrix_id = np.identity(4, dtype=int)
print("4カテゴリのOne-Hot行列 (identity):\n", one_hot_matrix_id)

# np.eye()と同様に、インデックス指定で複数のカテゴリを変換
categories_id = np.array([3, 1, 0, 2])
num_classes_id = 4
one_hot_encoded_id = np.identity(num_classes_id, dtype=int)[categories_id]
print("\n元のカテゴリデータ:", categories_id)
print("One-Hot変換後の配列 (identity):\n", one_hot_encoded_id)

 

出力例

 

4カテゴリのOne-Hot行列 (identity):
 [[1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]]

元のカテゴリデータ: [3 1 0 2]
One-Hot変換後の配列 (identity):
 [[0 0 0 1]
 [0 1 0 0]
 [1 0 0 0]
 [0 0 1 0]]

 

np.eye() vs np.identity() どちらを使うべきか?

 

  • np.eye():

    • 汎用性: 行数と列数を別々に指定できる (N, M)。

    • オフセット: 対角線の位置をずらせる (k)。

    • 推奨: One-Hot表現を生成する際には、通常はこちらが推奨されます。特に、出力ベクトルの次元がカテゴリ数よりも大きい場合など、柔軟なOne-Hot表現が必要な場合に役立ちます。

  • np.identity():

    • 限定的: 必ず正方行列(単位行列)を作成します。

    • 簡潔性: np.eye(N, M=N, k=0)の簡略形と考えることができます。

    • 用途: 純粋に単位行列が必要な場合や、出力次元がカテゴリ数と厳密に一致する場合に使います。

One-Hot変換の目的で使う場合は、**np.eye()**を使うのが一般的でより柔軟です。


 

まとめ

 

One-Hot表現は、カテゴリカルデータを機械学習モデルが理解できる数値形式に変換するための重要な前処理手法です。NumPyのnp.eye()およびnp.identity()関数は、このOne-Hot表現を効率的に生成するための強力なツールです。

  • One-Hot表現: 各カテゴリを、ユニークな位置に1を持ち、他は0のベクトルで表します。

  • np.eye(N): N次元のOne-Hotベクトルを生成する際に使用します。複数のカテゴリを一括で変換する場合は、np.eye(num_classes)[categories]のようにインデックスとして利用します。

  • np.identity(n): np.eye(n, n, 0)と同じく単位行列を生成します。

これらの関数を使いこなすことで、データ前処理の効率が大幅に向上し、より高品質な機械学習モデルの構築に繋がるでしょう。ぜひ、あなたのNumPyワークフローと機械学習パイプラインに取り入れてみてください!🤖