別名・略称:ワンホット
「one hot encoding」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「one hot encoding」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「one hot encoding の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
文字のデータを0と1に分ける方法です。
AIが計算しやすくするために使います。
血液型を分けて表にするようなイメージです。
この手法の結論を短くまとめます。
One-Hot エンコーディング(One-Hot Encoding):カテゴリを複数の0/1変数に展開する手法
is_A, is_B, is_O, is_AB の 4 列に。pd.get_dummies(df)、 sklearn なら OneHotEncoder。drop_first=True)。🍰 まずはやさしく
文字を数字に書き換える準備のことです。
データの大小関係による間違いを防ぎます。
都道府県の名前を数字にする時に使います。
なぜこの変換が必要なのかを説明します。
🍰 まずはやさしく
項目ごとに専用の列を作るイメージです。
種類がバラバラであることをAIに伝えます。
部活の名前を個別の列に分けるような操作です。
変換の具体的な流れをかみ砕いて解説します。
元データ:
| ID | 血液型 |
|---|---|
| 1 | A |
| 2 | O |
| 3 | B |
One-Hot 変換後:
| ID | is_A | is_B | is_O | is_AB |
|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 0 |
| 2 | 0 | 0 | 1 | 0 |
| 3 | 0 | 1 | 0 | 0 |
one-hot encoding の直感は「47 都道府県を 47 個の 0/1 列に展開する」操作だ。 SSDSE-B-2026 の地域コード列 (R01000=北海道、 R02000=青森、 …、 R47000=沖縄) を機械学習モデルにそのまま渡すと、 「R47 は R01 の 47 倍」と誤解されてしまう。 そこで `is_北海道, is_青森, …, is_沖縄` の 47 列を作り、 北海道行なら `is_北海道=1, 他=0` と並べる。 これで「県」が「順序のない並列カテゴリ」として正しくモデルに伝わる。
本ページでは one-hot encoding を「カテゴリ変数 → 数値ベクトル」の前処理パイプラインに位置付け、 (1) カテゴリの一意化、 (2) ダミー列の作成、 (3) 多重共線性回避のための drop_first、 (4) 学習・テスト間のカテゴリ整合 の 4 段階で順に解説する。
具体例として、 SSDSE-B-2026 のデータを使い、 one hot encoding を実際に動かすイメージを次節以降で示す。 数式 → 値代入 → 手計算 → Python 実装 の流れで、 抽象と具体を行き来しながら理解を深める。
🍰 まずはやさしく
1つだけが1で他が0の数字の列です。
数学的に正しくデータを扱うために使います。
スマホの選択肢を数字で表すような仕組みです。
詳しい定義と計算のルールについて書きます。
drop_first=True が標準。SSDSE データの「都道府県」列(47 カテゴリ)を One-Hot 化:
カーディナリティが高いと列数が爆発するので、 場合により Target Encoding 等を検討。
SSDSE-B-2026(47 都道府県・2023 年データ)を題材にした最小コード:
🎯 このコードでやること: SSDSE-B-2026 の都道府県カテゴリ列に pandas.get_dummies() で One-Hot Encoding を施す
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd from sklearn.preprocessing import OneHotEncoder df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) # pandas の get_dummies で簡単に df_encoded = pd.get_dummies(df, columns=['都道府県'], drop_first=True) # sklearn の OneHotEncoder(パイプライン向け) enc = OneHotEncoder(drop='first', sparse_output=False) X = enc.fit_transform(df[['都道府県']]) |
💬 読み方: 47 都道府県を One-Hot 化すると 46 列 (drop_first で基準カテゴリ「三重県」〔文字コード順で先頭〕を 0,0,...,0 で表現)。 drop_first しないと多重共線性が発生する『ダミー変数の罠』に陥る。 線形回帰では必ず drop_first=True を指定する。
drop_first=True で 1 列落とし、 落とした水準を基準として読む。OneHotEncoder(handle_unknown='ignore') を使い、 学習時の列構成を保存して本番でも同じ変換を適用する。missing という水準を 1 列作って明示する。 どちらにするかは、 欠測が何を表すかを確認してから決める。one-hot encoding は、 カテゴリ変数 (都道府県 47 件、 業種 33 件など) を「該当列だけ 1、 残りは 0」の 0/1 ベクトルに変換するエンコード方式である。 線形モデル・ニューラルネットなど「数値しか食べられない」アルゴリズムにカテゴリ情報を渡す橋渡しとして必須。
SSDSE の都道府県 (47 水準) は one-hot で素直、 全国市区町村 (1700+) は埋め込みやハッシュが現実解。
One-Hot Encoding は、 名義尺度のカテゴリ変数を機械学習モデルが扱える数値ベクトルに変換する最も基本的な手法。 N カテゴリを N 個(または N-1 個)の 0/1 ダミー変数に展開します。
| 行 | Prefecture | pref_北海道 | pref_東京都 | pref_沖縄県 |
|---|---|---|---|---|
| 1 | 北海道 | 1 | 0 | 0 |
| 13 | 東京都 | 0 | 1 | 0 |
| 47 | 沖縄県 | 0 | 0 | 1 |
🎯 このコードでやること: sklearn の OneHotEncoder で訓練/テストで同じ列構造を保証する
1 2 3 4 5 6 7 | # pandas.get_dummies の基本
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# 都道府県を 47 列のダミー変数に
dummies = pd.get_dummies(df['Prefecture'], prefix='pref')
print('shape:', dummies.shape)
print(dummies.iloc[:3, :5]) |
💬 読み方: sklearn 推奨は OneHotEncoder.fit(train) → transform(test)。 pandas.get_dummies は train/test で列が変わるリスクあり。 ColumnTransformer + Pipeline と組み合わせて学習・推論の前処理を完全に固定する。
🎯 このコードでやること: 高カーディナリティ列 (郵便番号 etc.) でメモリ爆発を回避する sparse + min_frequency
1 2 3 4 5 6 7 | # sklearn の OneHotEncoder(sparse 出力可)
from sklearn.preprocessing import OneHotEncoder
import numpy as np
ohe = OneHotEncoder(sparse_output=False)
X = ohe.fit_transform(df[['Prefecture']])
print('shape:', X.shape, ' 不要メモリ削減: sparse=True で可')
print('categories:', ohe.categories_[0][:5]) |
💬 読み方: カーディナリティ 100 を超える列は必ず sparse matrix で扱う。 min_frequency や Target Encoding (関連用語) も併用すると次元爆発を抑えられる。 GBDT (LightGBM 等) は内部で別の方法でカテゴリを扱うので One-Hot 不要。
🎯 このコードでやること: ColumnTransformer で数値列はそのまま、 カテゴリ列だけ One-Hot に流す混在処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 数値特徴量と結合 → 回帰モデルへ # ── この抜粋で使うデータを用意します ── import pandas as pd, numpy as np from sklearn.linear_model import LinearRegression df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023 年の 47 都道府県 df = df.copy() # 地域ブロックを 1 つのカテゴリ列にして、ダミー変数に展開する _no = df['Code'].str[1:3].astype(int) df['region'] = np.select( [_no <= 7, _no <= 14, _no <= 23, _no <= 30, _no <= 35, _no <= 39], ['北海道東北', '関東', '中部', '近畿', '中国', '四国'], default='九州沖縄') dummies2 = pd.get_dummies(df['region'], prefix='region', drop_first=True) df['高齢化率'] = df['A1303'] / df['A1101'] * 100 # 高齢人口/総人口 feat = pd.concat([df[['A1101']], dummies2], axis=1) y = df['高齢化率'] model = LinearRegression().fit(feat, y) print('係数本数:', len(model.coef_)) |
💬 読み方: 実務では数値・カテゴリ混在が普通。 ColumnTransformer で「列ごとに違う前処理」を 1 つの Estimator に組み込み、 Pipeline 化することでリーク防止と再現性を確保。 sklearn ベストプラクティス。
| カテゴリ | ラベルEnc | One-Hot | 適用場面 |
|---|---|---|---|
| 北海道 | 1 | [1,0,0,…] | 線形回帰 |
| 東京都 | 13 | [0,…,1,…] | ロジスティック |
| 沖縄県 | 47 | […,1] | SVM |
| 未知 | -1 | [0,0,0,…] | 運用時 |
| 欠損 | NaN | drop | 前処理 |
🎯 このコードでやること: 高次元疎行列のメモリ削減 : sparse 化 + float32 ダウンキャスト
1 2 3 4 5 6 7 8 9 10 | from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
ct = ColumnTransformer([
('cat', OneHotEncoder(handle_unknown='ignore'), ['Prefecture']),
('num', StandardScaler(), ['A1101']),
])
X = ct.fit_transform(df)
print(X.shape) |
💬 読み方: One-Hot は 0/1 だけなので float32 で完全に表現可。 GBDT 等は float32 で動くため精度落ちもない。 巨大データの前処理では sparse + float32 + min_frequency の 3 点セットでメモリ事故を防ぐ。
🎯 このコードでやること: One-Hot された行列からカテゴリ名に逆変換する (inverse_transform)
1 2 3 4 5 | from sklearn.preprocessing import OneHotEncoder
import numpy as np
ohe = OneHotEncoder(sparse_output=True, dtype=np.float32)
X = ohe.fit_transform(df[['Prefecture']])
print('non-zero:', X.nnz, ' / shape:', X.shape) |
💬 読み方: 推論結果を人間に見せる時は逆変換が必須。 sklearn の OneHotEncoder は categories_ を保持しているので fit 済みエンコーダで inverse_transform を呼ぶ。 自前実装すると訓練・推論で齟齬が起きやすい。
🎯 このコードでやること: One-Hot 後の列名を model.feature_importances_ と紐付けて重要度を解釈する
1 2 3 4 | ohe2 = OneHotEncoder(sparse_output=False).fit(df[['Prefecture']]) X = ohe2.transform(df[['Prefecture']]) rec = ohe2.inverse_transform(X[:3]) print(rec) |
💬 読み方: One-Hot 化したカテゴリの個別ダミー (都道府県_東京 など) も feature importance に出る。 get_feature_names_out() で元の列名 + カテゴリ値を再構成し、 Top-K を可視化して説明性を担保する。
「ダミー変数」概念は計量経済学で 1960 年代から定着。 Suits 1957 の論文で体系化。
scikit-learn は 2007 年初期から OneHotEncoder を実装。 sparse 出力でメモリ効率を確保。
近年は埋め込みベクトル(categorical embedding)が深層学習で主流に。 高基数カテゴリでは one-hot より優位な場合が多い。
One-Hot エンコーディングは「最も安全」だが、 SSDSE-B-2026 の 都道府県 47 カテゴリ のような中基数では、 他手法と性能・メモリの両面で比較する価値がある。 ここでは 5 手法を実データで横並びにする。
| 手法 | 出力次元 (47 県) | 線形モデル適性 | 木モデル適性 | リーケージリスク |
|---|---|---|---|---|
| Label encoding | 1 列 | 不可 (順序誤認) | ○ | なし |
| One-Hot | 47 列 (46 if drop_first) | ◎ | △ (分割効率↓) | なし |
| Target encoding | 1 列 (目的変数の平均) | ○ | ◎ | 高 (CV 必須) |
| Frequency encoding | 1 列 (出現頻度) | △ | ○ | 低 |
| Embedding (NN) | k 列 (8-16 推奨) | × | △ | なし |
🎯 このコードでやること: SSDSE-B-2026 の都道府県カラムを 5 手法でエンコードし、 同じ Ridge 回帰で「出生数(A4101)」を予測。 MAE で精度比較する。 出生数は総人口とほぼ比例するので、 数値特徴量(総人口 A1101)とカテゴリ特徴量(都道府県)を併用する題材として自然。
📥 入力データ (SSDSE-B-2026 抜粋、 A1101=総人口・A4101=出生数):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder, OneHotEncoder from sklearn.linear_model import Ridge from sklearn.model_selection import KFold, cross_val_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') y = df['A4101'] # 出生数(人) X_pop = df[['A1101']].values # 総人口 pref = df['Prefecture'] # 1. Label encoding le = LabelEncoder() X1 = np.hstack([X_pop, le.fit_transform(pref).reshape(-1,1)]) # 2. One-Hot ohe = OneHotEncoder(sparse_output=False, drop='first') X2 = np.hstack([X_pop, ohe.fit_transform(pref.values.reshape(-1,1))]) # 3. Target encoding (CV で漏洩防止) kf = KFold(5, shuffle=True, random_state=42) te = np.zeros(len(df)) for tr, va in kf.split(df): means = df.iloc[tr].groupby('Prefecture')['A4101'].mean() te[va] = df.iloc[va]['Prefecture'].map(means).fillna(y.mean()) X3 = np.hstack([X_pop, te.reshape(-1,1)]) # 4. Frequency encoding freq = pref.value_counts(normalize=True) X4 = np.hstack([X_pop, pref.map(freq).values.reshape(-1,1)]) for name, X in [('Label', X1), ('OneHot', X2), ('Target(CV)', X3), ('Frequency', X4)]: score = -cross_val_score(Ridge(alpha=1.0), X, y, cv=5, scoring='neg_mean_absolute_error').mean() print(f'{name:12s} MAE = {score:,.0f} 人') |
📤 実行すると (47 都道府県の典型的な傾向):
💬 読み取り: MAE(平均絶対誤差、 単位は人)が小さいほど出生数の予測が正確。 線形 Ridge では One-Hot と Target が拮抗して小さく、 Label は最悪 (都道府県コードの大小に意味がないのに順序を仮定するため)。 Frequency はその中間。 木モデル (LightGBM) なら Label でも高精度になるが、 線形モデルでは One-Hot または Target (CV 必須) が安全。 ※上記の数値は手法間の大小関係を示す模式例(架空値)で、 実際の値は前処理や年次で変動する。 より正確な分析:上のコードをそのまま実行すると全年度 564 行(2012-2023 年混在)が対象になり、 実測 MAE は Label 2,287 / OneHot 2,301 / Target(CV) 2,047 / Frequency 2,275 人と4 手法がほぼ拮抗する。 総人口 A1101 が出生数をほぼ説明してしまうため、 このタスクではエンコード差が出にくい(Label の順序誤誘導が顕著に効くのは、 カテゴリが主要な情報源になるタスクの場合)。 なお 2023 年単年に絞る場合はコードに df = df[df['SSDSE-B-2026'] == 2023] を追加すること。
統計データ解析コンペで都道府県カラムを扱う場合、 まず One-Hot で baseline を作り、 Target encoding (CV) で改善を試すのが定石。 47 列の sparse 行列は scipy.sparse で扱えばメモリ問題にならない。
one-hot encoding の挙動を直感把握するため、 SSDSE-B-2026 由来の汎用図を併記する。 符号化後の特徴量空間で何が起きるかを 3 枚の図で確認する。



