忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【機械学習の知識】カテゴリ変数の主要エンコーディング手法の完全比較と使い分け

機械学習モデルや統計モデルは、文字データ(「赤・青・緑」や「東京・大阪」など)をそのまま計算することができません。そのため、カテゴリデータを数値に翻訳する「エンコーディング」が必須となります。今回は代表的な6つの手法の違いと、実務での選び方を徹底比較します。

1. 【 概要 】

カテゴリ変数のエンコーディングとは、質的なデータ(文字や属性)をコンピュータが計算できる量的なデータ(数値)に変換するプロセスです。

手法によって「作られる列の数」や「数値が持つ意味」が大きく異なります。特に「都道府県名」や「商品ID」のように種類(カテゴリ)が大量にあるデータをどう扱うかによって、モデルの精度が大きく変わるため、適切な手法の選択が重要になります。


2. 【 基本手順(6つの代表的な手法) 】

(1) One-Hotエンコーディング:全カテゴリに専用の列を作り、該当箇所を1、他を0にする。
(2) ダミーコーディング:K個のカテゴリに対し「K-1個」の列を作り、基準を1つ省略する。
(3) エフェクトコーディング:基準を-1、他を0や1で表現し、全体平均からの偏差を表す。
(4) 順序(Ordinal / Label)エンコーディング:カテゴリに「0, 1, 2...」と単純な整数を割り当てる。
(5) ターゲットエンコーディング:カテゴリを「そのグループの目的変数の平均値」に置き換える。
(6) 頻度(Frequency)エンコーディング:カテゴリを「出現回数(または割合)」に置き換える。

3. 整理:各エンコーディング手法の具体的な違い

6つの手法がそれぞれどのような構造を持ち、何が違うのかをステップごとに詳しく見ていきましょう。

【 各手法の仕組みと特徴 】

・手法(1):One-Hotエンコーディング
カテゴリが3つなら3つの列を作り、[1,0,0], [0,1,0], [0,0,1] で表現します。情報の欠落がありません。

・手法(2):ダミーコーディング
3つのうち1つを基準として削り、残り2つの列だけを作ります(多重共線性の回避)。

・手法(3):エフェクトコーディング
ダミーに似ていますが、基準を `-1` で表現します。全体平均に対する各グループの偏りを見たい統計モデル向けです。

・手法(4):順序(Ordinal / Label)エンコーディング
「低=1、中=2、高=3」のように整数に変換します。メモリを圧迫しませんが、アルゴリズムが「3は1の3倍の価値がある」と誤解するリスクがあります。

・手法(5):ターゲットエンコーディング(平均エンコーディング)
例えば「東京に住んでいる人の正解率(目的変数の平均)」のように、実績値で置き換えます。カテゴリ数が数千ある場合に非常に強力ですが、情報漏洩(リーク)に注意が必要です。

・手法(6):頻度(Frequency)エンコーディング
データ全体の中で「そのカテゴリが何回出現したか」の頻度数に置き換えます。珍しいカテゴリか、よくあるカテゴリかを数値化できます。

4. 関連して押さえたい「どれを使えばいいの?(実務での選び方)」

「手法が多すぎてどれを使えばいいか迷う」という場合の明確な選び方の基準を整理します。

・カテゴリ数が少ない(10未満)&決定木系モデルなら「One-Hot」
色や性別など、種類が少ないデータでLightGBMやランダムフォレストを使うならOne-Hotが最も安全です。

・カテゴリ数が膨大(数千〜数万)なら「ターゲットエンコーディング」や「頻度エンコーディング」
「郵便番号」や「商品ID」などをOne-Hotにすると列が爆発して破綻するため、ターゲットエンコーディングや頻度エンコーディングで1列に圧縮します。

・順序に意味があるデータなら「順序エンコーディング」
「満足度(低・中・高)」や「学歴(高卒・大卒・院卒)」など、大小関係に意味がある場合は整数に置き換える順序エンコーディングが最適です。

