【scikit-learn】カテゴリー変数をエンコーディングする方法について

ふゅか
ふゅか
ふゅか、カテゴリー変数って機械学習では扱いにくいんだって!scikit-learnで簡単に処理できるって知ってた?
はるか
はるか
知ってる。数値に変換する方法がいくつかある。便利。

1. scikit-learnでカテゴリー変数をエンコーディングする方法

カテゴリー変数(Categorical Variables)は、数値ではなく、文字列やラベル形式で表現されるデータのことです。例えば、性別(”男性”、”女性”)や色(”赤”、”青”、”緑”)などが該当します。これらのデータは、そのままでは機械学習モデルで利用できません。そのため、数値データに変換するエンコーディング(Encoding)が必要になります。

この記事では、Pythonの機械学習ライブラリscikit-learnを使ってカテゴリー変数をエンコーディングする方法をわかりやすく解説します。

1.1. なぜカテゴリー変数をエンコーディングするのか?

機械学習モデルは基本的に数値データを処理するため、カテゴリー変数をそのままモデルに入力することはできません。たとえば、”赤”や”青”という文字列データは数値データに変換しなければなりません。また、適切な変換方法を選ぶことで、モデルの性能に良い影響を与えます。

2. scikit-learnで提供されるエンコーディング方法

scikit-learnでは、主に以下のエンコーディング方法が用意されています。

  1. Label Encoding(ラベルエンコーディング)
  2. One-Hot Encoding(ワンホットエンコーディング)
  3. Ordinal Encoding(オーディナルエンコーディング)

それぞれの特徴を見ていきましょう。

3. Label Encoding(ラベルエンコーディング)

ラベルエンコーディングは、カテゴリデータ(カテゴリー変数)を整数値に変換するシンプルな方法です。この方法では、各カテゴリを一意の数値で表現します。たとえば、「赤」「青」「緑」という3つのカテゴリがあった場合、それぞれを0、1、2のように置き換えます。

ふゅか
ふゅか
ラベルエンコーディングって、カテゴリを整数値にするんだよね。シンプルだけど、どんな時に使うんだっけ?
はるか
はるか
分類問題向き。

3.1. 実装例

from sklearn.preprocessing import LabelEncoder

# サンプルデータ
colors = ["赤", "青", "緑", "赤", "青"]

# LabelEncoderを初期化
label_encoder = LabelEncoder()

# エンコーディング
encoded_colors = label_encoder.fit_transform(colors)

# 結果
print("エンコード結果:", encoded_colors)
print("逆変換:", label_encoder.inverse_transform(encoded_colors))

3.2. 実行結果

以下のように、カテゴリ「赤」「青」「緑」がそれぞれ数値に変換され、逆変換も可能です。

4. One-Hot Encoding(ワンホットエンコーディング)

ワンホットエンコーディングは、カテゴリデータを0と1の列で表現する方法です。この方法では、各カテゴリに専用の0と1の列を割り当て、該当する箇所に「1」を、それ以外に「0」を設定します。たとえば、「赤」「青」「緑」というカテゴリがあれば、これを以下のように変換します。

  • 赤 → [1, 0, 0]
  • 青 → [0, 1, 0]
  • 緑 → [0, 0, 1]
ふゅか
ふゅか
次はワンホットエンコーディングだよ!これ、カテゴリごとに0と1の列を作る方法だよね?
はるか
はるか
そう。赤→[1, 0, 0]、青→[0, 1, 0]のように。

4.1. 実装例

from sklearn.preprocessing import OneHotEncoder
import numpy as np

# サンプルデータ
colors = np.array(["赤", "青", "緑", "赤", "青"]).reshape(-1, 1)

# OneHotEncoderを初期化
one_hot_encoder = OneHotEncoder(sparse_output=False)

# エンコーディング
encoded_colors = one_hot_encoder.fit_transform(colors)

# 結果
print("エンコード結果:\n", encoded_colors)
print("カテゴリ名:", one_hot_encoder.categories_)

4.2. 実行結果

5. Ordinal Encoding

Ordinalエンコーディングは、カテゴリデータに順序がある場合に適したエンコーディング方法です。この方法では、カテゴリを順序に基づいて数値に変換します。たとえば、サイズが「小」「中」「大」のように順序がある場合、それぞれを0、1、2のように変換します。

ふゅか
ふゅか
最後はOrdinalエンコーディング!これはカテゴリに順序がある場合に便利なんだよね。
はるか
はるか
「小」「中」「大」を0、1、2に変換する。

5.1. 実装例

from sklearn.preprocessing import OrdinalEncoder
import numpy as np
# サンプルデータ
sizes = np.array(["小", "中", "大", "中", "小"]).reshape(-1, 1)

# OrdinalEncoderを初期化
ordinal_encoder = OrdinalEncoder(categories=[["小", "中", "大"]])

# エンコーディング
encoded_sizes = ordinal_encoder.fit_transform(sizes)

# 結果
print("エンコード結果:\n", encoded_sizes)
print("逆変換:", ordinal_encoder.inverse_transform(encoded_sizes))

5.2. 実行結果

PR