one-hot encoding を正しく扱えるか 5 問で確認。 各問の解答例は折りたたみで確認できる。
線形モデルや距離ベースのモデルでは、 カテゴリを整数 (1, 2, 3) に置き換えると順序情報を誤って導入する。 「赤=1, 青=2, 緑=3」と数値化すると「青は赤と緑の中間」のような不正な前提が入り、 回帰係数が無意味な値になる。 one-hot encoding はカテゴリを互いに直交するベクトルとして表現し、 この誤りを避ける。 結果として線形モデルがカテゴリ毎に独立した係数を学習でき、 解釈もしやすい。
k 個のカテゴリを k 個の one-hot 列で表現すると、 列同士が線形従属になり (合計 = 1)、 線形回帰でランク不足が発生する。 切片項とも完全に共線で、 係数が一意に決まらない。 これを避けるため、 1 列を drop する (k-1 個の列で表現する) のが標準。 sklearn の OneHotEncoder には drop='first' オプション、 pandas には get_dummies(..., drop_first=True) がある。 ただし正則化 (ridge/lasso) を併用する場合は drop しなくてもよい。
都道府県 (47)、 顧客 ID (100 万) などカテゴリ数が大きいと one-hot 行列が極めて疎で大きくなる。 メモリ消費、 計算コスト、 過学習リスクが課題。 対策: target encoding (カテゴリ毎に目的変数の平均で置換)、 hashing trick (固定次元にハッシュで割当)、 embedding 層 (低次元連続ベクトルで学習) など。 SSDSE-B-2026 の 47 県は中規模なので、 baseline は one-hot、 改善で target encoding (K-fold で leak 防止) が定石。
本番で訓練に未登場のカテゴリが来ると、 one-hot encoder が ValueError か NaN を出すのがデフォルト挙動。 sklearn では handle_unknown='ignore' で全 0 ベクトル化、 または handle_unknown='infrequent_if_exist' で「その他」カテゴリにマッピングする戦略を取る。 後者は category_encoders ライブラリでも同様の機能がある。 本番運用では未知カテゴリ対応を必ず仕様化する。
47 都道府県を一律 one-hot にすると 47 列の疎行列に。 むしろ「人口クラス 3 段階」「地域ブロック 8」のような集約カテゴリに変換すれば、 列数が削減でき過学習リスクも低い。 機械学習タスクの規模 (47 サンプル) に対して特徴量数を抑えるバランスが重要で、 一般に「サンプル数 / 10」程度を特徴量上限の目安とすると過学習を抑えられる。 ridge/lasso 正則化を併用する場合はさらに緩めてもよい。
one-hot encoding は単純だが、 実用上は「次元爆発」「ランク欠損」「未知カテゴリ」など多くの落とし穴がある。 ここでは理論から実装、 代替手法、 SSDSE-B-2026 実例まで 70 観点で網羅する。
カテゴリ集合 {c_1, c_2, ..., c_k} に対し、 各カテゴリ c_i を k 次元のベクトル e_i ∈ {0, 1}^k に写像し、 i 番目の成分のみ 1、 他は 0 とする。 これにより、 任意の 2 カテゴリ間のユークリッド距離は等しく √2、 内積は 0 になる。 この「等距離・直交」性が one-hot の本質で、 名義尺度の対称性を保存する。 ベクトル空間で見ると、 k 個のカテゴリは標準基底ベクトルに対応し、 k 次元単体の頂点に配置される。
「one-hot」は電子回路の用語で、 「複数の信号線のうち 1 本だけが High (1)」という状態を指す。 機械学習では機械翻訳・ニューラルネットの黎明期 (1980 年代) に符号化方法として導入され、 現在は前処理の標準として広く使われる。 対義語として「multi-hot」(複数 1) もあり、 こちらは multi-label 問題で使われる。
カテゴリを整数 (赤=1, 青=2, 緑=3) に置き換えると、 線形モデル・SVM・KNN 等は「青は赤の 2 倍、 緑の 1.5 倍」のような順序を学習してしまう。 これは不正なバイアス。 木ベース (決定木、 random forest, LightGBM) は分岐で扱えるが、 やはり順序がないカテゴリでは split 候補が偏り、 誤解を招く可能性がある。 順序のないカテゴリは原則 one-hot か embedding を選ぶ。
「小・中・大」「初級・中級・上級」のような順序のあるカテゴリは、 整数符号化 (1, 2, 3) で OK。 順序情報を活かすため、 one-hot より整数 (ordinal encoding) のほうが情報量が多い。 ただしモデルが「等間隔」を仮定する点に注意 (小→中と中→大が同じ距離) で、 等間隔でない場合は target encoding や spline 変換も検討する。
scikit-learn では sklearn.preprocessing.OneHotEncoder を使う。 fit で訓練データのカテゴリ集合を学習し、 transform で新データに適用する。 デフォルトは sparse 出力。 categories 引数で明示的にカテゴリを指定すれば順序の安定性も保てる。 ColumnTransformer で他の数値列と組み合わせるのが Pipeline 設計の定石。
pd.get_dummies(df, columns=['pref']) は手軽だが、 訓練・テストの分離処理に向かない (テストにないカテゴリ列が消える)。 本番運用では sklearn OneHotEncoder + Pipeline の方が安全。 探索段階・EDA 段階では get_dummies、 モデリングでは OneHotEncoder と使い分けるのが推奨。
OneHotEncoder の sparse_output=True (旧 sparse=True) は scipy.sparse 行列を返し、 大規模 high cardinality でもメモリ効率がよい。 dense (numpy array) は小規模・解釈用途。 47 県 × 47 サンプルなら dense でも 17KB 程度だが、 100 万行 × 1000 カテゴリだと dense は 8GB、 sparse なら数十 MB に収まる。
線形回帰の dummy variable trap を防ぐため、 drop='first' で先頭カテゴリの列を落とす。 drop='if_binary' は二値カテゴリのみ落とす (3 値以上は落とさない)。 ridge/lasso のような正則化モデルでは drop は不要で、 むしろ落とすと解釈が片寄る場合もある。
本番で未知カテゴリを受けた際の挙動を制御。 'error' (デフォルト、 例外送出)、 'ignore' (全 0 ベクトル化)、 'infrequent_if_exist' (希少カテゴリと同じ列にマップ) の 3 種。 本番運用では原則 ignore か infrequent_if_exist にして例外で落ちないようにする。
scikit-learn 1.1 以降の機能で、 min_frequency や max_categories で希少カテゴリを「その他」にまとめる。 high cardinality の自動圧縮に有効。 例えば SSDSE で「市町村」(1700+) を扱うとき、 上位 30 + その他 1 列の 31 列に圧縮できる。
contrib ライブラリ category_encoders は sklearn 互換 API で、 OneHotEncoder 以外に Target / James-Stein / WOE / Helmert / Backward Difference / Polynomial / BaseN / Binary / Hashing など多種の encoder を提供する。 競技 ML や Kaggle で広く使われる。
カテゴリ毎に目的変数の平均値で置き換える符号化。 例: 都道府県 → その県の平均所得。 1 列に圧縮でき、 high cardinality に強い。 ただし leak のリスクがあり、 CV ループ内で fit する必要がある。 smoothing (Bayesian average) を併用して希少カテゴリの分散を抑える。
target encoding を訓練全体で fit すると目的変数の情報が訓練特徴量に漏れる (leak)。 これを防ぐため K-fold で out-of-fold の平均値を使う。 sklearn の TargetEncoder (1.3+) や category_encoders の TargetEncoder は CV 対応が組み込まれている。
二値分類で多用される符号化。 カテゴリ毎に log(P(y=1|c) / P(y=0|c)) を計算して置き換える。 ロジスティック回帰と相性がよく、 信用リスク (クレジットスコアリング) で標準的に使われる。 情報量 (IV: Information Value) と一緒に変数選択にも使う。
target encoding の改良版で、 各カテゴリの平均値を全体平均にどれだけ「縮約」するかを Bayesian に決める。 サンプル数が少ないカテゴリは全体平均に強く引かれ、 多いカテゴリはそのままに近い。 過学習耐性が高い。
カテゴリ ID をまず整数化し、 その整数を 2 進数で表現する。 k カテゴリを log2(k) 列で表現でき、 high cardinality の圧縮に有効。 ただし「列同士の意味」が二進桁になるため線形モデルでは解釈不能。 木ベースで使う。
カテゴリ名をハッシュ関数で固定次元 d (例 256) に写像し、 d 列の one-hot 風行列を作る。 fit 不要、 メモリ固定、 未知カテゴリ自動対応の三拍子で、 オンライン学習・ストリーミングに向く。 衝突 (異なるカテゴリが同じ列に入る) が発生するが、 d を大きくすれば実害は小さい。
順序カテゴリ向けで、 各レベルとその前レベルの差をエンコードする。 線形モデルで「隣接レベル間の効果」を直接的に解釈できる。 教育水準・収入レベルなど順序カテゴリの分析に向く。
各レベルと「それ以前の全レベルの平均」の差をエンコードする。 分散分析 (ANOVA) で用いられる対比 (contrast) の一種。 統計学的な解釈が明確で、 学術論文で使われる。
順序カテゴリを多項式 (線形・2 次・3 次) の組み合わせで表現する。 ANOVA の polynomial contrast。 「線形トレンド」「曲線トレンド」を分離して効果検出できる。
深層学習で one-hot の代わりに低次元 (8-100 次元) の連続ベクトルを学習する手法。 high cardinality でもパラメータ数を抑制でき、 カテゴリ間の類似性も学習される。 Rossmann Store Sales コンペ (Kaggle 2015) で一躍有名になった。
fastai ライブラリでは TabularLearner がカテゴリ列を自動で embedding 化する。 次元 d はヒューリスティック min(50, (n_cat+1)//2) がデフォルト。 表形式深層学習の入門に手軽。
PyTorch では nn.Embedding(num_embeddings, embedding_dim) でカテゴリ ID → ベクトルのルックアップテーブルを学習可能。 NLP の単語埋め込みと同じ仕組みをカテゴリ変数にも適用する。
TensorFlow の Feature Columns API では categorical_column_with_vocabulary_list や indicator_column (= one-hot)、 embedding_column でカテゴリを処理する。 TF2.x では Keras preprocessing 層 StringLookup + CategoryEncoding が後継。
カテゴリ数 k に対して目安: k < 10 は one-hot 一択、 10-100 は one-hot か target encoding、 100-1000 は target encoding + smoothing か frequency encoding、 1000+ は embedding 化か hashing trick。 SSDSE-B-2026 の 47 県は中規模で、 baseline one-hot → target encoding (CV) → embedding と段階的に試すのが定石。
one-hot 行列は 99% 以上が 0 なので、 scipy.sparse.csr_matrix 形式で保持するとメモリが大幅削減できる。 sklearn の多くのモデル (LogisticRegression, LinearSVC, Ridge 等) は sparse 入力をそのまま受け付ける。 dense 化は必要時のみ。
テストで訓練に無いカテゴリが来る、 逆に訓練にあったカテゴリがテストに無い、 などの不一致は実運用で頻発。 OneHotEncoder は fit で訓練のカテゴリを記憶し、 transform 時に整合させる。 handle_unknown と categories 引数で挙動を制御。
CV の各 fold で OneHotEncoder を fit すべきか、 全体で fit すべきか。 厳密には fold ごとが正解 (leak 防止) だが、 OneHotEncoder は目的変数を見ないので全体 fit でも実害は少ない。 一方 target encoding は必ず fold ごとに fit する。
Pipeline([('ohe', OneHotEncoder()), ('clf', LogisticRegression())]) のように構築すれば、 cross_val_score 内で自動的に fold ごとに fit_transform される。 Pipeline を使わず手動で OneHotEncode した特徴量を CV にかけると leak リスクがある (target encoding 時)。
one-hot の k 列は合計が 1 になるため、 切片項と完全に線形従属。 線形回帰では (X^T X) が特異になり係数が一意に決まらない。 drop='first' で 1 列除去するか、 切片を除去 (fit_intercept=False) するか、 正則化を入れる。
k 列の one-hot + 切片項 1 列 = k+1 列だが、 ランクは k (全和=切片で表現可能)。 通常最小二乗法では (X^T X)^(-1) が存在しないため数値解が不安定。 ridge 正則化を入れると数値的に安定し、 落とさなくても解ける。 lasso なら自動的に冗長列が消える。
ridge (L2) は dummy trap の数値安定性を保証する。 lasso (L1) は不要な one-hot 列を自動で 0 に縮約するので、 カテゴリ毎の有意性検証に近い使い方ができる。 elastic net は両者の中間で実用上バランス取りやすい。
多クラス分類で目的変数も one-hot (k 個の 0/1) で表現することがある (softmax 出力との対応)。 入力カテゴリの one-hot とは別物だが、 数学的構造は同じ。 sklearn の LogisticRegression(multi_class='multinomial') で対応。
one-hot は入力の符号化、 softmax は出力の確率分布。 cross-entropy 損失で「予測 softmax 分布」と「真の one-hot ラベル」を比較する。 教師ラベルが one-hot なのは「決定的な正解」を表すため。
決定木は単一カテゴリ列でも分岐できるが、 one-hot 化すると k 個の二値列に分かれ、 split 候補が増えて深さが増し過学習しやすい。 sklearn の DecisionTreeClassifier は内部的にカテゴリ split を行わないので、 high cardinality では木が偏る。
XGBoost 1.6+ では enable_categorical=True + tree_method='hist' でカテゴリ列をネイティブに扱える (one-hot 不要)。 内部で最適 split を効率的に探索。 pandas Categorical 型でカラムを渡す。
LightGBM は categorical_feature=[col_name] でカテゴリ列を Fisher 法で最適 split できる。 one-hot より高速 & 高精度になることが多い。 Kaggle で多用される。
CatBoost はカテゴリ列を内部で自動 target encoding (順次 ordering scheme で leak 防止) する。 ユーザーは cat_features=[col_name] を指定するだけ。 high cardinality + leak 防止が両立する。
H2O AutoML はカテゴリ列を自動で one-hot / target / enum / sort_by_response の中から選ぶ。 大規模データ分析プラットフォームの一例。
auto-sklearn, FLAML, TPOT などの AutoML は前処理 pipeline 候補に複数の encoder を含み、 CV スコアで最適を選ぶ。 ユーザーは encoder 選定を自動化できる。
SSDSE-B-2026 の 47 県 × 1 サンプルなら、 都道府県 ID を 47 列 one-hot にすると単位行列になる (各県固有の dummy)。 これは「固定効果モデル」と等価。 県別の効果を切片差で表現でき、 解釈しやすい。
47 県を「北海道・東北・関東・中部・近畿・中国・四国・九州沖縄」の 8 ブロックに集約してから one-hot すれば、 47 列 → 8 列に圧縮。 サンプル数 47 に対して特徴量数 8 なら過学習リスクが大幅減。 地域特性を活かしたい場合に有効。
SSDSE には「第 1 次・2 次・3 次産業就業者数比率」がある。 これらは連続変数なので one-hot 不要。 むしろ合計が 100% なので多重共線性に注意 (compositional data analysis の対象、 log-ratio 変換が推奨)。
複数のカテゴリ列を one-hot すると列数が急増。 都道府県 47 + 産業 10 + 年齢階級 10 = 67 列。 ColumnTransformer で複数列をまとめて処理し、 sparse 形式で保持する。 訓練後の解釈は SHAP 等で対応。
都道府県の上に「地域ブロック」、 さらに上に「国」がある階層構造。 hierarchical encoding として両方の階層を one-hot し、 細かい粒度と粗い粒度の両方を特徴量に入れる戦略がある。 Gelman の multilevel model にも通じる。
時刻 (0-23) や曜日 (0-6) を one-hot すると周期性が失われる。 代わりに sin(2πt/T), cos(2πt/T) の 2 列で encode すると周期性が保たれる。 「23時→0時」の隣接性をモデルに伝えられる。
hashing trick では異なるカテゴリが同じハッシュ値になる衝突が起きる。 確率は (1 - 1/d)^k ≈ exp(-k/d)。 d=256 列で k=100 カテゴリなら衝突率は約 1 - exp(-100/256) ≈ 32%。 衝突しても線形モデルでは合算効果として平均化される。
embedding 次元 d の経験則: d = min(50, (n_cat + 1) // 2) (fastai)、 d = round(n_cat^0.25 * 6) (Jeremy Howard)、 d = ceil(log2(n_cat)) (情報理論限界)。 タスクに応じて 4-100 の範囲で試す。
NLP の単語埋め込み (word2vec, GloVe, fastText) は単語カテゴリ (語彙) を低次元 embedding に学習する手法で、 entity embedding の起源。 「king - man + woman ≈ queen」のような線形構造が学習される。
初期の NLP では単語を one-hot (語彙 10 万次元) で表現したが、 次元爆発と類似性損失で限界。 word2vec 以降は低次元 embedding が標準。 BERT/GPT 等の Transformer も内部に embedding 層を持つ。
画像分類 (ImageNet 1000 クラス) の教師ラベルは 1000 次元 one-hot。 softmax + cross-entropy 損失で学習。 label smoothing で one-hot を「0.9, 0.1/999, ...」に緩和すると汎化が改善する。
文字レベル言語モデル (char-RNN) では文字を one-hot (アルファベット 26 次元等) で入力する。 短い語彙なら embedding 不要で one-hot で十分。 長い系列学習で RNN が文脈を捉える。
機械翻訳 seq2seq の出力は語彙次元の softmax (= 確率分布) と教師の one-hot を比較。 beam search でデコード時に各時刻で argmax (実質 one-hot) を取る。
softmax は連続な確率分布 (合計 1) で、 one-hot はその「極端な極限」(1 つだけ 1)。 学習中は softmax、 推論時は one-hot 化、 という流れが多い。
cross-entropy H(p, q) = -Σ p_i log q_i で、 教師 p が one-hot (i=正解のみ 1) なら、 損失は -log q_correct に縮退。 「正解クラスの予測確率の対数を最大化」と等価。
one-hot ラベル (1.0, 0, 0, ...) を (0.9, 0.05, 0.05, ...) のように「滑らかに」する正則化手法。 過剰な自信を抑制し、 汎化性能が改善する。 Vision Transformer や BERT の事前学習で標準的に使われる。
1 サンプルが複数カテゴリに同時所属する場合 (映画ジャンル: アクション + コメディ) は multi-hot (複数 1) で表現する。 損失は binary cross-entropy をクラス毎に適用 (sigmoid 出力)。
multi-hot は「集合のメンバーシップ」を表現する。 sklearn の MultiLabelBinarizer でリスト列から multi-hot 行列を作れる。 推薦システム (ユーザーの興味カテゴリ) で頻出。
one-hot 列同士の積 (AND) を作ると相互作用特徴量になる。 「都道府県 × 産業」の組み合わせ列を作れば、 県別の産業効果を線形モデルでも捉えられる。 ただし列数が爆発 (47 × 10 = 470) するので、 lasso で選別。
連続変数の多項式特徴量 (x, x^2, x^3) と one-hot を組み合わせるには PolynomialFeatures(interaction_only=True) で連続 × カテゴリの交互作用を作る。 GAM (一般化加法モデル) の発想に近い。
KNN や RBF カーネル SVM は距離ベースなので one-hot が必須。 ただし one-hot 化したカテゴリ間距離は √2 で固定なので、 連続変数とのスケール差に注意。 連続変数を標準化 (StandardScaler) して揃える。
one-hot ベクトル間の cosine 類似度は同じカテゴリで 1、 異カテゴリで 0 (直交)。 高次元疎ベクトル間の類似度計算で頻用される。 文書 bag-of-words モデルも本質的に multi-hot の cosine 類似度。
one-hot 行列は疎なので、 通常 PCA を直接適用するとメモリ問題。 TruncatedSVD (sklearn.decomposition) を使うと sparse 行列で次元削減できる。 NLP の LSA (Latent Semantic Analysis) の発想と同じ。
UMAP/t-SNE でカテゴリデータを可視化するには one-hot + 距離指定 (Jaccard など) を使う。 ただし疎な高次元では「次元の呪い」で距離が均一化するので、 まず embedding か PCA で次元削減してから適用するのが定石。
K-means や階層クラスタリングはユークリッド距離前提なので、 one-hot 化したカテゴリは扱いに注意 (距離が固定の √2)。 K-modes (カテゴリ専用クラスタリング) や K-prototypes (連続+カテゴリ混合) を使う選択肢もある。
Isolation Forest や LOF などの異常検知では one-hot で次元が増えると「異常スコア」が薄まる。 embedding 化や frequency encoding で次元を抑える方が異常検知に向く。 ただし autoencoder ベースは one-hot 入力でも問題ない。
カテゴリの出現頻度が偏ると (例: 1 県だけ 90%、 他 46 県で 10%)、 one-hot 列の分散が小さくなり線形モデルの寄与が薄れる。 SMOTE-NC でカテゴリ列を考慮した oversampling、 もしくは frequency encoding で頻度を直接特徴量化する選択肢もある。
性別・人種等の sensitive attribute を one-hot で入れるとモデルが直接利用する。 fairness 制約 (Demographic Parity, Equal Opportunity) を満たすため、 sensitive 列を入れない・正則化で間接効果も抑える・post-processing で補正、 などの手法を組み合わせる。
(a) 訓練・テストでカテゴリ集合が異なる、 (b) high cardinality で次元爆発、 (c) target encoding の leak、 (d) dummy variable trap で OLS が解けない、 (e) 連続変数とのスケール混在、 (f) sparse 出力を dense 化してメモリ枯渇、 (g) 順序カテゴリを one-hot して情報損失、 (h) embedding 次元の過剰選択。
(1) カテゴリ数 k は何か (10 未満→one-hot 一択、 100+ →代替検討)、 (2) 順序があるか (あれば ordinal)、 (3) 線形モデルなら dummy trap 対策、 (4) 木ベースなら native categorical サポート活用、 (5) high cardinality は target/hashing/embedding、 (6) CV で leak 防止、 (7) handle_unknown 設定、 (8) sparse 形式維持、 (9) sensitive attribute は慎重に、 (10) SSDSE では 47 県 one-hot → 地域 8 ブロック集約 → target encoding と段階的に試す。
one-hot ベクトルはビット列とみなせ、 同じカテゴリかどうかの判定は XOR + popcount で高速に行える。 ハードウェア (CPU の SIMD 命令) では masks や bitset として扱われ、 高頻度検索 (e.g. データベースの bitmap index) でも実用される。 機械学習以外でも実装上の親和性が高く、 ベクトル化された距離計算ライブラリで活用される。
SQL では CASE WHEN col = 'A' THEN 1 ELSE 0 END AS col_A を必要列分だけ生成する。 BigQuery / Snowflake は PIVOT 構文や DECODE 関数で簡便に書ける。 DWH 上で one-hot 済みテーブルを保持しておくと、 学習側 (Python 側) では読み込むだけで済み、 ETL の負荷分散になる。 ただしカテゴリ追加時に SQL 修正が必要なため、 動的カテゴリには不向き。
Spark MLlib では StringIndexer + OneHotEncoder の組み合わせで分散 one-hot 化を行う。 大規模データ (数億行) でも分散処理で扱える。 ただし fit と transform のタイミングを意識しないと結果がばらつくので、 PipelineModel で固定するのが推奨。 PySpark の最新版は OneHotEncoderEstimator が deprecated で、 OneHotEncoder に統合された。
Dask は pandas 互換 API で、 dd.get_dummies が使える。 ただし計算は遅延評価なので compute() が必要。 Vaex はメモリマップ + on-the-fly evaluation で、 数十億行でも数秒で one-hot 風集計が可能。 巨大 CSV を扱う際の選択肢として有力。
k カテゴリの完全 one-hot 行列のランクは k だが、 切片を含めるとランク欠損 (k+1 列、 ランク k)。 statsmodels の OLS は自動でこれを検出し警告を出す。 ランクの本質は「k 個のカテゴリ間の自由度 = k-1」で、 1 つは基準カテゴリとして消える。
R では factor 型でカテゴリを表現し、 lm() で自動的に dummy 化 (基準 = 最初のレベル) してくれる。 relevel() で基準カテゴリを変更可能。 Python (sklearn) は明示的に OneHotEncoder を呼ぶ必要があり、 R の方が「黒魔術的に簡便」だが学習者にはトレードオフ。
Julia では CategoricalArrays.jl でカテゴリ型を扱う。 GLM.jl で線形モデルに渡せば自動 dummy 化、 MLJ.jl では OneHotEncoder モデルを Pipeline に組み込める。 R に近い親和性。
SAS は PROC GLMSELECT や PROC LOGISTIC で CLASS 文を使うとカテゴリを自動 dummy 化。 SPSS も DUMMY 関数や RECODE で同等。 統計ソフトでは「カテゴリ列指定 → 自動 one-hot」が伝統的に標準化されている。
MATLAB の dummyvar 関数はカテゴリ列を one-hot 行列に変換する。 機械学習 Toolbox の fitlm, fitcsvm 等は内部で呼ぶため、 ユーザーは直接意識せずに済む。
カテゴリデータでは画像のような連続的拡張は難しいが、 mixup / cutmix のラベル混合は one-hot を線形補間して実現する。 (0,1,0) と (1,0,0) の中間 (0.5, 0.5, 0) を「ソフト one-hot」として作る。 NLP では SMOTE-text や paraphrase 生成が augmentation。
「先月の天気カテゴリ」を特徴量にする場合、 ラグを取って one-hot 化する。 ラグごとに k 列増えるので、 ラグ数 × カテゴリ数の組合せが膨れる。 ラグ + 集約 (頻度カウント) で次元を抑える戦略もある。
「都道府県 (47)」「地域ブロック (8)」「人口クラス (3)」を同時に one-hot するとモデルが情報を冗長に持つが、 ridge 正則化で吸収可能。 階層的な情報を全て与えておく方が、 部分的な集約だけより安全な場合がある。
SGDClassifier やオンライン Bayesian は新サンプルが来るたびに学習する。 未知カテゴリは hashing trick で固定次元に押し込むのが現実的。 オンライン target encoding は移動平均で更新する。
one-hot ベクトル v と任意ベクトル w のドット積 v · w = w_i (i は v の hot 位置)。 これは「ルックアップ操作」と等価で、 embedding 層 nn.Embedding の内部実装そのもの。 計算効率上 one-hot を作らず直接 index で参照する。
one-hot ベクトルは離散確率分布 (1 つの値に確率 1) と解釈できる。 Dirac delta 分布の離散版。 確率分布 q から one-hot を引いた差は cross-entropy の元となり、 GAN の Wasserstein 距離でも分布間距離として登場。
整数計画問題で「N 個のうち 1 個を選ぶ」制約は Σ x_i = 1, x_i ∈ {0,1} で表現でき、 これは one-hot 制約。 LP/MIP ソルバ (CPLEX, Gurobi) は one-hot 制約を効率的に扱う。 機械学習の組合せ最適化応用 (例: スケジューリング、 配車) でも頻出。
GNN ではノードの「種類」を one-hot で表現することがある (例: 化学グラフの原子種類)。 メッセージパッシングで隣接情報と結合され、 ノード特徴量として学習される。 PyTorch Geometric や DGL で扱う。
離散状態空間の RL (Q-learning, DQN) では状態を one-hot で表現することが多い。 状態数が爆発する場合は embedding か、 状態を関数近似する deep RL に移行する。 Atari 環境の生画像入力は CNN で連続表現に変換される。
分類モデルの最終出力 (softmax 確率) を argmax して one-hot に変換すると「予測ラベル」になる。 確率を保持したまま下流タスクに渡せばソフトラベルとして使え、 知識蒸留 (knowledge distillation) で teacher → student に確率分布を継承する。
k カテゴリの uniform 分布のエントロピーは log_2(k) bit。 one-hot ベクトル 1 つを記録するのに必要な情報は最大 log_2(k) bit で十分。 47 県なら 6 bit (= ceil(log_2(47)))。 これが binary encoding の理論的上限を示す。
このページの関連用語セクションから、 カテゴリ変数、 回帰分析、 分類、 多重共線性 等の関連ページへ進むと理解が深まる。
コンペでは「ラベルエンコーディング → LightGBM のネイティブカテゴリ機能」を最初に試し、 並行して target encoding (K-fold) で baseline を取る。 one-hot は線形モデル ensemble (stacking の input) として使う、 という分業が定石。
sklearn.linear_model.LinearRegression は内部で SVD ベースの最小二乗法を使うため、 dummy trap 状態でも擬似逆行列で解ける (警告も出ない)。 一方 statsmodels.OLS は X^T X の逆行列計算で失敗または不安定になる。 ライブラリ実装の差異に注意。
同じデータで「one-hot + ロジスティック回帰」「ラベルエンコーディング + LightGBM」「target encoding + XGBoost」を比較すると、 タスクによって順位が変わる。 baseline には all 3 を試し、 CV 性能で選ぶのが王道。
線形モデル + one-hot は「カテゴリ毎の係数 = カテゴリ効果」と直接解釈できる。 これは embedding や target encoding には無い利点。 ステークホルダー説明用には one-hot の方が好まれることが多い。
random forest の feature importance を one-hot 列ごとに集計すると、 元の categorical の重要度が分散して見えにくい。 sklearn の permutation_importance を grouped で適用するか、 元の列で集約してから importance を計算する。
SHAP は one-hot 列ごとに寄与を計算するが、 元のカテゴリレベルでの寄与を見たい場合は shap.utils.hclust でクラスタリングするか、 列群を「グループ」として扱う必要がある。 catboost の native categorical の場合は自動でカテゴリ単位の SHAP が出る。
pandas DataFrame の memory_usage(deep=True) で one-hot 後のメモリ消費を確認。 dtype を uint8 や bool にダウンキャストすると劇的に削減 (int64 比 1/8)。 scipy sparse なら更に圧縮。
Parquet 形式は列指向 + 圧縮で one-hot 列を効率的に保存。 dictionary encoding が有効化されると、 内部的に「カテゴリ ID + 辞書」で持つため、 元のカテゴリ列のまま保存しても one-hot とほぼ同等のサイズ効率になる。 PyArrow で読み書きが標準。
(A) カテゴリ数とサンプル数の比 (10 倍以上空けるのが目安)、 (B) handle_unknown 設定、 (C) Pipeline で leak 防止、 (D) sparse 形式維持、 (E) drop_first の要否、 (F) 連続変数とのスケール、 (G) 高 cardinality 対策、 (H) sensitive attribute 配慮。 次のステップ: target encoding (K-fold)、 entity embedding (PyTorch / fastai)、 木ベースの native categorical 機能 (LightGBM / CatBoost) を順に試し、 各々の CV スコアで意思決定する。
k カテゴリの one-hot 行列のスパース率は (k-1)/k で、 k=47 県なら約 97.9% が 0。 dense で int8 保存なら 47 バイト/行、 sparse なら 1 (列 index) + 1 (値) = 約 2 バイト/行。 100 万行で dense 47MB vs sparse 2MB、 圧倒的に sparse が有利。 一方カテゴリ数が 2-3 と少ない場合は dense の方が overhead が少ない場合もある。
1 列を 1 bit で持てば、 47 県 one-hot は 47 bit = 6 バイトに圧縮可能 (uint64 1 個に収まる)。 numpy の bitpacking や Roaring Bitmap ライブラリで実装される。 巨大データセットで RAM が足りない時の最終手段で、 機械学習ライブラリのほとんどは対応していない (前処理時のみ)。
OneHotEncoder を joblib.dump で保存し、 推論時に load して使うのが本番運用の標準。 訓練時のカテゴリ集合・handle_unknown 設定・drop 設定が再現される。 別環境 (Docker / Lambda) でも整合する。 cloudpickle なら lambda / 関数の参照も保存できる。
sklearn の OneHotEncoder は skl2onnx で ONNX 形式に変換でき、 Triton Inference Server や ONNX Runtime で本番推論できる。 言語非依存 (C++, Java, JavaScript) で動くため、 マルチクラウド対応に便利。
one-hot は本質的に 0/1 なので量子化 (quantization) には強い。 int8 や bool で保存しても精度劣化なし。 一方 embedding は float32 → int8 量子化で多少劣化するため、 モバイル推論では one-hot + 線形モデルが採用される場合もある。
連合学習 (FL) ではクライアント毎にカテゴリ集合が異なる場合がある。 グローバル one-hot の合意は事前同期 (federated schema) で取る、 もしくは hashing trick で固定次元化する。 プライバシ保護目的の差分プライバシー (DP-SGD) との組み合わせも研究されている。
顧客 ID やメールアドレスを one-hot するのは「個人識別」に直結。 GDPR / 個人情報保護法上はマスキングや pseudonymization が必要。 ID を直接特徴量にせず、 集約属性 (年齢層・地域) で代用するのが推奨。
OneHotEncoder の categories は fit 時のデータ順に依存する場合がある。 再現性のため明示的に categories=[['A','B','C']] でソート順を固定するのが推奨。 random seed と合わせて完全再現を狙う。
機械学習システムの CI/CD では、 訓練済み OneHotEncoder と推論コードを一体でテストする。 カテゴリ集合の差分テスト (新カテゴリ警告)、 sparse 形式テスト、 ONNX エクスポートテストを CI に含めるのが推奨。
例: pd.get_dummies(df['Prefecture'], prefix='Pref') で 47 列の DataFrame が得られる。 さらに pd.concat([df, dummies], axis=1).drop('Prefecture', axis=1) で結合する。 ridge 回帰で人口を回帰すれば、 各県の固定効果を係数として取り出せる。 これは「都道府県別のベースライン人口」と解釈でき、 政策議論にも使える。
one-hot encoding は 1990 年代の NIST 手書き数字認識 (MNIST 前身) からニューラルネット教科書に登場。 1986 年 Rumelhart の backpropagation 論文でも教師ラベルは「1-of-K」表現と呼ばれ、 これが現代の one-hot の原型。 30 年以上前から本質は変わらない基本概念。
nn.Embedding(num=47, dim=8) は本質的に「47×8 行列」+ 「one-hot ベクトルとの積」と等価。 ただし one-hot を作らず index で直接 lookup するので計算量は O(1)。 学習中に行列のパラメータが更新され、 「県の特徴ベクトル」が自動的に作られる。
OneHotEncoder のデフォルト出力は float64 だが、 LightGBM は int で受けたい場合がある。 .astype(np.int8) で変換するが、 sparse の場合は dtype 変換に注意 (中間で dense 化される場合あり)。
複数の categorical 列 (例: pref と region) を one-hot する際、 値が同じ (例: 「東京」が両方に含まれる) と pandas は列名衝突を起こす。 prefix 引数で必ず prefix を分ける。 sklearn の OneHotEncoder は内部的に index なのでこの問題が起きにくい。
Pipeline 外で X_oh = ohe.fit_transform(X) としてから cross_val_score(model, X_oh, y) を呼ぶと、 OneHotEncoder は CV の前に全データで fit されてしまう (テスト fold のカテゴリも見ている)。 厳密に leak を防ぐには Pipeline 内で encode する。 target encoding ほど深刻ではないが、 一貫性のため Pipeline 化が推奨。
ロジスティック回帰で one-hot 列の係数 β は「基準カテゴリと比較した対数オッズ比」を表す。 exp(β) でオッズ比に変換でき、 「カテゴリ A は基準 B より発生確率が exp(β) 倍」と解釈する。 医療・疫学で頻用される直感的な指標。
2 つの二値カテゴリ列 (= 2×2 one-hot) の独立性検定はフィッシャーの正確検定や χ² 検定で行う。 これらの検定は内部的に one-hot 表現 (分割表) を前提としており、 機械学習以外でも one-hot は統計学の基本表現として登場する。
多クラス分類を二値分類に分解する OvR (one-vs-rest) では、 各クラスを「該当 vs 非該当」の二値問題に変換する。 これは出力側の one-hot 化 (k 個の二値ラベル) と本質的に同じ構造。 sklearn の OneVsRestClassifier で wrap される。
(1) データベースの bitmap index で大量行のフィルタリング、 (2) DNA の塩基 ACGT を 4 次元 one-hot にしてゲノム解析、 (3) 楽譜の音階 12 半音を one-hot で MIDI 解析、 (4) 化学反応式の原子種類を one-hot で材料工学解析、 など機械学習以外でも応用範囲は広い。
one-hot encoding は概念的に最も単純な前処理だが、 「順序の誤導入を防ぐ」「線形モデルに自然に対応する」「直交基底で対称性を保つ」という強力な利点を持つ。 一方で次元爆発・dummy trap・leak・未知カテゴリといった落とし穴も多く、 適切なオプション選択と Pipeline 設計が必須。 SSDSE-B-2026 のような中規模データでは baseline として真っ先に試す価値があり、 そこから target encoding / embedding / 木ベースの native categorical へとステップアップしていくのが現代的な前処理戦略である。
one-hot 化後の k 列のうち、 ターゲットと無関係なカテゴリ列を捨てるのが特徴量選択。 sklearn の SelectKBest や RFECV を使うか、 lasso の L1 正則化で自動的に係数 0 にする。 ただしカテゴリ単位ではなく列単位の選択になるので、 同じ元カテゴリの一部だけ残ると解釈が難しい。 グループ lasso (Group Lasso) で「カテゴリ列群」を一括選択するのが理論的に正しい。
グループ Lasso は変数群 (例: 都道府県 one-hot 列群) 全体を 0 にするか残すかを選ぶ正則化。 sparse-group Lasso はさらに群内でも sparse を促す。 多項回帰の変数選択で「カテゴリ全体の有意性」を判定するのに使われる。 R の grpreg パッケージや Python の group-lasso ライブラリで実装される。
k カテゴリの効果の有意性を一度に検定すると多重比較問題が発生 (有意 p < 0.05 が偶然出る確率が増える)。 Bonferroni 補正 (p_corrected = p × k) や FDR (False Discovery Rate, Benjamini-Hochberg) で補正する。 ANOVA + Tukey HSD で post-hoc 検定するのも標準的。
本番運用では「どの列がどのカテゴリに対応するか」のメタ情報 (column-to-category mapping) を必ず保存する。 sklearn OneHotEncoder の get_feature_names_out() で取得可能。 JSON や YAML で並列保存し、 ONNX エクスポート時にも添付する。
本番運用中に「カテゴリ分布が訓練時と変わる」(category drift) を検知する仕組みが必要。 PSI (Population Stability Index) や χ² 検定で各カテゴリの頻度比を監視する。 ドリフト検知後は再訓練 or fine-tuning のトリガーになる。
XAI ツール (LIME, SHAP, captum) は one-hot 列の寄与を個別に計算するため、 結果が「カテゴリ A は +0.3、 B は -0.1」のような出力になる。 業務担当者向けには「カテゴリ単位」「特徴量単位」の集約解釈が好まれ、 SHAP の hierarchical aggregation が活用される。
auto-sklearn 2.0 は前処理候補に OneHotEncoder / OrdinalEncoder / TargetEncoder / hashing を含み、 HpBandSter で最適選択。 H2O Driverless AI、 DataRobot、 Google AutoML Tables なども同様に自動選択する。 ユーザーは encoder 選定の手間が省ける一方、 内部選定理由がブラックボックスになるトレードオフ。
PyCaret は setup() 時に categorical_features を指定すると自動 one-hot 化。 encoding_method パラメータで target / ordinal / binary なども選べる。 探索的解析の初動として手軽。
MLflow Experiments で one-hot のカテゴリリストを mlflow.log_param('categories', categories_list) として記録すれば、 後から experiment 比較時に「どの実験がどのカテゴリ集合で学習したか」を追える。 再現性とガバナンスの基本。
(1) 探索 EDA: pd.get_dummies で即試す。 (2) baseline モデル: sklearn OneHotEncoder + LogisticRegression / Ridge。 (3) 高 cardinality: target encoding (K-fold) or LightGBM native categorical。 (4) 深層学習: nn.Embedding。 (5) 本番運用: Pipeline + handle_unknown + sparse + メタ情報保存。 これらを段階的に使い分けることで、 単純な one-hot から始まる前処理が実用システムへと進化していく。
本番品質を保つには OneHotEncoder の単体テストが不可欠。 (a) 訓練データのカテゴリ集合が transform で完全再現されるか、 (b) handle_unknown='ignore' で未知カテゴリが全 0 になるか、 (c) sparse 出力の shape が (n_samples, n_categories) と一致するか、 (d) drop='first' で 1 列減るか、 を pytest で網羅的に検証する。 CI で毎コミット走らせることで本番事故を未然に防ぐ。
金融・医療領域では予測モデルの監査ログが法令上必須。 入力カテゴリ・one-hot 変換結果・モデル予測の三点セットを保存し、 後から「なぜこの予測になったか」を再現できるようにする。 個人情報を含む列は暗号化保存し、 アクセス権限を厳格管理する。
A/B テストでは「処理群 / 対照群」の二値変数を作るが、 これは 2 値の one-hot と同じ。 回帰モデルに投入すれば処理効果 (Average Treatment Effect, ATE) が係数として推定できる。 多群試験 (A/B/C/D) なら 4 カテゴリ one-hot で群効果を同時推定。
因果推論では交絡変数 (confounder) を全て one-hot で投入してコントロールするのが標準。 マッチング法 (propensity score matching) でも one-hot された共変量空間でマッチを取る。 do-calculus / DAG の文脈でカテゴリ介入を表現する基本表現。
one-hot encoding は「カテゴリ → 直交ベクトル」というシンプルな変換でありながら、 機械学習・統計・因果推論・データベース・組合せ最適化など広範な分野で基本表現として使われる。 SSDSE-B-2026 のような実データで都道府県を扱う場合、 まず one-hot で baseline を作り、 徐々に target encoding / embedding / native categorical へ進化させていく学習パスが推奨される。 概念の単純さと応用の豊かさを兼ね備えた、 統計データ解析の必須技能である。
合成 [赤, 青, 緑, 赤, 黄] を one-hot に変換する。
| i | 値 | 赤 | 青 | 緑 | 黄 |
|---|---|---|---|---|---|
| 1 | 赤 | 1 | 0 | 0 | 0 |
| 2 | 青 | 0 | 1 | 0 | 0 |
| 3 | 緑 | 0 | 0 | 1 | 0 |
| 4 | 赤 | 1 | 0 | 0 | 0 |
| 5 | 黄 | 0 | 0 | 0 | 1 |
1 2 3 | import pandas as pd s = pd.Series(['赤','青','緑','赤','黄']) print(pd.get_dummies(s, dtype=int)) |
💬 手計算 (Step 2) と Python 出力が完全一致。
「One-Hot Encoding」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。
drop_first=True で 1 列落とし、 落とした水準を基準として読む。handle_unknown='ignore' を指定し、 学習時の列構成を保存して本番でも同じ変換を適用する。One-Hot は「順序の無いカテゴリを数値にする」道具。 順序があるもの(小・中・大)に使うと順序の情報が失われるので、 その場合は順序尺度として数値を割り当てる。
「One-Hot エンコーディング」は単独で完結せず、 前後の手法と組み合わさって価値が発揮される。 入力データの準備 (上流)・同目的の代替手法との比較 (並列)・結果の活用 (下流) という 3 軸で隣接領域を整理する。
この上流・並列・下流の対応を地図化することで、 「One-Hot エンコーディング」を中核に据えた分析パイプライン (データ準備 → 手法選択 → 結果の検証と展開) の全体像が見えてくる。
One-Hot エンコーディングを中心に、 上位概念 (カテゴリ変数前処理)、 並列手法 (ラベル/ターゲット/頻度エンコーディング・埋め込み)、 派生 (drop_first で多重共線性回避・ハッシュトリック)、 前段 (カテゴリ正規化・欠損カテゴリ「不明」追加)、 後段 (線形回帰・ロジスティック回帰・ニューラルネット)、 応用 (47 都道府県ダミー・月名 12 列の季節ダミー) を放射状に配置する概念マップ。
one-hot encoding を中心に、 関連するカテゴリ変数エンコード手法を放射状に配置した。 中央のノードから伸びる枝は、 (a) 上位概念としてのカテゴリ変数前処理(特徴量エンジニアリング)、 (b) 並列手法(ラベルエンコーディング、 順序エンコーディング、 ターゲットエンコーディング、 頻度エンコーディング)、 (c) 派生・拡張(drop_first で多重共線性回避、 ハッシュトリックで高基数対応、 エンベディングで低次元表現)、 (d) 前段(カテゴリ値の正規化・欠損カテゴリ「不明」追加・学習/テストで未知カテゴリ検出)、 (e) 後段(線形回帰・ロジスティック回帰・ニューラルネット等の数値入力モデル)、 (f) 応用領域(47 都道府県を 47 列にする地域ダミー、 月名 12 列の季節ダミー、 業種分類 100 列)を示す。
SSDSE-B-2026 で「出生数(A4101)~ 総人口(A1101)+ 地域ダミー」を OLS で推定する場合、 47 県のうち 1 県(drop_first=True で基準カテゴリ)を除いた 46 列のダミーを作る。 これで各県の係数 = 基準県との差として直接解釈できる。 単に「列を 0/1 にする」のではなく、 「カテゴリの基準・順序・基数を設計する」視点が実務で問われる。
この One-Hot Encoding ページで出てくる主要キーワードを一覧します。チップをクリックすると該当箇所へジャンプできます。
あなたは、特徴量エンジニアリング の入口で「One-Hot Encoding(One-Hot Encoding)」という用語に出会ったところです。 この用語は カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。
本ページでは、まず数式や形式的定義よりも、実データ(SSDSE-B-2026, 47 都道府県)で具体的な値を見ます。 そのあと、数式 → 計算 → Python 実装 → 落とし穴 → 関連用語、という順で「使える知識」に組み立てていきます。
One-Hot Encoding の本質は、ひとことで言うと「カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。」です。 数式に踏み込む前に、まずイメージで掴みましょう。
pd.get_dummies(prefix='Pref', drop_first=True) で 46 列に展開 (基準県 1 個は省略して多重共線性を回避)。 各ダミー係数が「基準県と比べた差」になる。ヒント:カテゴリ数 (cardinality) が大きいと One-Hot で列が爆発するため、 高基数カテゴリ (1000+ ユニーク値) では ターゲットエンコーディング や ハッシュトリック 、 埋め込み (embedding) を検討する。 SSDSE のような 47 県程度なら One-Hot で十分。
One-Hot Encoding を一般化して書くと、観測ペア $(x_1, y_1), \dots, (x_n, y_n)$(ここでは $n = 47$ 都道府県)に対して、次の関係を仮定します。
$$ \boxed{\quad y = f(x_1, x_2, \dots, x_p; \theta) + \varepsilon \quad} $$ここで $\theta$ は推定したいパラメータ、$\varepsilon$ はモデルでは説明しきれない誤差項。 One-Hot Encoding の流派ごとに、$f$ の形(線形・ロジスティック・木)、$\varepsilon$ の分布(正規・二項・ポアソン)が変わります。
| 記号 | 意味 | SSDSE-B での例 |
|---|---|---|
| $x$ | 説明変数 | Prefecture(47 都道府県名) |
| $y$ | 目的変数 | 死亡率・出生率など |
| $n$ | 標本数 | 47(都道府県数) |
| $\theta$ | パラメータ | 傾き・切片など |
| $\varepsilon$ | 誤差項 | モデルで説明しきれない残り |
上の式 $y = f(x; \theta) + \varepsilon$ を「数学者の声」ではなく、「現場の声」で読み直してみます。
合言葉:「定義は短い、解釈は長い」。One-Hot Encoding はたった 1 行の式ですが、それを 47 都道府県データに当てると、5 種類のチェックリスト(線形性・独立性・等分散・正規性・外れ値)が芋づる式に出てきます。
数式が読めたら、すぐに 実データ(SSDSE-B-2026, 47 都道府県, 2023 年度)で計算しましょう。 抽象を 47 行の表に落とすと、急に理解できることがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd # df2023 はこのあとのブロックで作っているので、ここでも用意しておく df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df2023 = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # One-Hot 化するカテゴリ(Prefecture)の背景として、数値列 A1101(総人口)の代表値を確認 col = 'A1101' # 総人口(数値列) s = df2023[col].astype(float) print('n :', len(s)) # 47 print('mean :', round(s.mean(), 2)) print('median :', round(s.median(), 2)) print('std :', round(s.std(), 2)) print('min / max :', s.min(), '/', s.max()) print('Top 3 prefs :') print(df2023.nlargest(3, col)[['Prefecture', col]]) |
結果を見ると、47 都道府県のうち上位 3 県が突出しているか、なだらかに分布しているか、すぐ分かります。 この「分布の形」が見えると、One-Hot Encoding を語る土台ができたことになります。
Python の実装は「読む → 集計 → 描く → 報告」を一直線に書きます。長いコードよりも、各ステップが分離していることが大事です。
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd import numpy as np import matplotlib.pyplot as plt # SSDSE-B-2026 を読み込み(47 都道府県名) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 2023 年度(最新)だけ抽出 df2023 = df[df['SSDSE-B-2026'] == 2023].copy() print(df2023.shape) # (47, ...) print(df2023[['Code', 'Prefecture']].head()) |
# One-Hot Encoding を 47 都道府県でビジュアル化
fig, ax = plt.subplots(figsize=(9, 6))
df2023.sort_values(col, ascending=False).plot.bar(
x='Prefecture', y=col, ax=ax, color='#00897B', legend=False)
ax.set_title('47 都道府県の総人口(SSDSE-B-2026, 2023)')
ax.set_ylabel(col)
ax.set_xlabel('都道府県')
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig('figures/one-hot-encoding.html_r18_bar.png', dpi=120)
plt.show()
レポート文例:「SSDSE-B-2026(2023 年度, n=47)に基づいて One-Hot Encoding を確認したところ、平均は X、標準偏差は Y、上位 3 県は東京・神奈川・大阪であった。 SSDSE-B-2026 の都道府県名(Prefecture 列)はまさにカテゴリ変数で、回帰モデルに投入する前に One-Hot Encoding が必要になります。」
合言葉:レポート提出前に「ゼロ起点で 1 枚描き直す」「外れ値を 1 県外して再計算」「逆方向の因果を 1 行で否定する」を必ずやる。
本ページに登場した Python コードはすべて以下のテンプレートで読み解けます:
覚え方:「Read → Roll up → Render → Read it back」。 最後の「Read it back」は、出力された数字や図を口に出して 1 度言うこと。 これで One-Hot Encoding の現場運用は十分に回ります。
使います。前処理(特徴量 → 入力ベクトル)、評価(指標の可視化)、解釈(係数の可視化)など、機械学習のあらゆる工程で One-Hot Encoding は登場します。
記述統計や 1 変量・2 変量の可視化には十分。ただし複数の説明変数を同時に検討するときは、自由度が枯れます。bootstrap や情報量規準(AIC/BIC)で補強しましょう。
独立行政法人統計センター(NSTAC)「SSDSE」サイトから無料でダウンロードできます。本ページの実装はすべて data/raw/SSDSE-B-2026.csv を前提にしています。
SSDSE は教育目的での利用が許諾されています(出典明示、改変記録)。論文公開時は出典欄に「総務省統計局, SSDSE-B-2026」を必ず書きましょう。
① ヒストグラム 1 枚を描く → ② 平均・中央値・標準偏差を読み上げる → ③ 上位 3 県・下位 3 県を暗記する → ④ 2 変量の相関を 1 つ確認する → ⑤ レポート 1 行にまとめる。これを 47 都道府県データで 3 回回せば、用語の地形が掴めます。
本リポジトリの 論文一覧 から「特徴量エンジニアリング」カテゴリの論文を見ると、One-Hot Encoding を実際に使った再現コードが付いています。
「目的 → データ → One-Hot Encoding の選択理由 → 結果(図 + 数値)→ 解釈 → 限界(n=47, 単年)→ 次の一手」の順が王道です。
用語は単独では覚えづらいので、前提・並列・発展の 3 方向で 16 件並べます。
勧め方:1 日 1 リンク。クリックして読んだら、One-Hot Encoding のページに戻り、「One-Hot Encoding とこの用語はどう違う?」を 1 行書く。
合言葉:5 STEP のうちどれか 1 段でも飛ばすと、結論が「数字だけ」になり、読者の腑に落ちなくなります。 One-Hot Encoding は「数字 + 物語」のセットで完成です。
np.random.seed で作って「再現実験しました」と書く(教育用途では SSDSE-B-2026 を使うのが必須)iloc[:, 5] のように位置で参照し、SSDSE のバージョン違いで壊れるコードを書くx1, x2, x3 のように匿名化し、読者が意味を追えないコードにするOne-Hot Encoding は、19 世紀末〜 20 世紀初頭の統計学黎明期から発達してきました。特徴量エンジニアリング の中核として、Galton、Pearson、Fisher、Yule などが基礎を築き、現代では SSDSE のような公的データを使った教育素材で広く扱われています。
One-Hot Encoding は、観測ペア $(x_i, y_i)_{i=1}^{n}$ から条件付き期待値 $E[y \mid x]$ または分布 $P(y \mid x)$ を推定する道具です。 線形・非線形・パラメトリック・ノンパラメトリックという 4 つの軸の中で、One-Hot Encoding は「特徴量エンジニアリング」という棚に並んでいます。
df.dropna() の前に必ず欠損率を df.isna().mean() で測る。One-Hot Encoding は 記述統計・データサイエンス・機械学習 の交差点に位置します。 どの分野から入っても、いずれは One-Hot Encoding を通ります。
同じテーマで使い回せる narration を 5 つ並べておきます。コピペして「コード解説」欄に貼ってください。
One-Hot Encoding を学ぶときに使う SSDSE-B-2026 は、47 都道府県 × 約 110 列 × 複数年度のパネルデータです。 本ページでは「2023 年度の 47 行」を主に使います。 以下に、よく登場する代表的なカラムを示します。
| SSDSE コード | 日本語名 | 単位 | One-Hot Encoding での主な使い方 |
|---|---|---|---|
| Code | 地域コード | — | JOIN キー |
| Prefecture | 都道府県名 | — | カテゴリ軸・ラベル |
| A1101 | 総人口 | 人 | 説明変数(規模) |
| A1303 | 65 歳以上人口 | 人 | 高齢化率の分子 |
| A4101 | 出生数 | 人 | 人口動態の説明変数 |
| A4200 | 死亡数 | 人 | 目的変数の代表 |
| B4101 | 年平均気温 | ℃ | 気候系の説明変数 |
| L3221 | 消費支出 | 円 | 家計の目的変数 |
使い方のコツ:列名はすべて A1101 のような英数記号です。SSDSE のコードブックで日本語ラベルを確認しながら使ってください。
本ページの例では Prefecture(47 都道府県名)を中心に使っています。
解説は最小限。コードは 10 行以内。これで One-Hot Encoding の最短ルートが手に入ります。
import pandas as pddf = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])df = df[df['SSDSE-B-2026'] == 2023]col = 'A1101' # 総人口(数値列)print(df[['Prefecture', col]].sort_values(col, ascending=False).head())import matplotlib.pyplot as pltdf.plot.hist(y=col, bins=20)plt.title('47 都道府県の総人口(SSDSE-B-2026, 2023)')plt.savefig('figures/one-hot-encoding.html_r18_hist.png', dpi=120)plt.show()注意:10 行で動かせる、というだけで、これがゴールではありません。 One-Hot Encoding の本当の難しさは「描いた図をどう解釈するか」「報告にどう落とすか」にあります。
One-Hot Encoding の結果を、ゼミ・卒論・社内会議で報告するときの定型文を 3 つ用意しました。 最初は丸ごとコピー、慣れたら差し替えて使ってください。
「本研究では、SSDSE-B-2026(n=47, 2023 年度)を用いて One-Hot Encoding を確認した。 主たる説明変数は Prefecture(47 都道府県名)であり、47 都道府県を対象とした分布の確認、相関の評価、One-Hot Encoding を用いた分析を実施した。 分析の結果、上位 3 県・下位 3 県の特徴と、SSDSE-B-2026 の都道府県名(Prefecture 列)はまさにカテゴリ変数で、回帰モデルに投入する前に One-Hot Encoding が必要になります。」
「47 都道府県名 を 47 都道府県で比較したところ、東京・神奈川・大阪など大都市圏が突出していることが分かった。 One-Hot Encoding を用いた分析から、地域差は単に人口規模の違いだけでは説明できず、複数要因の組み合わせで生じていると示唆された。 今後の打ち手は、上位県のベストプラクティスを参考にしつつ、下位県への支援策を検討することである。」
「皆さん、One-Hot Encoding はひとことで言うと『カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。』です。 今回は SSDSE-B-2026(総務省統計局, 47 都道府県, 2023 年度)を使って、実際の数字でこの考え方を確かめました。 皆さん自身でも、別の指標(人口、出生率、家計支出など)に置き換えて同じ手順を試してみてください。」
同じ用語でも、見る立場によって意味が変わります。3 つの視点を切り替えて、用語の輪郭を立体的に掴みましょう。
統計学者にとって One-Hot Encoding は「データから母集団を推定する道具」です。 確率モデル・尤度・不偏性・効率性・一致性などの数学的性質に注目し、漸近理論で性能保証を行います。 47 都道府県データは「小標本(n=47)」と分類され、bootstrap や情報量規準による補強が必要になります。
データサイエンティストにとって One-Hot Encoding は「ビジネス課題を数字で答えるパイプラインの 1 部品」です。 モデルの理論的性質より、運用性・解釈性・更新コストを重視します。 SSDSE のような公的データを用いるときは「データの出典・更新頻度・ライセンス」を最優先で確認します。
教育の現場では One-Hot Encoding は「初学者が躓きやすいポイント」を含む単元です。 抽象的な数式よりも、具体的な 47 都道府県データで手を動かし、図を描き、結果を口頭で説明できるようになることが目標になります。 本ページの並び(直感 → 数式 → 計算 → Python → 落とし穴)は、まさにこの教育的アプローチに沿っています。
視点切り替えの効果:1 つの用語を 3 通りに眺めると、自分が今どの立場で議論しているか自覚できます。 論文を読むときは ①、現場で使うときは ②、人に教えるときは ③ ── と意識的に切り替えてください。
One-Hot Encoding と似た用語を、使い分けの観点から並べます。違いを言語化できれば、迷いが減ります。
| 用語 | 目的 | 入力 | 出力 | 強み | 弱み |
|---|---|---|---|---|---|
| One-Hot Encoding | カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。 | 47 都道府県 × 約 110 変数 | 図 + 表 + 200 字レポート | 直感的、再現容易 | 小標本(n=47)の制約 |
| 相関係数 | 2 変量の同調を 1 数で要約 | x, y の 47 ペア | r ∈ [−1, +1] | シンプル | 非線形は捉えられない |
| 線形回帰 | 条件付き期待値の線形近似 | 説明変数群 | 回帰係数・予測値 | 解釈容易 | 非線形には弱い |
| ロジスティック回帰 | 2 値分類 | 説明変数群 | 確率 + 係数 | 分類問題の標準 | 線形決定境界 |
| ランダムフォレスト | 非線形分類・回帰 | 大量変数 | 予測 + 重要度 | 非線形対応 | 解釈やや難 |
One-Hot Encoding は 特徴量エンジニアリング の中で「カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。」を担う基本道具です。特徴量エンジニアリング の他のトピックは、この基本の応用または並列の道具にあたります。
使えます。SSDSE-A(市区町村)、SSDSE-C(年次推移)、SSDSE-D・E(個票)など、One-Hot Encoding の手順はそのまま適用できます。粒度(県・市・個人)に応じて n が変わるので、結果の信頼性も変わります。
SSDSE は年に 1 度更新されます。One-Hot Encoding のコード自体は変更不要ですが、結果(数値・図)は最新年度のものに置き換えてレポートしましょう。出典欄に「SSDSE-B-2027(仮)」と書き換えるのを忘れずに。
できます。ピボット → グラフ → 関数 で代表値や相関は出ます。ただし、再現性・履歴管理・自動化の面で Python に劣ります。学習用には Python を強く勧めます。
進めます。One-Hot Encoding は機械学習の「特徴量設計」と「結果解釈」の両端で必須です。AI と聞くと深層学習を連想しがちですが、SSDSE のような表形式データでは線形モデル + One-Hot Encoding の組み合わせで十分実用になります。
3 つ確認します:①ファイルパス(data/raw/SSDSE-B-2026.csv)が合っているか、②エンコーディングが cp932 か、③ヘッダ 2 行目の日本語ラベルを skiprows で飛ばしたか。これで 9 割解決します。
figures/ ディレクトリが存在しない可能性があります。import os; os.makedirs('figures', exist_ok=True) を先頭に追加してください。
本ページの 12 セクションを順に読み進めるのが最短です。特に「直感 → 数式 → 計算 → Python」の 4 段が腑に落ちれば、用語の 80 % は理解できたとみなせます。
このカードを印刷し、SSDSE-B-2026 で 1 回手を動かせば、用語の「使える形」が定着します。 One-Hot Encoding はあくまで「カテゴリ変数を「該当する列だけ 1、ほかは 0」のベクトルに変換する手法。回帰や機械学習に不可欠。」というシンプルな考え方の道具ですので、迷ったらこの 1 行に戻ってください。
カテゴリ変数(例では 血液型)を追加・選択すると、 その値が One-Hot ベクトル(該当列だけ 1、 ほかは 0)へ変換される様子を 表と数値でリアルタイム に確認できます。 ラベルエンコーディング(整数化)との違い、 drop_first(ダミー変数トラップ回避)、 カテゴリ数を増やしたときの 次元の呪い も体感してください。
カテゴリ数 k を動かすと、 1 サンプルの One-Hot ベクトルの「列数」がそのまま伸びます。 ラベルエンコーディングは常に 1 列であることと比べてください。
drop_first を on にして 1 列落とすと解消します(正則化を使う場合は落とさなくても可)。drop_first=True が標準)。 ターゲットエンコーディングはカテゴリを「そのカテゴリでの目的変数の平均」に置き換え 1 列に圧縮する手法で、 高カーディナリティに強い一方、 リーク防止に K-fold が必須。 埋め込み(embedding)エンコーディングは深層学習で低次元の連続ベクトルを学習し、 カテゴリ間の類似性まで捉えます。 目安:k<10 は One-Hot 一択、 10〜100 は One-Hot か Target、 100〜1000 は Target、 1000+ は embedding/hashing。 SSDSE-B-2026 の 47 都道府県は「10〜100」の中規模帯です。関連用語: カテゴリ変数 / ダミー変数 / 多重共線性 / 埋め込み表現 / 特徴量エンジニアリング / ラベルエンコーディング ・ ターゲットエンコーディング ・ 次元の呪い(本ページ内で解説)
既存セクションは drop_first・多重共線性・高カーディナリティ・未知カテゴリを丁寧に扱っている。ここでは重複を避け、「距離の幾何」「尺度変換(標準化)との相性」「カテゴリ集合の安定性」という別角度から、実測値のみで補強する。
SSDSE-B-2026 の 2023 年 47 都道府県を One-Hot 化すると、行列の形はきれいな 47 × 47 の単位行列(対角だけが 1、他は 0)になる(実測 shape = (47, 47))。ここから One-Hot の本質が 2 つ見える。
SSDSE-B-2026 は 2012〜2023 の全 12 年で県集合が完全一致(実測:各年の県集合を比較して all identical = True。総行数 564 = 47 県 × 12 年)。つまり handle_unknown='ignore' は一度も発火しない「行儀の良すぎる」データ。だが実務の店舗 ID・商品 ID・郵便番号は毎月のように新カテゴリが増える。教材データで身についた「未知カテゴリは起きない」という感覚は本番で崩れるので、次の 2 点を癖にしておく。
handle_unknown を設定する。数値出典:data/raw/SSDSE-B-2026.csv(pd.read_csv(encoding='cp932', skiprows=[1]))。実測 = 実際に集計した値/理論値 = 定義から一意に定まる数学的値。合成デモは行っていない。