組織と仕事 / 機械学習の進め方
機械学習プロジェクトの構成をどう考えるか
結論:機械学習プロジェクトの構成は、モデルを作るためではなく「再現して運べる形」にするためにある
機械学習プロジェクトの構成で本当に困るのは、モデルの精度だけではありません。
むしろ苦しくなりやすいのは、次のような場面です。
- どのデータから学習したのかを後で説明するとき
- 特徴量生成の中身を他の人が追うとき
- 評価結果を比較し直すとき
- 学習コードを推論や運用へつなぐとき
- 別の人が再実行しようとするとき
機械学習では、コードだけでなく、データ・特徴量・学習条件・評価結果・モデル成果物までが一つの仕事になります。だから構成とは、単なるフォルダ整理ではなく、何がどの責任範囲に属しているかを見えるようにすることです。
| 構成を考えないまま進めると | 起こりやすいこと |
|---|---|
| 前処理・学習・評価が同居する | どこを変えた結果か分からなくなる |
| 特徴量生成が notebooks に埋まる | 再現・引き継ぎが難しくなる |
| 設定がコード中に散らばる | 比較実験や再学習がつらくなる |
| 学習用と推論用の境界がない | 運用へ持っていくときに破綻しやすい |
良い構成とは、きれいに見える構成ではありません。変更・再実行・比較・引き継ぎに耐える構成です。
あるある:精度は出たのに、その先で急に苦しくなる
機械学習のプロジェクトでは、最初の山は「まず精度を出すこと」に見えます。実際、それは大事です。
- データを読む
- 特徴量を作る
- 学習する
- 評価する
- グラフを出す
ここまでは、一人で試行錯誤している間は回ります。けれど、仕事になると次の壁が出てきます。
| 試行段階では回ること | 仕事になると苦しくなる理由 |
|---|---|
| notebook の上で前処理も学習も全部書く | 後で同じ条件を再現しにくい |
| 特徴量を都度その場で足す | どの列が正式版か分からなくなる |
| パラメータをコードに直接書く | 比較実験の条件差が追いにくい |
| 学習結果を画像だけ保存する | 再評価や説明がしづらい |
つまり、困るのは「機械学習が難しい」ことだけではありません。何をどう作ったかを仕事として残せないことが、次の苦しさになります。
相談:モデルは作れるのに、プロジェクトとして育っていかない
学習自体はできるとよ。前処理して、特徴量を作って、モデル回して、評価も出せる。でもな、それを人に見せたり、あとでやり直したりすると、急にしんどくなるばい。
うん。機械学習って、モデルを作る力と、仕事として再現できる形にする力が少し違うんだよね。そこで構成が効いてくるの。
でも、最初は notebook で全部やったほうが速かろう。実験しながら考えるわけやし、あまり分けすぎると逆に遅くなる気もするたい。
最初の探索では、それでいいことも多いよ。ただ、探索の場と、再利用される処理は役割が違うの。そこを分けないまま進むと、「この精度、どうやって出したの?」に答えにくくなるんだよ。
たしかに、「この特徴量どこで作ったんですか」「この評価はどのデータ分割ですか」って聞かれて、notebook を上から一緒にたどることがあるばい。
それは、技術が足りないというより、境界が見えていない状態なんだよ。データ準備、特徴量、学習、評価、推論。その境界が見えると、人も入りやすくなるし、やり直しもしやすくなるの。
なるほどたい。モデルの話だけじゃなくて、「どこまでが何の仕事か」を見えるようにせんといかんわけやね。
そう。機械学習の構成は、精度を出すためだけじゃなくて、仕事として説明できる状態を作るためにあるんだよ。
なぜ機械学習プロジェクトで構成が問題になるのか
通常の Python プロジェクトでも構成は大切ですが、機械学習ではさらにややこしさが増えます。なぜなら、対象がコードだけではないからです。
機械学習で管理対象になりやすいもの
- 生データ
- 前処理済みデータ
- 特徴量生成のロジック
- 学習設定
- 評価指標と図表
- 学習済みモデル
- 推論用の処理
これらが全部ひとかたまりで扱われると、「何を変えた結果、何が変わったのか」が見えにくくなります。
| 混ざりやすいもの | 混ざると起きやすいこと |
|---|---|
| 前処理と特徴量生成 | 列の意味や責任範囲が曖昧になる |
| 学習と評価 | どの条件の結果か比較しにくい |
| 学習用処理と推論用処理 | 運用時に同じ変換を再現しにくい |
| 探索 notebook と正式コード | どれが本番のロジックか分からなくなる |
機械学習の構成で大事なのは、工程ごとの境界を見えるようにすることです。そうしないと、精度が出ても、次の改善や運用へつながりにくくなります。
構成が悪いと起きること
機械学習プロジェクトで構成が悪いときに起きやすい問題を、先に一覧で見ると整理しやすいです。
| 起きること | なぜ困るか |
|---|---|
| 同じ前処理が複数箇所にある | 学習時と推論時で変換がずれやすい |
| 特徴量生成が notebook に埋もれる | 再現・レビュー・引き継ぎが難しい |
| 設定値がコード中に散在する | 比較実験の条件差が追えない |
| 評価結果だけが画像で残る | 後で再集計や再比較がしづらい |
| 学習用コードと推論用コードが分かれていない | 運用移行で同じ処理を再現しにくい |
| 成果物の保存場所が曖昧 | どのモデルが正式版か分からなくなる |
機械学習では、「精度が出た」だけでは仕事が終わりません。
どの条件で、どのデータから、どの変換を通して、その結果が出たのかを追えることが重要です。
良い構成を考えるときの軸
ここでも、唯一の正解を覚える必要はありません。見るべきなのは、何を分けるべきかという判断軸です。
| 判断軸 | 見るポイント |
|---|---|
| データ処理を分ける | 読み込み・前処理・特徴量生成の責任が見えるか |
| 学習と評価を分ける | どの条件の結果か追いやすいか |
| 設定を集約する | ハイパーパラメータやパスが散っていないか |
| 探索と正式処理を分ける | notebook と保守対象コードが混ざっていないか |
| 学習と推論の橋を意識する | 本番でも同じ変換を再現できるか |
| 成果物の置き場を決める | モデル、ログ、評価結果の所在が明確か |
最低限の考え方だけ抜き出すと
- 生データと加工データを混ぜない
- 特徴量生成を再利用できる形にする
- 学習条件を設定として残す
- 評価結果を比較しやすく残す
- 推論時にも使う処理を共通化する
具体例:最初に覚えるのは「立派な構成」ではなく「工程をどう分けるか」
ここまで読むと、「考え方は分かったけれど、機械学習では実際どう分ければいいのか」と感じるかもしれません。
そこで、仕事として育てやすい最小限の構成例を一つ置いてみます。大切なのは、工程の境界が見えることです。
たとえば、こんな分け方
ml_project/ ├─ notebooks/ # 探索・検証 ├─ data/ │ ├─ raw/ # 生データ │ ├─ interim/ # 中間生成物 │ └─ processed/ # 学習用データ ├─ src/ │ ├─ config.py # 設定値 │ ├─ io.py # 読み込み・保存 │ ├─ features.py # 特徴量生成 │ ├─ train.py # 学習処理 │ ├─ evaluate.py # 評価処理 │ ├─ predict.py # 推論処理 │ └─ utils.py # 共通関数 ├─ models/ # 学習済みモデル ├─ reports/ # 評価結果・図表 └─ scripts/ # 実行用スクリプト
| 置き場 | 役割 | 分ける意味 |
|---|---|---|
notebooks/ |
探索・試行錯誤 | 正式コードと探索を混ぜない |
data/raw/ |
生データ | 元データを壊さない |
data/processed/ |
学習用データ | 学習対象を再現しやすくする |
features.py |
特徴量生成 | 列生成の責任範囲を明確にする |
train.py |
学習 | モデル作成の処理を独立させる |
evaluate.py |
評価 | 学習と結果検証を切り分ける |
predict.py |
推論 | 運用時の入口を明確にする |
models/ |
成果物 | どのモデルを使うか分かりやすくする |
reports/ |
評価結果 | 比較や説明に使いやすくする |
この形が唯一の正解という意味ではありません。
ただ、データ準備・特徴量・学習・評価・推論が分かれているだけで、何を直した結果なのかがかなり見えやすくなります。
最初はここまでなくてもいい
小さい段階なら、もっと簡単でもかまいません。
- notebook で探索しつつ、正式に使う前処理だけ
features.pyへ移す - 学習条件が増えたら
config.pyに寄せる - 評価が複数パターンになったら
evaluate.pyを独立させる - 推論まで考える段階で
predict.pyを分ける
つまり機械学習の構成も、最初から完成品を当てるというより、仕事の増え方に合わせて育てるものです。
構成は、実験の速さを失わずに、少しずつ育てる
機械学習プロジェクトの育ち方も、多くは似ています。
| 段階 | よくある状態 | 次に分けたくなるもの |
|---|---|---|
| 最初 | notebook 一枚で探索 | 前処理、特徴量生成 |
| 少し育つ | 学習が再実行される | 設定、評価 |
| 実務化が進む | 比較実験・他者レビューが発生 | データ階層、成果物管理、推論入口 |
| 継続運用 | 再学習や運用接続が必要になる | 学習・推論の共通化、責任範囲の整理 |
ここで大事なのは、探索の速さを守りつつ、再利用される部分だけ外へ出していくことです。
失敗なのは notebook を使うことではありません。
notebook にしか正式なロジックが存在しない状態のまま、仕事を大きくしてしまうことです。
機械学習の構成は、説明責任と共同作業を支える
機械学習の仕事では、コードが動くだけでは足りません。なぜその結果になったのか、どの条件で比較したのか、運用時にどう再現するのかを説明する必要があります。
構成が効く場面
- レビューで「どの工程を見るべきか」を分けやすい
- データ担当、特徴量担当、モデル担当で会話しやすい
- 評価結果の出どころを説明しやすい
- 運用や再学習へつなぎやすい
- 担当者が変わっても再現しやすい
| 構成が見えていると | 会話がこう変わる |
|---|---|
| 特徴量生成が独立 | 「今回は features 側の変更です」と言える |
| 評価が独立 | 「この指標比較は evaluate を見てください」と言える |
| 推論入口が明確 | 「運用では predict を使います」と共有しやすい |
| 設定が集約 | 「この実験条件は config にあります」と説明しやすい |
構成は、モデルのためだけではありません。人が関わり続けられる形にするためにあります。これは、機械学習を個人実験で終わらせず、仕事へ持ち込むための土台でもあります。
落とし穴:きれいな構成を作ったつもりで、境界が働いていない
ここでも逆方向の落とし穴があります。見た目だけ立派な構成を先に作ってしまうことです。
| やりがちなこと | なぜ苦しくなるか |
|---|---|
| フォルダだけ細かいのに中身の責任が曖昧 | 結局どこに何を書くか迷う |
| 探索段階から厳密すぎる箱を作る | 試行錯誤の速さが落ちる |
| 学習用と推論用の処理が別実装 | 変換のずれが起きやすい |
| 結果だけ保存して条件を残さない | 後で比較や説明ができない |
大事なのは、厳密さそのものではありません。
変更しそうな場所、比較したい場所、運用へつながる場所の境界が見えていることです。
締め:機械学習の構成は、精度を仕事へ変えるためにある
機械学習プロジェクトでは、最初のうちは notebook 中心でも進みます。けれど、仕事として続けるなら、次のことを少しずつ分けていく意味があります。
- データの置き場
- 特徴量生成の責任範囲
- 学習条件の設定
- 評価と比較の流れ
- 推論で使う入口
これだけでも、再現しやすさ、比較しやすさ、引き継ぎやすさはかなり変わります。
機械学習プロジェクトの構成とは、フォルダを並べることではなく、モデルづくりを仕事として継続できる形にすることです。精度を出すことと、説明できること、運べること、引き継げること。その全部を見据えたとき、構成はとても現実的なテーマになります。
おれは「精度を出すこと」には意識が向いとったけど、「あとで再現できること」や「人が途中から入れること」までは、まだ甘かったかもしれんばい。
それはすごく自然だよ。探索ではまず精度に目が向くからね。でも仕事になると、精度だけじゃなくて、説明できること、比べられること、やり直せることが同じくらい大事になるの。
なるほどたい。構成って、機械学習を遅くするための作法やなくて、「精度を仕事へ持ち出す」ための準備なんやね。
そうそう。最初から豪華にしなくていいけど、「この結果はこう作った」とたどれる余白は作っておきたいのよ。
じゃあ次からは、「精度が出たか」だけやなくて、「もう一回同じことができるか」も見るようにするばい。
うん。それができると、機械学習が個人実験から仕事の基盤に変わっていくよ。