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



1. scikit-learnでカテゴリー変数をエンコーディングする方法
カテゴリー変数(Categorical Variables)は、数値ではなく、文字列やラベル形式で表現されるデータのことです。例えば、性別(”男性”、”女性”)や色(”赤”、”青”、”緑”)などが該当します。これらのデータは、そのままでは機械学習モデルで利用できません。そのため、数値データに変換するエンコーディング(Encoding)が必要になります。
この記事では、Pythonの機械学習ライブラリscikit-learnを使ってカテゴリー変数をエンコーディングする方法をわかりやすく解説します。
1.1. なぜカテゴリー変数をエンコーディングするのか?
機械学習モデルは基本的に数値データを処理するため、カテゴリー変数をそのままモデルに入力することはできません。たとえば、”赤”や”青”という文字列データは数値データに変換しなければなりません。また、適切な変換方法を選ぶことで、モデルの性能に良い影響を与えます。
2. scikit-learnで提供されるエンコーディング方法
scikit-learnでは、主に以下のエンコーディング方法が用意されています。
- Label Encoding(ラベルエンコーディング)
- One-Hot Encoding(ワンホットエンコーディング)
- 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]


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のように変換します。


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))