不均衡データに対するサンプリング
件数が偏ったデータの件数を揃えます。 「購入した人が 1%、していない人が 99%」のようなデータでは、そのまま学習するとほとんどを「していない」と予測するモデルになります。
入出力
| ポート | 内容 |
|---|---|
| 入力データ | データ |
| 出力データ | データ |
Spark エンジンでは動きません。
行の数が変わります。 アンダーサンプリングなら減り、オーバーサンプリングなら増えます。
設定項目
- 目的変数列を選択必須
- 件数を揃えたい分類の列。文字列と数値が選べます。
- 説明変数を選択
- 一緒に残す列。数値と文字列が選べます。複数選べます。
- 手法を選択
- アンダーサンプリング(既定)かオーバーサンプリング。
- アルゴリズムを選択必須
- 手法を選択で選んだ側に応じて、出る選択肢が変わります。
アンダーサンプリング: ランダム(既定)/ クラスター重心法
オーバーサンプリング: ランダム(既定)/ SMOTE(スモート) - 乱数シードを固定する
- 入れると毎回同じ結果になります。考え方は乱数シードを参照。
2 つの考え方
| 手法 | やること | 注意 |
|---|---|---|
| アンダーサンプリング | 多い方を減らす | データが減る |
| オーバーサンプリング | 少ない方を増やす | 水増しなので過学習しやすい |
| アルゴリズム | 内容 |
|---|---|
| ランダム(アンダー) | 多い方からランダムに捨てる |
| クラスター重心法 | 多い方をまとめて代表点にする |
| ランダム(オーバー) | 少ない方をコピーして増やす |
| SMOTE(スモート) | 少ない方の間を補って新しい行を作る |
どの組み合わせでも、最後は各クラスの件数が同じになります。
文字列の説明変数の扱い
文字列の列は、内部で値ごとの 0/1 に展開してから件数を揃え、結果では元の値に戻します。 SMOTE やクラスター重心法は値どうしの距離を計算するため、作られた行の文字列は「いちばん近かった値」になります。 元のデータにない組み合わせが出ることがあります。
SMOTE が使えないとき
SMOTE は、少ない方のクラスが 2 件以上ないと使えません。 近くにある行の間を補って新しい行を作る仕組みなので、1 件しかないと補う相手がいません。少ない方が極端に少ないときは、ランダムオーバーサンプリングを使ってください。
エラーと対処
アルゴリズムを選んでいない
アルゴリズムを選択が空のまま実行したときに出ます。
アルゴリズムを選択してください。
直し方 — アルゴリズムを選択を選び直してください。
説明変数に欠損値がある
処理対象列に欠損値が含まれています。欠損値を除外するか補完してください。
この文は説明変数でも目的変数でも同じです。 どちらが欠けているかは書かれないので、両方を確かめてください。
直し方 — 欠損値処理で埋めるか、欠損のある行を外します。
目的変数に欠損値がある
文は説明変数のときと同じです。
処理対象列に欠損値が含まれています。欠損値を除外するか補完してください。
直し方 — 目的変数が欠けている行は学習にも使えないので、その行を外してください。
選択肢にないアルゴリズム
選択肢にないアルゴリズムが選択されています。
直し方 — 設定し直してください。手法を切り替えるとアルゴリズムの選択肢も変わります。
選択肢にないサンプリング方法
選択肢にないサンプリング方法が選択されています。
直し方 — 手法を選択を選び直してください。
処理対象列を選んでいない
目的変数列を選択または説明変数を選択が空のまま実行したときに出ます。
対象の列が選択されていません。
直し方 — 目的変数列を選択 / 説明変数を選択で列を選んでください。
選んだ列が入力データにない
前のノードで列名を変えたり列を削ったりして、選んである列がなくなったときに出ます。
対象の列が存在しません。
直し方 — 目的変数列を選択 / 説明変数を選択で選び直してください。
よく使う例
1. 多い方を減らす
購入した人が極端に少なく、そのまま学習すると全部「していない」と予測するとき。
入力(10000 行。購入 100 行 / 非購入 9900 行)
| 購入フラグ | 利用月数 | 来店回数 |
|---|---|---|
| 購入 | 12 | 8 |
| 非購入 | 3 | 1 |
設定
| 設定項目 | 値 |
|---|---|
| 目的変数列を選択 | 購入フラグ |
| 説明変数を選択 | 利用月数、来店回数 |
| 手法を選択 | アンダーサンプリング |
| アルゴリズムを選択 | ランダム |
出力 — 購入 100 行 / 非購入 100 行の 200 行になります。列は 利用月数 来店回数 購入フラグ の 3 列です。
2. 少ない方を増やす
データ全体が小さく、減らすと学習に足りなくなるとき。
入力 — 例 1 と同じ
設定
| 設定項目 | 値 |
|---|---|
| 手法を選択 | オーバーサンプリング |
| アルゴリズムを選択 | SMOTE(スモート) |
出力 — 購入 9900 行 / 非購入 9900 行の 19800 行になります。購入側の 9800 行は、既存の行の間を補って作られた新しい行です。
3. 情報を残して減らす
ランダムに捨てると、多い方の傾向まで一緒に落ちてしまいそうなとき。
入力 — 例 1 と同じ
設定
| 設定項目 | 値 |
|---|---|
| 手法を選択 | アンダーサンプリング |
| アルゴリズムを選択 | クラスター重心法 |
出力 — 200 行になります。非購入側の 100 行は元の行そのままではなく、まとめた代表点です。
4. 訓練データにだけ掛ける
精度を本番と同じ前提で測りたいとき。
入力 — 例 1 と同じ 10000 行
設定 — まずランダムにデータを分割で 8:2 に分け、訓練側の 8000 行にだけこのノードをつなぎます。検証側の 2000 行は通しません。
出力 — 訓練側だけが 50:50 になり、検証側は 1:99 のまま残ります。
5. 同じ結果を再現する
結果を人に見せるので、流し直しても同じ行が選ばれるようにしたいとき。
入力 — 例 1 と同じ
設定
| 設定項目 | 値 |
|---|---|
| 乱数シードを固定する | 42 |
出力 — 何度流しても同じ 200 行になります。