・本格的な統計・回帰分析なら「ダミーコーディング」
Pythonの `statsmodels` やRでp値を厳密に評価したい場合はダミーコーディングを選択します。


5. 補足:Pythonでの実装コード例

Pythonで代表的なエンコーディングを行う際の書き方イメージです。
可読性の高いライトグレーの背景でまとめています。

# 1. One-Hot(Pandas)
df_onehot = pd.get_dummies(df, columns=['fruit'])

# 2. 順序エンコーディング(Scikit-learn)
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
df['size_encoded'] = encoder.fit_transform(df[['size']])

# 3. ターゲットエンコーディング(category_encodersライブラリ)
import category_encoders as ce
te = ce.TargetEncoder(cols=['city'])
df['city_te'] = te.fit_transform(df['city'], df['target'])

6. まとめ

カテゴリ変数のエンコーディングには、定番の「One-Hot」「ダミー」「エフェクト」に加え、カテゴリ数が多いときに無双する「ターゲット・頻度エンコーディング」、順序を保持する「順序エンコーディング」など多彩なアプローチがあります。
「データのカテゴリ数」と「使うモデルの種類」に合わせて最適な手法をチョイスし、機械学習モデルの予測性能を最大限に引き出せるようになりましょう!


PR

【DS検定対策】データ不足を賢く補う!自然言語処理の「バックオフ(Backoff)」の仕組み

自然言語処理の確率モデル(N-gramなど)において、データの中に登場しないレアな単語の組み合わせに出会ったとき、確率がゼロになってしまい計算が破綻することがあります。これを防ぐために「より短い文脈のデータへ段階的に切り替えて確率を推定する」手法が「バックオフ(Backoff)」です!

1. 【 問題 】

統計的自然言語処理において、高次のN-gram(例:3-gram)で十分な頻度データが得られないレアなケースに直面した際、より低次のN-gram(例:2-gramや1-gram)の確率や統計量に順次切り替えてモデルの予測を補う手法を何と呼ぶでしょうか?

① バックオフ(Backoff / フォールバック)
② 特徴量ハッシング(Feature Hashing)
③ ドロップアウト(Dropout)
④ ワンホットエンコーディング(One-Hot Encoding)


2. 【 解答 】

正解: ① バックオフ(Backoff / フォールバック)

3. 整理:なぜバックオフが必要なのか?(ゼロ確率の問題)

テキスト分析や言語モデルでは、データが不足しているときに大きな問題が起こります。

課題・状況内容
データ不足とゼロ確率 例えば「人工知能が〇〇する」という3単語の組み合わせ(3-gram)がコーパス(学習データ)に存在しない場合、単純計算するとその確率が「0」になってしまい、文章全体の確率計算が破綻します。
バックオフの仕組み 「3-gramのデータがなければ、少し引いて**2-gram**を見る。それもなければ**1-gram(単体)**の頻度を見る」というように、段階的に遡って(バックオフして)確率を推定します。

4. 関連する重要概念:スムージング(平滑化)との違い

・スムージング(Laplace / 加算平滑化など):
すべての単語の出現回数に微小な値(例:+1)をあらかじめ足しておくことで、確率がゼロになるのを防ぐ一律の調整手法です。

・バックオフ(Backoff):
データがある部分はそのまま高次のモデルを使い、データが不足・欠落している部分だけを低次のモデルに「切り替えて(フォールバックして)補う」選択的なアプローチです。

5. DS検定形式:実戦4択クイズ

問:自然言語処理や統計的モデリングにおける「バックオフ(Backoff)」に関する記述として、最も適切なものはどれか。

① レアなカテゴリや出現回数の少ない単語を一律に「その他」という1つのカテゴリにまとめる前処理の専用用語である。
② 高次モデルで十分なデータが得られない場合に、より低次のモデルの統計量や確率へ段階的に切り替えて予測を補う手法である。
③ 勾配降下法において、学習の途中で誤差が大きくなった場合に学習率を強制的に引き上げる調整機構である。
④ 決定木の剪定(プルーニング)において、過学習を防ぐために深すぎる葉ノードを強制的に削除するアルゴリズムである。

