組織と仕事 / 機械学習の進め方

機械学習プロジェクトの構成をどう考えるか

結論:機械学習プロジェクトの構成は、モデルを作るためではなく「再現して運べる形」にするためにある

機械学習プロジェクトの構成で本当に困るのは、モデルの精度だけではありません。

むしろ苦しくなりやすいのは、次のような場面です。

  • どのデータから学習したのかを後で説明するとき
  • 特徴量生成の中身を他の人が追うとき
  • 評価結果を比較し直すとき
  • 学習コードを推論や運用へつなぐとき
  • 別の人が再実行しようとするとき

機械学習では、コードだけでなく、データ・特徴量・学習条件・評価結果・モデル成果物までが一つの仕事になります。だから構成とは、単なるフォルダ整理ではなく、何がどの責任範囲に属しているかを見えるようにすることです。

構成を考えないまま進めると 起こりやすいこと
前処理・学習・評価が同居する どこを変えた結果か分からなくなる
特徴量生成が 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 中心でも進みます。けれど、仕事として続けるなら、次のことを少しずつ分けていく意味があります。

  • データの置き場
  • 特徴量生成の責任範囲
  • 学習条件の設定
  • 評価と比較の流れ
  • 推論で使う入口

これだけでも、再現しやすさ、比較しやすさ、引き継ぎやすさはかなり変わります。

機械学習プロジェクトの構成とは、フォルダを並べることではなく、モデルづくりを仕事として継続できる形にすることです。精度を出すことと、説明できること、運べること、引き継げること。その全部を見据えたとき、構成はとても現実的なテーマになります。

ストーク

おれは「精度を出すこと」には意識が向いとったけど、「あとで再現できること」や「人が途中から入れること」までは、まだ甘かったかもしれんばい。

シママ

それはすごく自然だよ。探索ではまず精度に目が向くからね。でも仕事になると、精度だけじゃなくて、説明できること、比べられること、やり直せることが同じくらい大事になるの。

ストーク

なるほどたい。構成って、機械学習を遅くするための作法やなくて、「精度を仕事へ持ち出す」ための準備なんやね。

シママ

そうそう。最初から豪華にしなくていいけど、「この結果はこう作った」とたどれる余白は作っておきたいのよ。

ストーク

じゃあ次からは、「精度が出たか」だけやなくて、「もう一回同じことができるか」も見るようにするばい。

シママ

うん。それができると、機械学習が個人実験から仕事の基盤に変わっていくよ。

関連記事