6.2.2 sklearn から PyTorch へ
scikit-learn がオートマ車なら、PyTorch はマニュアル車のようなものです。
scikit-learnは、たくさんの細かい部分をまとめて隠してくれますPyTorchでは、モデル、損失関数、勾配、訓練の流れを自分で制御します
この節を学ぶと、あなたがどこで「ギアを切り替えている」のかがわかります。
学習目標
sklearnとPyTorchの役割の違いを理解する- データ、モデル、損失関数、最適化器、訓練ループの全体像をつかむ
- 最小の例で
sklearnとPyTorchの両方を動かす - なぜ深層学習には 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.Module や nn.Sequential でネットワークを書く |
| 損失関数を定義する | たとえば nn.MSELoss() |
| 最適化器を定義する | たとえば torch.optim.SGD() |
| 訓練ループを書く | forward -> loss -> backward -> step |
見た目は少し面倒ですが、その代わりに次のような利点があります。
- どんなネットワーク構造でも作れる
- 訓練プロセスの各ステップを自分で制御できる
- CNN、RNN、Transformer、大規模モデルの微調整など、
sklearnでは対応しにくいことができる
二、両者を1枚の図で見る

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 つの質問に答えられるようになってほしいです。
sklearn.fit()は、どんな手順を隠してくれているのか?- なぜ PyTorch の訓練では、損失関数と最適化器が必ず必要なのか?
- なぜ「モデル + 損失 + 最適化器 + 訓練ループ」が、その後のすべての深層学習コースの共通構造になるのか?
この 3 つを自分の言葉で説明できれば、橋はもうかかっています。
練習
- 上の例の学習時間と点数を自分のデータに変えて、それぞれ
sklearnとPyTorchで 1 回ずつ訓練してみましょう。 PyTorchの学習率を0.01から0.1と0.001に変えて、損失の下がり方の違いを観察しましょう。- 100 回ごとの
weightとbiasを出力して、パラメータがどのように少しずつ答えへ近づくか見てみましょう。