【 正解: ② 】

解説: バックオフの目的と仕組みを問う標準問題です。
②が正解です。データ不足のときに低次のモデルへ引き返して確率を補います。
①は「レアカテゴリのまとめ(プール)」の解説です。
③は学習率のバックオフではなく、最適化の調整パラメータに関する記述です。
④は決定木の「プルーニング(枝刈り)」の説明です。


6. まとめ

DS検定や資格試験で「高次モデルでデータがない場合に低次モデルに切り替える」「ゼロ確率を防ぐためのバックオフ(フォールバック)」といったキーワードが出たら、正解は「バックオフ」です! スムージング(平滑化)とともに、自然言語処理の基礎的な確率推定テクニックとして押さえておきましょう!

【TensorFlow】2次元のテンソル(行列)同士で四則演算と行列積を行う基本コード

前回のスカラー(単一の数値)の演算に続き、今回はAIや機械学習の計算で基本となる**「2次元のテンソル(行列)」**同士の演算方法を整理します。行列の足し算や、要素ごとの掛け算、そしてディープラーニングの内部で多用される「行列積(ドット積)」の具体的な書き方をコードと出力結果で確認していきましょう。

1. 【 概要 】

2次元のテンソルとは、行と列を持つ「行列(Matrix)」のデータ構造です。

tf.constant() に入れ子のリスト(リストのリスト)を渡すことで、2次元テンソルを簡単に作成できます。Python標準の数値計算と異なり、TensorFlowの関数や演算子は自動的に並列計算や効率的な行列処理を行ってくれます。


2. 【 基本手順(2つのステップ) 】

(1) 入れ子リストを用いた2次元テンソルの定義
matrix_a = tf.constant([[1, 2], [3, 4]]) のように、行と列を持つデータを定義する。
(2) 要素ごとの演算(要素積)と、数学的な行列積の実行
通常の四則演算子による「要素ごとの計算」と、tf.matmul() による「行列積」を使い分ける。

3. 整理:行列演算の「要素ごとの計算」と「行列積」の違い

行列を扱う際につまずきやすい「2つの計算方法の違い」を整理しておきましょう。

【 演算の種類と特徴 】

・要素ごとの演算(+, -, *, /)
同じ位置にある要素同士(例:1行1列目同士)で計算を行います。例えば A * B を行うと、それぞれの要素が掛け合わされます(アダマール積)。

・行列積(tf.matmul)
線形代数における通常の「行列のかけ算(行×列の計算)」を行います。ディープラーニングの全結合層などで頻繁に使用される極めて重要な計算です。

・出力値(shape)の確認
2次元テンソルを出力すると shape=(2, 2) のように表示され、何行何列のデータ構造であるかが一目でわかります。

4. 関連して押さえたい「2次元テンソル演算の主な関数」

TensorFlowで2次元テンソルを操作する際に役立つ代表的な関数です。

・要素ごとの掛け算:tf.multiply(a, b) (演算子: a * b)
・数学的な行列積:tf.matmul(a, b) (演算子: a @ b)
・形状の確認や変更:tensor.shape や tf.reshape()


5. 補足:Pythonでの実装コード例

Google Colab等でそのまま実行できる2次元テンソル演算のサンプルコードと実際の実行結果です。

# コード実行例
import tensorflow as tf

# 1. 2つの2次元テンソル(2x2行列)を定義
matrix_a = tf.constant([[1, 2],
[3, 4]])
matrix_b = tf.constant([[5, 6],
[7, 8]])

# 2. 要素ごとの加算と掛け算
add_result = matrix_a + matrix_b # 行列の足し算
element_mul = matrix_a * matrix_b # 要素ごとの掛け算(アダマール積)

# 3. 本格的な行列積(ドット積)
matmul_result = tf.matmul(matrix_a, matrix_b)

