ワンホットエンコーディングとは

ワンホットエンコーディング(One-Hot Encoding)とは、カテゴリカルデータを機械学習アルゴリズムが扱える数値形式に変換するための手法の一つで、カテゴリの数だけ新たなバイナリ(0または1)の列を作成する方法のこと

ワンホットエンコーディング(One-Hot Encoding)は、機械学習におけるデータ前処理の重要な手法の一つであり、カテゴリカルデータ(Categorical Data)を、機械学習アルゴリズムが直接処理できる数値形式に変換するために用いられます。特に、カテゴリ間に順序関係が存在しない「名義尺度(Nominal Scale)」のデータを扱う際に適しています。この手法では、元のカテゴリカル特徴量の各ユニークなカテゴリに対して、それぞれ新しい独立したバイナリ(0または1)の列(特徴量)を作成します。


ワンホットエンコーディング の基本的な概念

多くの機械学習アルゴリズムは、数値データを入力として想定しており、テキスト形式のカテゴリカルデータを直接処理できません。また、前述の「ラベルエンコーディング」のように、カテゴリを単一の整数値に変換すると、意図しない数値の順序関係が導入されてしまい、モデルの学習に悪影響を与える可能性があります。

ワンホットエンコーディングは、この問題に対処します。具体的な変換プロセスは以下の通りです。

  1. ユニークなカテゴリの識別: 対象となるカテゴリカル特徴量(例:)から、全てのユニークなカテゴリ(例:, , )を識別します。
  2. 新しい列の作成: 識別された各ユニークなカテゴリに対応する、新しいバイナリ(0または1)の列をデータセットに追加します。
    • 例:色_赤色_青色_緑という3つの新しい列が作成されます。
  3. バイナリ値の割り当て: 元のデータ行が特定のカテゴリに属する場合、そのカテゴリに対応する新しい列の値を1とし、それ以外の新しい列の値を0とします。

: 「色」という特徴量に「赤」「青」「緑」というカテゴリがあった場合。

元データ 色_赤色_青色_緑
100
010
001
100

このように変換することで、機械学習モデルは各カテゴリを独立した特徴量として認識し、カテゴリ間の順序関係を誤って学習することなく、データのパターンを捉えることができます。

ワンホットエンコーディング の適用例と実装

Pythonのpandasライブラリのget_dummies()関数や、scikit-learnライブラリのOneHotEncoderクラスを用いることで、ワンホットエンコーディングを簡単に実行できます。

Python

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

# サンプルデータ
data = {'色': ['赤', '青', '緑', '赤', '青'],
        'サイズ': ['S', 'M', 'L', 'M', 'S']}
df = pd.DataFrame(data)

print("変換前のデータ:")
print(df)

# pandasのget_dummies()を使用
df_onehot_pd = pd.get_dummies(df, columns=['色'], prefix='色')

print("\npandas.get_dummies()での変換後のデータ:")
print(df_onehot_pd)

# scikit-learnのOneHotEncoderを使用 (より大規模なデータやパイプラインに推奨)
encoder = OneHotEncoder(sparse_output=False) # sparse_output=FalseでNumPy配列として出力
encoded_colors = encoder.fit_transform(df[['色']]) # 2D配列で渡す
encoded_df_sk = pd.DataFrame(encoded_colors, columns=encoder.get_feature_names_out(['色']))
df_onehot_sk = pd.concat([df.drop('色', axis=1), encoded_df_sk], axis=1)

print("\nscikit-learn.OneHotEncoderでの変換後のデータ:")
print(df_onehot_sk)

出力例:

変換前のデータ:
  色 サイズ
0  赤    S
1  青    M
2  緑    L
3  赤    M
4  青    S

pandas.get_dummies()での変換後のデータ:
  サイズ  色_赤  色_青  色_緑
0    S   True  False  False
1    M  False   True  False
2    L  False  False   True
3    M   True  False  False
4    S  False   True  False

scikit-learn.OneHotEncoderでの変換後のデータ:
  サイズ  色_青  色_赤  色_緑
0    S  0.0  1.0  0.0
1    M  1.0  0.0  0.0
2    L  0.0  0.0  1.0
3    M  0.0  1.0  0.0
4    S  1.0  0.0  0.0

(注: pandasの出力ではTrue/Falseが表示されることがありますが、数値としては1/0として扱われます。scikit-learnの列順は、get_feature_names_outの出力順に基づきます。)

ワンホットエンコーディング の利点と課題

利点

  • 順序関係の導入を回避: カテゴリ間に数値的な大小関係や順序が誤って導入されることを防ぎます。これにより、名義尺度データに対して適切な変換が行われ、多くの機械学習モデルがカテゴリを平等に扱うことができます。
  • 多様なモデルへの適用性: 線形モデル(線形回帰、ロジスティック回帰、SVMなど)やニューラルネットワークなど、数値の大小に敏感なアルゴリズムに対しても安全に適用できます。
  • 解釈性: 各カテゴリが独立した特徴量として表現されるため、モデルがどのカテゴリに反応しているかを理解しやすくなります。

課題

  • 次元の呪い(Curse of Dimensionality): カテゴリ数が非常に多い場合、新しい列の数が爆発的に増加し、データの次元が大幅に増大します。これにより、以下の問題が発生する可能性があります。
    • メモリ使用量の増加: 大量のゼロを含むスパースなデータが生成され、メモリ効率が悪化します。
    • 計算コストの増加: モデルの訓練や予測に時間がかかります。
    • 過学習(Overfitting)のリスク: 特徴量の数が増えることで、モデルが訓練データに過度に適合し、未知のデータに対する汎化性能が低下する可能性があります。
  • マルチコリニアリティ(Multi-collinearity): 全てのカテゴリをワンホットエンコーディングすると、各列が線形従属関係を持つことになり(例:色_赤色_青が決まれば色_緑は自動的に決まる)、多重共線性の問題を引き起こすことがあります。これを避けるため、通常はカテゴリ数より1つ少ない列を生成する「ダミー変数化(Dummy Encoding)」が用いられます(例:drop_first=Trueオプション)。

ワンホットエンコーディングは、カテゴリカルデータを機械学習モデルが扱える数値形式に変換するための主要な手法の一つであり、各カテゴリに独立したバイナリの列を割り当てることで、カテゴリ間の順序関係の導入を回避します。これにより、線形モデルやニューラルネットワークなど、多くの機械学習アルゴリズムに安全に適用できるという利点があります。しかし、カテゴリ数が多い場合には次元の増加やメモリ消費量の増大といった課題も生じるため、データセットの特性やアルゴリズムの要件に応じて、適切な利用を検討する必要があります。

関連用語

次元の呪い | 今更聞けないIT用語集
カテゴリカルデータ | 今更聞けないIT用語集
AIソリューション

お問い合わせ

システム開発・アプリ開発に関するご相談がございましたら、APPSWINGBYまでお気軽にご連絡ください。

APPSWINGBYの

ソリューション

APPSWINGBYのセキュリティサービスについて、詳しくは以下のメニューからお進みください。

システム開発

既存事業のDXによる新規開発、既存業務システムの引継ぎ・機能追加、表計算ソフトによる管理からの卒業等々、様々なWebシステムの開発を行っています。

iOS/Androidアプリ開発

既存事業のDXによるアプリの新規開発から既存アプリの改修・機能追加まで様々なアプリ開発における様々な課題・問題を解決しています。


リファクタリング

他のベンダーが開発したウェブサービスやアプリの不具合改修やソースコードの最適化、また、クラウド移行によってランニングコストが大幅にあがってしまったシステムのリアーキテクチャなどの行っています。