01.8.2
層化抽出
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 件に分け、両側のクラス比を数えます。
| |
pandas での層化抽出 #
次のコードは地域 A・B・C が 500:300:200 のデータフレームから、地域ごとに 10% ずつ、合計 100 行を抽出します。
| |
サンプリング手法の比較 #
| 手法 | 代表性 | 実装の容易さ | 使いどころ |
|---|---|---|---|
| 単純ランダム | △ | ○ | 母集団が均一 |
| 層化抽出 | ○ | ○ | グループ比率を保ちたい |
| クラスター抽出 | △ | ○ | 地理的に散在 |
| 系統抽出 | △ | ○ | 順序データ |
層化 K 分割との関係 #
機械学習の文脈では、層化抽出は StratifiedKFold として交差検証の分割にも応用されます。StratifiedKFold(n_splits=5) は 5 つの fold すべてでクラス比を元データと同じに保つので、不均衡データの交差検証では KFold のかわりにこちらを使い、詳しい手順は 層化 K 分割交差検証 で扱います。