# 4. 結果の表示
print("--- 行列の足し算 ---")
print(add_result.numpy())
print("\n--- 要素ごとの掛け算 ---")
print(element_mul.numpy())
print("\n--- 行列積(tf.matmul) ---")
print(matmul_result.numpy())

# 出力結果
# --- 行列の足し算 ---
# [[ 6 8]
# [10 12]]
#
# --- 要素ごとの掛け算 ---
# [[ 5 12]
# [21 32]]
#
# --- 行列積(tf.matmul) ---
# [[19 22]
# [43 50]]

6. まとめ

TensorFlowにおける2次元テンソルは、tf.constant() で直感的に定義でき、通常の足し算や要素ごとの計算だけでなく、AI開発に不可欠な「行列積(tf.matmul)」を簡単に計算できます。データが何次元でどのように処理されているかを意識することで、AIモデルの構造もぐっと理解しやすくなります!


【DS検定対策】パラメータごとに学習率を自動調整!「AdaGrad」の仕組み

ディープラーニングの学習において、すべてのパラメータに同じ「学習率」を使い続けるのは効率が悪い場合があります。そこで、過去の勾配の大きさに応じて「パラメータごとに個別の学習率を自動で更新・調整する」仕組みを持った最適化手法が「AdaGrad(アダグラッド)」です!

1. 【 問題 】

ニューラルネットワークの最適化アルゴリズムにおいて、これまでの学習で得られた勾配の二乗和を蓄積し、それを利用してパラメータごとに学習率を自動的に小さく調整しながら最適化を行う手法を何と呼ぶでしょうか?

① AdaGrad(Adaptive Gradient Algorithm)
② モーメンタム(Momentum)
③ 確率的勾配降下法(SGD)
④ バッチ正規化(Batch Normalization)


2. 【 解答 】

正解: ① AdaGrad(Adaptive Gradient Algorithm)

3. 整理:AdaGradの仕組みと画期的なポイント

通常のSGDでは固定だった「学習率」を、パラメータごとにどう変化させるのかを整理しましょう。

項目の特徴内容と動作
勾配の二乗和の蓄積 これまでに発生した勾配(の二乗)をすべて足し算して記憶していきます。たくさん大きく動いたパラメータほど、蓄積値が大きくなります。
学習率の自動調整
(適応的学習率)
分母に「勾配の二乗和の平方根」を置くことで、大きく激しく動いたパラメータの学習率は自動的に小さく(ブレーキ)なり、あまり動いていないパラメータの学習率は相対的に大きく(アクセル)なります。

4. AdaGradのメリットと「致命的な弱点」

【 メリット 】
・自分で学習率を手動で細かくチューニングしなくても、パラメータごとに最適なペースで効率よく学習が進みます。

【 致命的な弱点(学習の停滞) 】
・過去の勾配の二乗和を「ずっと無限に足し続け」ていくため、学習が進めば進むほど分母(過去の蓄積)がどんどん巨大になります。
・その結果、学習率が実質的にゼロに近づき、途中で学習が完全に止まってしまう(動かなくなる)という弱点があります。(※この弱点を解決したのが RMSprop や Adam です!)

5. DS検定形式:実戦4択クイズ

問:ディープラーニングの最適化アルゴリズムである「AdaGrad」に関する記述として、最も適切なものはどれか。

① 過去のすべての勾配の二乗和を分母に蓄積し、パラメータごとに個別の学習率を自動調整して最適化を行う手法である。
② 物理の慣性(運動量)の概念を取り入れ、前回のパラメータ更新の方向と勢いを次の更新に引き継ぐ手法である。
③ ミニバッチごとにデータの平均と分散を計算し、強制的にデータを標準化して勾配消失を防ぐ手法である。
④ ネットワークの過学習を防止するために、ランダムに一部のニューロンの結合を遮断しながら学習を進める手法である。

【 正解: ① 】

解説: AdaGradの定義と特徴を問う標準問題です。
①が正解です。勾配の二乗和を蓄積し、パラメータごとの学習率を自動調整します。
②は「モーメンタム」の説明です。
③は「バッチ正規化」の説明です。
④は「ドロップアウト」の説明です。


