K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

層化抽出

01.8.2

層化抽出

最終更新 2026-03-03 読了時間 2 分
まとめ
層化抽出(Stratified Sampling)は、母集団を学年・地域・正解ラベルなどのグループ(層)に分け、各層から母集団と同じ比率になるように件数を割り振ってから、層の中で無作為に選ぶ抽出法です。単純無作為抽出では偶然で小さいグループが 0 件になることがありますが、層化抽出は比率を先に固定するのでその偏りが消え、少数グループの推定精度が上がります。このページでは 90:10 の 1,000 件を train_test_split(stratify=y) で分けて両側のクラス比を確かめ、pandas の groupby("region").sample(frac=0.1) で地域ごとに 10% を抽出する書き方を追います。交差検証に同じ考えを使ったものが層化 K 分割です。

直感 #

全国の有権者から 1,000 人をランダムに選ぶと、人口 50 万人の県は期待値 4 人で、偶然 0 人になることが珍しくありません。層化抽出は「都道府県ごとに人口比で人数を割り振り、各県の中でランダムに選ぶ」方式で、小さい県も必ず比率どおりに入ります。機械学習では「迷惑メール 10%」のようなラベル比を保ったまま訓練 80%・テスト 20% に分割するのが典型的な応用で、層化しないとテスト側の迷惑メールが数件になり、recall が数件の当たり外れで大きくぶれます。

何が起きているか(ステップで見る) #

コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。

見るポイント:層化抽出は「グループ比を保ったまま小さくする」。36:18:6 の母集団から 12 人を取ると、単純無作為では 8:4:0 になることがあるが、層化なら 7:4:1 で小さいグループを取りこぼさない。

詳細な解説 #

scikit-learn での基本 #

次のコードは 90:10 の 2 クラス 1,000 件を作り、stratify=y を付けて訓練 800 件・テスト 200 件に分け、両側のクラス比を数えます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from collections import Counter

X, y = make_classification(n_samples=1000, weights=[0.9, 0.1], random_state=42)

# 層化あり
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)
print("訓練:", Counter(y_train))
print("テスト:", Counter(y_test))

pandas での層化抽出 #

次のコードは地域 A・B・C が 500:300:200 のデータフレームから、地域ごとに 10% ずつ、合計 100 行を抽出します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd

df = pd.DataFrame({
    "region": ["A"]*500 + ["B"]*300 + ["C"]*200,
    "value": range(1000)
})

# 各 region から 10% を抽出
sampled = df.groupby("region", group_keys=False).apply(
    lambda x: x.sample(frac=0.1, random_state=42)
)
print(sampled["region"].value_counts())

サンプリング手法の比較 #

手法代表性実装の容易さ使いどころ
単純ランダム△○母集団が均一
層化抽出○○グループ比率を保ちたい
クラスター抽出△○地理的に散在
系統抽出△○順序データ

層化 K 分割との関係 #

機械学習の文脈では、層化抽出は StratifiedKFold として交差検証の分割にも応用されます。StratifiedKFold(n_splits=5) は 5 つの fold すべてでクラス比を元データと同じに保つので、不均衡データの交差検証では KFold のかわりにこちらを使い、詳しい手順は 層化 K 分割交差検証 で扱います。