データ分析の効率が劇的に変わる!NumPyのpermutationでデータを自在に操る初心者ガイド
こんにちは。ゆうせいです。
機械学習やプログラミングを学んでいると、データをバラバラに混ぜたい場面によく遭遇しますよね。トランプをシャッフルするように、データの順番をランダムに入れ替えたいとき、あなたならどうしますか?
今回は、Pythonの数値計算ライブラリであるNumPyで頻繁に登場するnp.random.permutationについて解説します。一見難しそうな名前ですが、仕組みを理解すればこれほど便利な道具はありません。一緒にマスターしていきましょう!
順列とは何か?その正体を解き明かす
数学の授業で「順列」という言葉を聞いた記憶はありませんか?難しい公式を思い出す必要はありません。プログラミングの世界、特にNumPyにおいて、この言葉はもっと直感的な意味で使われています。
順列は「並び替えの結果」のこと
np.random.permutation(N)という命令は、0から までの数字をすべて使い、その並び順をランダムに入れ替えたひとつの列を作るという意味です。
例えば、 の場合を考えてみましょう。
通常の並びであれば、[0, 1, 2, 3, 4] という順番になります。
これに対して、permutationを実行すると、[3, 0, 4, 1, 2] といった具合に、中身の数字はそのままに順番だけが変わったリストが手に入ります。
ここで重要なのは、重複がなく、かつ漏れもないということです。
数字の顔ぶれは変わらないけれど、並び方だけが新しくなっている状態。これがプログラミングにおける順列の正体です。
なぜshuffleではなくpermutationを使うのか
NumPyには、実はnp.random.shuffleという、その名もズバリ「シャッフル」という関数が存在します。名前だけ聞くとこちらのほうが分かりやすい気がしませんか?
それなのに、なぜ熟練のエンジニアや機械学習のコードではpermutationが好んで使われるのでしょうか。そこには、プログラミングにおける作法の違いがあります。
破壊的処理と非破壊的処理の違い
以下の表で、その決定的な違いを確認してみましょう。
| 関数名 | 特徴(文法的な違い) | データの扱い |
| shuffle(data) | 破壊的処理 | 元のデータそのものを直接書き換えてしまう |
| permutation(N) | 非破壊的処理 | 元のデータはそのままに、新しい「並び順リスト」を返す |
想像してみてください。あなたが大事に保管している名簿データがあるとします。shuffleを使うと、その名簿自体のページをバラバラに引き剥がして混ぜてしまうようなものです。これでは、後で元の順番を確認したくなったときに困ってしまいますよね。
一方で、permutationは「新しい整理券」を発行するようなイメージです。元の名簿は綺麗なまま棚に置いておき、「今日はこの番号順に呼んでね」という指示書だけを新しく作る。これなら元のデータを汚さずに済みます。
機械学習で重宝される理由
機械学習の現場では、学習用データと正解データをセットで扱います。このとき、生データを直接シャッフルしてしまうと、データの整合性が崩れたり、メモリを余計に消費したりするリスクがあります。
そこで、賢いエンジニアは次のようなステップを踏みます。
- 元のデータセットは動かさず、そのまま保存しておく。
- permutationを使って、バラバラな数字が並んだインデックス(索引)だけを作る。
- その索引に従って、必要なときだけデータを見に行く。
この手順を踏めば、データの安全性を保ちつつ、ランダムに学習を進めることができます。実にスマートなやり方だと思いませんか?
言葉のニュアンスに納得する
「シャッフル」はトランプを混ぜるという動作を指す動詞のような言葉です。それに対して「パーミュテーション(順列)」は、混ぜた結果として新しく出来上がった数字の列という状態を指しています。
プログラムに対して、「この回(エポック)では、この順列に従ってデータを処理してね!」と命令していると考えると、言葉の響きもしっくりくるはずです。
今後の学習の指針
まずは、自分の環境で実際に小さな数字を使ってpermutationを動かしてみてください。
- 10個程度の数字で実行し、毎回結果が変わることを確認する。
- 元のリストが書き換わっていないかチェックしてみる。
- そのランダムな数字を、配列の添え字として使ってデータを取り出してみる。
この感覚が身につけば、大量のデータを扱う際にも迷うことはなくなります。次は、これを使って「ミニバッチ学習」の仕組みを覗いてみると、さらに理解が深まりますよ!