6. まとめ

DS検定や資格試験で「パラメータごとの学習率の自動調整」「過去の勾配の二乗和を蓄積」「学習が途中で止まってしまうリスク」といったキーワードが出たら、正解は「AdaGrad」です! 先ほどのモーメンタム(慣性)とあわせて、最適化アルゴリズムの代表例としてしっかり押さえておきましょう!

【DS検定対策】慣性の力で最適化を加速!「モーメンタム(Momentum)」の仕組み

ディープラーニングの学習で使われる通常の確率的勾配降下法(SGD)は、パラメータが非効率なジグザグ運動をしてしまい学習が遅くなる弱点があります。これを解決するために「物理の慣性(運動量)」の考え方を導入した最適化手法が「モーメンタム(Momentum)」です!

1. 【 問題 】

ニューラルネットワークの最適化アルゴリズムにおいて、通常の確率的勾配降下法(SGD)に「前回の更新の勢い(慣性)」を意味する項を加え、パラメータの振動を抑えて収束を高速化させる手法を何と呼ぶでしょうか?

① モーメンタム(Momentum)
② ドロップアウト(Dropout)
③ バッチ正規化(Batch Normalization)
④ グリッドサーチ(Grid Search)


2. 【 解答 】

正解: ① モーメンタム(Momentum)

3. 整理:なぜモーメンタムが必要なのか?(転がるボールの例え)

通常のSGDとモーメンタムの違いは、「坂道を転がり落ちるボール」に例えると非常にわかりやすくなります。

手法動きの特徴・メリット / デメリット
通常のSGD
(確率的勾配降下法)
その瞬間の傾きだけで進むため、谷底に向かって左右に激しくジグザグと蛇行(振動)してしまい、なかなか効率よく進めない。
モーメンタム
(Momentum)
「前回の勢い(慣性)」を引き継ぐため、左右の無駄な揺れ(振動)が打ち消し合って相殺され、谷底の方向へまっすぐ加速(高速化)できる。

4. モーメンタムが持つ2つの強力なメリット

① 振動の抑制と学習の高速化:
・ジグザグ動くエネルギーが相殺されるため、効率的かつスピーディーに最適値(最小値)へ到達できます。

② 局所最適解(ローカルミニマム)の突破:
・学習途中で小さな窪み(行き止まり)にハマりそうになっても、これまでの「勢い(慣性)」があるため、勢いでその窪みを飛び越えて進むことができます。

5. DS検定形式:実戦4択クイズ

問:ディープラーニングの最適化アルゴリズムである「モーメンタム(Momentum)」に関する記述として、最も適切なものはどれか。

① 学習率を一定に保つのではなく、エポックが進むにつれて学習率を強制的にゼロまで直線的に減衰させる手法である。
② 物理の慣性(運動量)の概念を導入し、前回のパラメータ更新の方向と大きさを一定の割合で今回の更新に反映させることで、振動を抑え最適化を高速化する手法である。
③ ネットワークの過学習を防ぐため、ランダムに一部のニューロンを無効化しながら学習を進める正則化手法である。
④ ミニバッチごとのデータの偏りをなくすために、各層の入力データの平均と分散を強制的に正規化する手法である。

【 正解: ② 】

解説: モーメンタムの目的と仕組みを問う標準問題です。
②が正解です。慣性の力を取り入れて最適化をスムーズかつ高速にします。
①は学習率減衰(Learning Rate Decay)の説明です。
③は「ドロップアウト(Dropout)」の説明です。
④は「バッチ正規化(Batch Normalization)」の説明です。


6. まとめ

DS検定や資格試験で「物理の慣性」「前回の更新の勢いを引き継ぐ」「ジグザグした振動を抑える」「最適化の高速化」といったキーワードが出たら、正解は「モーメンタム(Momentum)」です! SGDの弱点である「非効率な蛇行」をカバーする必須の拡張手法として覚えておきましょう!