メインコンテンツへスキップ

6.2.2 sklearn から PyTorch へ

この節の位置づけ

scikit-learn がオートマ車なら、PyTorch はマニュアル車のようなものです。

  • scikit-learn は、たくさんの細かい部分をまとめて隠してくれます
  • PyTorch では、モデル、損失関数、勾配、訓練の流れを自分で制御します

この節を学ぶと、あなたがどこで「ギアを切り替えている」のかがわかります。

学習目標

  • sklearnPyTorch の役割の違いを理解する
  • データ、モデル、損失関数、最適化器、訓練ループの全体像をつかむ
  • 最小の例で sklearnPyTorch の両方を動かす
  • なぜ深層学習には PyTorch のような「より低レベル」なフレームワークが必要なのかを理解する

一、なぜ sklearn を学んだあとで PyTorch も学ぶの?

第 5 章では、すでに scikit-learn を使いました。

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X_train, y_train)
pred = model.predict(X_test)

この体験はとても快適ですが、その分いろいろなものが「見えないところ」に隠れています。

あなたがすることsklearn がしてくれること
モデルを選ぶパラメータの構造を定義する
fit() を呼ぶ順伝播、損失の計算、勾配の計算、パラメータ更新を自動で行う
predict() を呼ぶ推論を自動で行う

一方、PyTorch では、これらの手順を分けて書きます。

手順自分で扱う内容
データを準備するデータを Tensor に変換する
モデルを定義するnn.Modulenn.Sequential でネットワークを書く
損失関数を定義するたとえば nn.MSELoss()
最適化器を定義するたとえば torch.optim.SGD()
訓練ループを書くforward -> loss -> backward -> step

見た目は少し面倒ですが、その代わりに次のような利点があります。

  • どんなネットワーク構造でも作れる
  • 訓練プロセスの各ステップを自分で制御できる
  • CNN、RNN、Transformer、大規模モデルの微調整など、sklearn では対応しにくいことができる

二、両者を1枚の図で見る

sklearn から PyTorch へのギアチェンジ図

  • sklearn では、この流れの多くが fit() の中にまとめられています
  • PyTorch では、この流れがそのまま全部見えます

つまり PyTorch の学習で大事なのは「API が増えること」ではなく、
モデル訓練の内部構造に本当に触れ始めることです。


三、最小の比較実験

実行環境

以下のコードはそのまま実行できます。もしローカルで依存関係がまだ入っていないなら、次を実行してください。

pip install numpy scikit-learn torch

最もシンプルな線形回帰をやってみましょう。学習時間から試験点数を予測します。

sklearn で訓練する

import numpy as np
from sklearn.linear_model import LinearRegression

# 学習時間(時間)
X = np.array([[1.0], [2.0], [3.0], [4.0], [5.0]], dtype=np.float32)

# 対応する点数
y = np.array([52.0, 59.0, 66.0, 73.0, 80.0], dtype=np.float32)

sk_model = LinearRegression()
sk_model.fit(X, y)

print("sklearn の切片:", round(float(sk_model.intercept_), 2))
print("sklearn の重み:", round(float(sk_model.coef_[0]), 2))
print("6時間勉強したときの予測点数:", round(float(sk_model.predict([[6.0]])[0]), 2))

きれいな直線モデルが得られ、流れもとてもスムーズです。

PyTorch で同じタスクを訓練する

import torch
from torch import nn

torch.manual_seed(42)

# 1. データをテンソルに変換する
X_torch = torch.tensor([[1.0], [2.0], [3.0], [4.0], [5.0]])
y_torch = torch.tensor([[52.0], [59.0], [66.0], [73.0], [80.0]])

# 2. モデルを定義する: 1つの線形層 y = wx + b
model = nn.Linear(in_features=1, out_features=1)

# 3. 損失関数を定義する
loss_fn = nn.MSELoss()

# 4. 最適化器を定義する
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 5. 訓練ループ
for epoch in range(1000):
pred = model(X_torch) # forward
loss = loss_fn(pred, y_torch) # 損失を計算する

optimizer.zero_grad() # 以前の勾配を消す
loss.backward() # backward
optimizer.step() # パラメータを更新する

if epoch % 200 == 0:
print(f"epoch={epoch:4d}, loss={loss.item():.4f}")

weight = model.weight.item()
bias = model.bias.item()
pred_6 = model(torch.tensor([[6.0]])).item()

print("PyTorch の切片:", round(bias, 2))
print("PyTorch の重み:", round(weight, 2))
print("6時間勉強したときの予測点数:", round(pred_6, 2))

四、ここで本当に新しく学んだことは何?

上の PyTorch コードは sklearn より長いですが、深層学習の最重要な 5 つの要素を見える形にしています。

要素たとえ役割
データ食材モデルが加工する入力
モデル料理人入力をどう出力に変えるかを決める
損失関数採点表モデルの出来を判断する
最適化器調整係誤差をもとにパラメータを変える
訓練ループ毎日の振り返り試行錯誤を繰り返して精度を上げる

これから CNN、Transformer、RAG の微調整、ローカルモデルの訓練を学んでも、根本はこの 5 つです。
違うのは、モデルの構造がもっと複雑になるだけです。


五、いつ sklearn を使い、いつ PyTorch に切り替える?

sklearn のほうが向いている場面

  • 表形式データが中心
  • モデルが線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、XGBoost のようなもの
  • 速くモデル化して、調整したいことを優先したい

PyTorch のほうが向いている場面

  • 画像、音声、テキストなどの非構造化データ
  • ネットワーク構造を自分で作りたい
  • GPU で訓練したい
  • 事前学習済みモデルを微調整したい
  • 訓練の細かい部分を自分で制御したい

一言で覚えるなら:

sklearn は「従来の機械学習を効率よく使うこと」が得意で、PyTorch は「深層学習を柔軟に組み立てること」が得意です。


六、よくある誤解

誤解 1:PyTorch はただの別のモデリングライブラリ

違います。PyTorch はむしろ「深層学習を組み立てるためのプラットフォーム」に近いです。
単にモデルを呼び出すのではなく、訓練システム全体を組み立てます。

誤解 2:PyTorch は sklearn より上位だから、これからは全部 PyTorch を使えばいい

これも違います。実務で大事なのは、適切な道具を選ぶことです。
表形式データの多くでは、sklearn や木系モデルが今でも第一候補です。

誤解 3:訓練ループが書ければ、深層学習を理解したことになる

訓練ループは外側の枠にすぎません。さらに次のことも理解する必要があります。

  • テンソルと自動微分
  • nn.Module
  • データ読み込み
  • モデルのデバッグ
  • 訓練の安定性と評価方法

これらは、この章の次の節で順番に補っていきます。


七、この章のあとでできるようになってほしいこと

この小節を学んだら、少なくとも次の 3 つの質問に答えられるようになってほしいです。

  1. sklearn.fit() は、どんな手順を隠してくれているのか?
  2. なぜ PyTorch の訓練では、損失関数と最適化器が必ず必要なのか?
  3. なぜ「モデル + 損失 + 最適化器 + 訓練ループ」が、その後のすべての深層学習コースの共通構造になるのか?

この 3 つを自分の言葉で説明できれば、橋はもうかかっています。


練習

  1. 上の例の学習時間と点数を自分のデータに変えて、それぞれ sklearnPyTorch で 1 回ずつ訓練してみましょう。
  2. PyTorch の学習率を 0.01 から 0.10.001 に変えて、損失の下がり方の違いを観察しましょう。
  3. 100 回ごとの weightbias を出力して、パラメータがどのように少しずつ答えへ近づくか見てみましょう。