ランダムにデータを分割
1 つのデータを、行をランダムに選んで 2 つに分けます。機械学習で、モデルを作るためのデータと、できたモデルを試すためのデータを分ける用途が中心です。
条件で分けたいとき(「東京の行とそれ以外」など)は行フィルタ条件による分割を使ってください。こちらは値を見ずに行を選びます。
入出力
| ポート | 内容 |
|---|---|
| 入力データ | データ |
| 訓練データ | 分けたデータの一方 |
| 検証データ | 分けたデータのもう一方 |
出力が 2 つあります。どちらにも同じ列が同じ順で並び、行が重なることはありません。2 つを足すと入力の行数になります。
Spark エンジンでも動きます。
設定項目
- 分割する割合を入力(0~1)必須
- 検証データ側の割合を、0 より大きく 1 より小さい数で入れます。既定は
0.5。0.2なら検証データが 2 割、訓練データが 8 割です。 - 乱数シードを固定する
- 整数を入れると、毎回同じ分かれ方になります。空のままだと実行のたびに変わります。考え方は乱数シードを参照。
乱数シードを固定するかどうか
| 見るところ | 空のまま | 整数を入れる |
|---|---|---|
| 同じデータを 2 回実行 | 違う分かれ方になる | 同じ分かれ方になる |
| 向いている場面 | 分け方を変えて何度も試したい | 結果を再現したい・人に説明したい |
ワークフローを共有したり、結果を比べたりするなら固定してください。 固定しないと、同じワークフローを実行し直すたびにモデルの精度が変わり、改善したのか偶然なのかが分からなくなります。
分け方の決まり
- 行は完全にランダムに選ばれます。並び順や値は考慮しません
- 目的変数の割合を揃えて分けること(層化抽出)はできません。 分類で偏りが問題になるときは、行フィルタ条件による分割で値ごとに分けてから、それぞれを分割してください
- 検証データの行数は、割合 × 行数を切り上げた数です。0 行になることはありません
- 訓練データの行数は、残りを切り捨てた数です。こちらが 0 行になる場合はエラーになります
- 入力が 0 行のときは、エラーにならず列だけの空データが 2 つ出ます
| 入力の行数 | 分割する割合 | 訓練データ | 検証データ |
|---|---|---|---|
| 10 | 0.5 | 5 行 | 5 行 |
| 10 | 0.2 | 8 行 | 2 行 |
| 10 | 0.05 | 9 行 | 1 行 |
| 10 | 0.95 | エラー | — |
| 1 | どの値でも | エラー | — |
エラーと対処
割合が範囲の外
0 以下、または 1 以上の値を入れたとき。
分割する割合は 0より大きく、1より小さい値を入力してください。
直し方 — 0.2 や 0.3 のように、0 と 1 の間の小数を入れてください。20(パーセントのつもり)や 1 は使えません。
行数が少なすぎる
割合に対して行が少なく、訓練データ側が 0 行になるとき。
入力データの行数が少ないため分割に失敗しました。
直し方 — 割合を小さくするか、入力の行数を増やしてください。10 行のデータに 0.95 を指定すると訓練データが 0 行になります。1 行しかないデータは、どの割合を入れてもこのエラーになります。
よく使う例
1. 8 対 2 に分ける
お題 — モデルを作る前に、よくある 8 : 2 で分けたい
入力 — 1000 行の購買データ
設定 — 分割する割合を入力(0~1) に 0.2、乱数シードを固定する に 42
出力 — 訓練データ 800 行、検証データ 200 行。シードを固定したので、実行し直しても同じ分かれ方になる
2. 分け方を変えて何度も試す
お題 — 分け方によって精度がどれくらいぶれるのかを見たい
入力 — 1000 行の購買データ
設定 — 分割する割合を入力(0~1) に 0.3、乱数シードを固定する は空のまま
出力 — 訓練データ 700 行、検証データ 300 行。中身は実行のたびに変わるので、何回か実行して精度の幅を見る
3. 小さいデータを分ける
お題 — 50 行しかないデータを分けたい
入力 — 50 行のアンケート結果
設定 — 分割する割合を入力(0~1) に 0.2、乱数シードを固定する に 1
出力 — 訓練データ 40 行、検証データ 10 行。ここから割合を下げると検証データが数行になり、精度の数字があてにならなくなる
4. 分けたデータをあとで 1 つに戻す
お題 — 訓練データと検証データに別々の処理をしてから、1 つのデータに戻したい
入力 — 1000 行の購買データ
設定 — 分割する割合を入力(0~1) に 0.2、乱数シードを固定する に 42。それぞれに処理をつないだあと、単純な縦結合で 左右の共通列をすべて結合 にする
出力 — 1000 行に戻る。ただし行の順番は元のデータと同じにはなりません(訓練データの行が先、検証データの行が後ろ)