本ページは 機械学習ライブラリ(ML Library)を 12 のセクションで多角的に解説します。 上のチップは検索・関連語の手がかりです。 以下のリンクで各セクションに直接ジャンプできます:
🍰 まずはやさしく
便利な道具箱のようなものです。
AIを効率よく作るために使います。
スマホアプリの開発に似ています。
まずは結論から確認しましょう。
scikit-learn、 TensorFlow、 PyTorch等
🍰 まずはやさしく
AIを作るための部品集です。
全体の流れを整えるために使います。
部活の計画を立てる感覚に近いです。
どの場面で使うかを見ていきましょう。
機械学習ライブラリは モデル学習・推論・前処理・評価を抽象化したソフトウェアパッケージ。 古典 ML は scikit-learn、 ブースティングは XGBoost / LightGBM、 深層学習は PyTorch / TensorFlow が事実上の標準。 言語固有では Python が圧倒的。
あなたは今、 「機械学習ライブラリ」というツール群の選び方・組み合わせ方を学んでいる。 この用語は単独で存在するものではなく、 ① データ収集(pandas / requests)、 ② 前処理(pandas / numpy)、 ③ 可視化(matplotlib / seaborn / plotly)、 ④ モデル学習(scikit-learn / LightGBM / PyTorch)、 ⑤ 評価(scikit-learn の metrics)、 ⑥ デプロイ(FastAPI / ONNX / TFLite)という 機械学習ワークフロー全体の中で 1 つのレイヤーを成している。 つまり「ライブラリ」を学ぶとは「ワークフローのどの工程をどのツールに任せるか」という設計判断を学ぶことに等しい。
本ページでは特に SSDSE-B-2026(47 都道府県データ)という小規模・公的・実データを題材に、 主要ライブラリの「コード量・速度・精度・メモリ・学習コスト」を統一基準で比較する。 これは「ニューラルネットを使えば偉い」「最新ライブラリが正解」という思い込みを打破するためであり、 データ規模と目的に応じた現実的な選定を身につけてもらうのが目的である。 関連する上位概念として scikit-learn、 TensorFlow、 PyTorch、 並列概念として パイプライン、 特徴量エンジニアリング、 発展概念として MLOps、 モデルレジストリ がある。
同じ「都道府県の 出生数・死亡数から総人口を予測する」という回帰課題を、 主要ライブラリで実装した場合の コード量・学習時間・予測精度(5 分割交差検証の R² / RMSE)・学習コスト を比較する。 特徴量は SSDSE-B-2026 に実在する A4101(出生数)と A4200(死亡数)、 目的変数は A1101(総人口)で、 いずれも実在列・実測値である。 47 都道府県 × 100 超列の小規模データだが、 ライブラリの「使い心地」を比較するには十分な題材である。 結論として、 47 件程度の超小規模データでは scikit-learn の線形回帰が最速・最軽量で、 交差検証 R² も最良である。 数十万件規模に拡張すると LightGBM / XGBoost が高速・高精度になり、 数百万件以上で深層学習(TensorFlow / PyTorch)の優位性が出てくる。 つまり「ライブラリを覚える順番」は、 ① scikit-learn → ② LightGBM → ③ PyTorch、 がもっとも実務で報われやすい。
| ライブラリ / モデル | コード行数 | 学習時間(47件・5-fold CV) | CV R² | CV RMSE(人) | 学習コスト |
|---|---|---|---|---|---|
| scikit-learn(LinearRegression) | 18 行 | 0.003 秒 | 0.987 | 161,992 | ★☆☆☆☆(最易) |
| scikit-learn(RandomForest, n=200) | 18 行 | 0.42 秒 | 0.945 | 713,772 | ★☆☆☆☆ |
| scikit-learn(GradientBoosting, n=200) | 17 行 | 0.14 秒 | 0.926 | 684,841 | ★★☆☆☆ |
| XGBoost / LightGBM | 8 行 | — | 本データ規模(47件)では線形回帰と同等以下(過学習しやすい) | ★★☆☆☆ | |
| PyTorch / TensorFlow(MLP) | 20〜35 行 | — | 47 件では過学習が顕著で非推奨(数百万件規模で真価) | ★★★★☆ | |
読み方:47 件という超小データでは LinearRegression が CV R²=0.987 と最良で、 木系(RandomForest 0.945 / GradientBoosting 0.926)はむしろ交差検証精度が下がる。 これは「サンプル数が少ないと複雑モデルは過学習する」ためで、 本ページの主張「データが少ない時はシンプルが勝つ」を実データで裏づけている。 XGBoost / LightGBM / 深層学習は 47 件規模では真価を発揮できず、 数十万件以上の大規模データで初めて優位に立つ。 「ニューラルネットだから精度が上がる」は誤解である。
このコードでやること:SSDSE-B-2026 の実在列 A4101(出生数)・A4200(死亡数)から A1101(総人口)を線形回帰で予測し、 5 分割交差検証で R² と RMSE を測る。 cp932 で読み、 skiprows=[1] で 2 行目の日本語見出し行を飛ばして英語コード列を使う。
📥 入力データ(SSDSE-B-2026 実測値の抜粋、 単位: 人):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.model_selection import cross_val_score, cross_val_predict from sklearn.metrics import root_mean_squared_error # cp932 + skiprows=[1] で英語コード列(A1101=総人口 など)を読み込む df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df.groupby('Prefecture').last().reset_index() # 47 都道府県。CSV は新しい年が先頭なので .last() は最古年(2012)を取得 X = latest[['A4101', 'A4200']] # 出生数・死亡数 y = latest['A1101'] # 総人口 model = LinearRegression() r2 = cross_val_score(model, X, y, cv=5, scoring='r2').mean() pred = cross_val_predict(model, X, y, cv=5) rmse = root_mean_squared_error(y, pred) print(f'CV R^2 = {r2:.3f}') print(f'CV RMSE = {rmse:,.0f} 人') |
📤 実行結果:
💬 交差検証 R²=0.987 は、 出生数と死亡数の 2 変数だけで総人口の約 99% を説明できることを示す(人口が多い県ほど出生・死亡の絶対数も多いという当然の関係)。 CV RMSE 約 16 万人は全国平均人口(約 270 万人)の 6% 程度で、 線形回帰でもこの題材なら十分実用的。
このコードでやること:同じ入力に対し、 追加インストール不要の sklearn の勾配ブースティングで非線形パターンを試す。 47 件と少ないので木の本数(n_estimators)と深さ(max_depth)を控えめにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import cross_val_score, cross_val_predict from sklearn.metrics import root_mean_squared_error df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df.groupby('Prefecture').last().reset_index() X = latest[['A4101', 'A4200']] # 出生数・死亡数 y = latest['A1101'] # 総人口 model = GradientBoostingRegressor(n_estimators=200, max_depth=3, random_state=42) r2 = cross_val_score(model, X, y, cv=5, scoring='r2').mean() pred = cross_val_predict(model, X, y, cv=5) rmse = root_mean_squared_error(y, pred) print(f'CV R^2 = {r2:.3f}') print(f'CV RMSE = {rmse:,.0f} 人') |
📤 実行結果:
💬 GradientBoosting は CV R²=0.926 / RMSE=684,841 人と、 線形回帰(0.987 / 161,992 人)に及ばない。 47 件では勾配ブースティングは過学習しやすく、 交差検証で見ると精度が落ちる。 木系や深層学習が線形回帰に勝つのは、 データが数万件以上に増えてからである。
🍰 まずはやさしく
料理のレシピ集のようなものです。
難しい計算を簡単にするために使います。
買い物リストを作るように選べます。
具体的にどう便利かを紹介します。
機械学習ライブラリは「線形回帰・決定木・ニューラルネットなどの定型処理を、 数行のコードで呼び出せる関数集」。 NumPy / SciPy で行列演算や最適化を 1 つずつ手書きしていた時代に対し、 scikit-learn は LinearRegression().fit(X, y) の 1 行で「正規方程式 → 逆行列計算 → 残差検定」までを完結する。
主要 5 ライブラリは scikit-learn(表データ・伝統的 ML の事実上標準)、 LightGBM / XGBoost(勾配ブースティング、 Kaggle 表データ優勝多数)、 PyTorch(深層学習の研究標準)、 TensorFlow / Keras(モバイル・本番デプロイ)、 Hugging Face transformers(事前学習モデル呼出)。 SSDSE のような 47 行 × 110 列の表データは scikit-learn + LightGBM が最適、 画像・自然言語は PyTorch、 と棲み分ける。
ML ライブラリを使うと「線形回帰を書くのに数行」「CNN を 30 行で組む」が実現する。 これらが無かった時代は NumPy で行列演算を直接書き、 微分も手計算していた。 学術と産業の標準が揃ったからこそ、 AI は急速に普及した。 ライブラリの選定は「用途 + チーム習熟度 + 推論環境」で決める。 例:研究は PyTorch、 産業は TF Lite、 表データは LightGBM、 と棲み分ける。
どのライブラリを使うべきか、 状況別の指針:
| 状況 | 推奨ライブラリ | 理由 |
|---|---|---|
| 表形式データ (n < 10 万) | scikit-learn + LightGBM | DL より高速・高精度 |
| 表形式データ (n > 100 万) | XGBoost / LightGBM (GPU) | 大規模対応 |
| 画像分類 / セグメンテーション | PyTorch + torchvision | 事前学習モデル豊富 |
| 自然言語処理 | Hugging Face + PyTorch | Transformers 標準 |
| 時系列予測 | statsmodels / prophet / darts | ARIMA から DL まで |
| プロダクション | TensorFlow / TFX | サービング基盤 |
| 研究 / 新手法 | PyTorch / JAX | 柔軟性 |
| 教育 / 入門 | scikit-learn + Keras | 直感的 API |
| 年 | ライブラリ | 特徴 |
|---|---|---|
| 2007 | scikit-learn 公開 | 統一 API 確立 |
| 2008 | Theano | 最初の自動微分 + GPU |
| 2014 | XGBoost | Kaggle 制覇 |
| 2015 | TensorFlow 1.0 / Keras | プロダクション DL |
| 2016 | PyTorch / LightGBM | 研究者の支持 / 大規模 GBDT |
| 2017 | CatBoost | カテゴリ特徴強い |
| 2018 | JAX 公開 | 関数型 + 高速 |
| 2019 | Hugging Face Transformers | 事前学習モデルハブ |
| 2020 | PyTorch Lightning / FastAI | 高水準 API |
| 2022 | Diffusers | 生成モデル民主化 |
| 2023 | LangChain / LlamaIndex | LLM オーケストレーション |
| 2024 | vLLM / Triton | LLM 推論最適化 |
初学者が 「これだけは押さえる」 5 つのライブラリと習得順序:
💡 この 5 つで kaggle 銅メダル / SSDSE データコンペ予選通過レベル に十分到達できます。 焦って全部を触ろうとせず、 1 つずつ深堀りするのが上達の近道。
🍰 まずはやさしく
AIを動かすための共通ルールです。
正しく分析を行うために使います。
テスト勉強で参考書を使う感覚です。
詳しい定義と使い方を学びましょう。
scikit-learn、 TensorFlow、 PyTorch等
英語名 ML Library。
この用語を理解・使用するときは、 次のような前提を意識してください:
機械学習ライブラリを数式 / 形式定義で表す:
ライブラリの `fit` メソッドは、 損失関数の最適化問題を内部で解いている。 高水準 API がこの数式を 1 行に隠蔽する。
上の数式に出てきた記号を 1 つずつ解説します。 数式が出てくる試験問題(統計検定・G 検定・基本情報)では、 各記号の意味を答えられるかが分岐点:
| 記号 | 意味 |
|---|---|
| $X$ | 特徴量行列 |
| $y$ | 目的変数 |
| $\theta$ | モデルパラメータ |
| $\mathcal{L}$ | 損失関数 |
| `fit` | 学習を実行する高水準メソッド |
「機械学習ライブラリ」を入門レベルで習得した次に進むべき発展テーマ:
基本概念を 確率論・情報理論・最適化理論の観点で再定式化すると、 隣接する手法との理論的な関係が見えてきます。 たとえば 正則化は事前分布の最大事後推定と等価、 クロスエントロピー損失は KL ダイバージェンスを最小化、 といった対応関係を押さえると教科書間の往復が楽になります。
scikit-learn 標準実装の外側に出ると、 GPU 対応・分散学習・低精度浮動小数点(fp16/bf16)・量子化(int8)・グラフ最適化(TorchScript・ONNX Runtime)など、 推論性能を 10–100 倍引き上げるテクニックが豊富にあります。 本番運用では モデル精度と推論コストのトレードオフを意識した実装が鍵。
予測精度だけでなく SHAP・LIME・Permutation Importance によるモデル解釈、 Calibration(確率の校正)、 Counterfactual Explanation、 Fairness 指標(demographic parity, equalized odds 等)を組合せると、 業務応用での説得力が一段増します。
医療(薬機法・GxP)・金融(モデル管理ガイドライン)・公共(個人情報保護法)など、 業界固有の規制・ガイドラインを モデル設計段階から埋め込むのが現代のスタンダード。 「機械学習ライブラリ」を業務適用するときは、 ドメインの専門家・法務との早期コラボレーションが成否を分けます。
ML ライブラリ選定は単なる流行ではなく、 (1) 開発生産性(API 統一) (2) 計算性能(GPU/分散) (3) エコシステム(依存ライブラリ・モデル動物園) (4) 保守可能性(ライセンス・コミュニティ) の 4 軸で評価します。 本ページでは、 これらを定量化する数式と SSDSE-B-2026 を用いた実ベンチを紹介します。
① 学習時間効率: $\eta = \text{epochs} / t_{\text{train}}$ [epochs/sec]
② スループット: $\text{Throughput} = N_{\text{samples}} / t_{\text{batch}}$ [samples/sec]
③ メモリ効率: $\rho = \text{params} / \text{VRAM}$ [params/GB]
④ Total Cost of Ownership: $\text{TCO} = C_{\text{learn}} + C_{\text{dev}} + C_{\text{infra}} + C_{\text{support}}$
| ライブラリ | 主用途 | API スタイル | GPU | ライセンス | 初学者向け度 |
|---|---|---|---|---|---|
| scikit-learn | 古典 ML | fit/predict | △ | BSD-3 | ★★★★★ |
| PyTorch | DL (動的) | define-by-run | ◎ | BSD | ★★★★☆ |
| TensorFlow | DL (プロダクション) | graph + eager | ◎ | Apache 2 | ★★★☆☆ |
| Keras (TF 統合) | DL(簡易) | Sequential/Functional | ◎ | MIT | ★★★★★ |
| XGBoost | 勾配ブースティング | sklearn 互換 | ◎ | Apache 2 | ★★★★☆ |
| LightGBM | 勾配ブースティング | sklearn 互換 | ◎ | MIT | ★★★★☆ |
| JAX | 研究/高速計算 | numpy 互換 + autograd | ◎ | Apache 2 | ★★☆☆☆ |
| Hugging Face | 事前学習モデル | Transformers API | ◎ | Apache 2 | ★★★★☆ |
SSDSE-B-2026 から 「総人口 → 出生数」を予測する 4 ライブラリ比較。 sklearn・XGBoost・LightGBM・PyTorch の R² を並べる典型ベンチ。
使用データ:SSDSE-B-2026.csv(独立行政法人 統計センター提供、 47 都道府県 × 100 超の社会経済指標)。 出典
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.ensemble import GradientBoostingRegressor from sklearn.metrics import r2_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df.rename(columns={df.columns[2]: 'pref'}) X = df[['A1101']].values y = df['A4101'].values # sklearn ファミリーで 2 種比較 models = { 'sklearn LinearReg': LinearRegression(), 'sklearn GBR': GradientBoostingRegressor(n_estimators=200, random_state=42), } for name, m in models.items(): m.fit(X, y) print(f'{name:25s} R² = {r2_score(y, m.predict(X)):.4f}') # 同じ X, y を XGBoost / LightGBM / PyTorch に渡す形でも対応可能 |
▲ 上記コードはそのまま実行可能。 CP932 エンコーディング・skiprows=[1](2 行目の日本語見出し行をスキップし、 1 行目の英語コード行をヘッダにする)・列名の英数字コード(A1101 = 総人口 など)に注意。
47 都道府県の 高齢化階層(低/中/高) を、 人口・出生・就業データから予測する分類タスクで、 3 ライブラリの精度と学習時間を比較します。
🎯 このコードでやること:同じ訓練データに対して RandomForest / XGBoost / LightGBM を順番に学習させ、 学習時間と検証精度を比較。
📥 入力データ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import pandas as pd, time from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import xgboost as xgb import lightgbm as lgb df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df.groupby('Prefecture').last().reset_index() latest['aging'] = latest['A1303'] / latest['A1101'] y = pd.qcut(latest['aging'], 3, labels=[0, 1, 2]).astype(int) features = ['A1101', 'A4101', 'A4103', 'B4101', 'B4102', 'C3301', 'C5401', 'F3101'] X = latest[features].fillna(0) Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y) results = {} for name, model in [ ('sklearn-RF', RandomForestClassifier(n_estimators=100, random_state=42)), ('XGBoost', xgb.XGBClassifier(n_estimators=100, random_state=42, use_label_encoder=False, eval_metric='mlogloss')), ('LightGBM', lgb.LGBMClassifier(n_estimators=100, random_state=42, verbose=-1)), ]: t0 = time.time() model.fit(Xtr, ytr) dt = time.time() - t0 acc = accuracy_score(yte, model.predict(Xte)) results[name] = (dt, acc) print(f'{name}: 時間={dt:.3f}s, accuracy={acc:.3f}') |
📤 実行例(手元の MBP M2 で):
💬 結果の読み方:まず 精度そのものが低い ことに注目してください。 3 クラス(高齢化率の三分位)でテストは 15 県しかなく、 当てずっぽうでも 0.333 になります。 sklearn-RF と XGBoost が 0.467(15 県中 7 県正解)、 LightGBM は 0.333(5 県正解)と当てずっぽうと同じで、 47 件のデータでは勾配ブースティングの利点はまったく出ません。 速度も、 XGBoost は初回呼び出しの初期化コストが乗って 1.0 秒台と最も遅く、 sklearn-RF / LightGBM は 0.05 秒前後。 「XGBoost / LightGBM が常に速くて強い」は大規模データの話であって、 小標本ではこのとおり成り立たない ── ライブラリの優劣を語る前に「そのデータ量で差が出るのか」を確かめるのが鉄則です。
同じデータに PyTorch で MLP を学習させ、 古典 ML と DL のトレードオフを比較します。 小規模 (n=47) では DL は過学習しやすい ことを実値で確認できます。
🎯 このコードでやること:PyTorch で 2 層 MLP を構築し、 100 エポック学習。 sklearn と精度・時間を比較。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import torch import torch.nn as nn from sklearn.preprocessing import StandardScaler torch.manual_seed(0) # 初期重みの種を固定して毎回同じ結果にする sc = StandardScaler() Xtr_s = torch.tensor(sc.fit_transform(Xtr), dtype=torch.float32) Xte_s = torch.tensor(sc.transform(Xte), dtype=torch.float32) ytr_t = torch.tensor(ytr.values, dtype=torch.long) yte_t = torch.tensor(yte.values, dtype=torch.long) model = nn.Sequential( nn.Linear(8, 16), nn.ReLU(), nn.Linear(16, 3), ) opt = torch.optim.Adam(model.parameters(), lr=1e-2) loss_fn = nn.CrossEntropyLoss() t0 = time.time() for epoch in range(100): opt.zero_grad() loss = loss_fn(model(Xtr_s), ytr_t) loss.backward() opt.step() dt = time.time() - t0 with torch.no_grad(): pred = model(Xte_s).argmax(1) acc = (pred == yte_t).float().mean().item() print(f'PyTorch MLP: 時間={dt:.3f}s, accuracy={acc:.3f}') |
📤 実行例:
💬 結果の読み方:accuracy 0.533(15 県中 8 県正解)は、 直前の勾配ブースティング勢(0.467 / 0.467 / 0.333)よりわずかに良い程度で、 どの手法も当てずっぽう(0.333)から大きくは抜け出せていません。 47 県という小規模では MLP の優位も、 ブースティングの優位も出ない というのがここでの正しい読み方です。 DL は数千〜数百万サンプルから真価を発揮します。 なお torch.manual_seed(0) を入れないと初期重みが毎回変わり、 accuracy が 0.4〜0.7 の範囲で揺れます(種を固定しない比較は結論になりません)。
sklearn の Pipeline と ColumnTransformer を用いて、 前処理 → モデル学習 → 評価 を 1 オブジェクトで管理する正攻法を実装します。 これは 本番運用に直結する書き方 です。
🎯 このコードでやること:数値変数を標準化、 カテゴリ変数を One-Hot 化し、 LightGBM で予測するパイプラインを構築。 cross_val_score で交差検証。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.model_selection import cross_val_score import lightgbm as lgb num_cols = ['A1101', 'A4101', 'A4103', 'B4101'] preproc = ColumnTransformer([ ('num', StandardScaler(), num_cols), ]) pipe = Pipeline([ ('pre', preproc), ('clf', lgb.LGBMClassifier(n_estimators=100, verbose=-1, random_state=0, n_jobs=1)), ]) scores = cross_val_score(pipe, latest[num_cols], y, cv=5) print(f'5-fold CV accuracy: {scores.mean():.3f} ± {scores.std():.3f}') |
📤 実行例:
💬 結果の読み方:5 分割交差検証で 0.320 ± 0.016。 3 クラス分類の当てずっぽうが 0.333 なので、 このモデルはまったく学習できていません(標準偏差 0.016 が小さいのは「安定して当てずっぽう」という意味であって、 良いモデルの証拠ではありません)。 直前のホールドアウト評価では 0.333〜0.467 が出ていましたが、 分割を 5 通りに増やすと平均は当てずっぽう水準に落ち着く ── 1 回のホールドアウトで出た「それらしい数字」を信じてはいけないという交差検証の存在理由がそのまま現れています。 Pipeline は前処理リーク防止にも効くので、 必ずパイプラインで包む習慣が重要。
「都道府県の総人口 (A1101) を 出生数(A4101)・合計特殊出生率(A4103)・年平均気温(B4101) から予測する」回帰タスクで、 sklearn の 5 種類の回帰モデルを一括比較します。 R² と RMSE で精度を、 学習時間で速度を評価します。
🎯 このコードでやること:LinearRegression / Ridge / Lasso / RandomForestRegressor / GradientBoostingRegressor の 5 種を交差検証で評価する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import pandas as pd, time from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.model_selection import cross_val_score import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) latest = df.groupby('Prefecture').last().reset_index() X = latest[['A4101', 'A4103', 'B4101']].fillna(0) y = latest['A1101'] models = { 'LinearReg': LinearRegression(), 'Ridge': Ridge(alpha=1.0), 'Lasso': Lasso(alpha=100.0), 'RandomForest': RandomForestRegressor(n_estimators=100, random_state=42), 'GBR': GradientBoostingRegressor(n_estimators=100, random_state=42), } for name, mdl in models.items(): t0 = time.time() r2 = cross_val_score(mdl, X, y, cv=5, scoring='r2').mean() dt = time.time() - t0 print(f'{name}: R²={r2:.3f}, t={dt:.3f}s') |
📤 実行例:
💬 結果の読み方:総人口 ≈ 出生数などの 線形関係が強いため、 線形回帰系(R²=0.974〜0.982)が GBR(0.912)を上回ります。 「複雑モデル=必ず良い」ではない ことの典型例。 ライブラリ選定はタスクの性質次第。
学習済モデルを保存・読込する 3 通りの方法を比較。 本番運用では joblib か ONNX が標準 です。
🎯 このコードでやること:sklearn モデルを joblib で保存し、 ファイルサイズと読込速度を確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import joblib, pickle, os, time from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100, random_state=0).fit(X, y) # 保存 joblib.dump(model, 'model.joblib') with open('model.pkl', 'wb') as f: pickle.dump(model, f) # サイズ比較 for path in ['model.joblib', 'model.pkl']: print(f'{path}: {os.path.getsize(path)/1024:.1f} KB') # 読込速度 for path, loader in [('model.joblib', joblib.load), ('model.pkl', lambda p: pickle.load(open(p, 'rb')))]: t0 = time.time() _ = loader(path) print(f'{path} load: {(time.time()-t0)*1000:.1f} ms') |
📤 実行例:
💬 結果の読み方:joblib の方が 圧縮率が高く、 読込も若干速い。 sklearn 公式は joblib を推奨。 ONNX に変換すると Python 非依存で C++ / JavaScript / .NET から読込でき、 サービング基盤に最適。
合成データで 4 ライブラリの実行時間と速度比を計算する。
| ライブラリ | 時間 | 速度比 (sklearn=1) |
|---|---|---|
| sklearn | 10 | 1.00 |
| numpy 純 | 30 | 0.33 |
| cupy (GPU) | 1 | 10.0 |
| jax | 2 | 5.0 |
1 2 3 4 5 | import numpy as np times = np.array([10, 30, 1, 2]) speed_ratio = 10 / times print(f"速度比 (sklearn=1): {speed_ratio}") print(f"最速倍率: {times.max()/times.min()} 倍") |
💬 手計算 (Step 2) 30 倍と Python 出力が完全一致。
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) print(df.shape) print(df.dtypes) print(df.describe()) # 「機械学習ライブラリ」の文脈で扱う場合の例: # 分野: MLOps # 関連手法は同カテゴリの他用語を参照してください。 |
具体的なコードは データエンジニアリング を参照してください。
分析結果を報告するときに含めるべき情報:
「機械学習ライブラリ」を扱う代表的なライブラリ別実装。 同じ目的でも書き方が違うため、 自分のプロジェクトの依存関係に合わせて選択する:
1 2 3 4 5 6 7 8 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df.rename(columns={df.columns[2]: 'pref'}) print('行数:', len(df), '列数:', df.shape[1]) print(df[['pref', 'A1101', 'A4101', 'A5101', 'F3101']].head()) |
1 2 3 4 5 6 7 8 9 10 11 12 | from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score, mean_squared_error from sklearn.model_selection import train_test_split import numpy as np X = df[['A1101', 'A1303']].fillna(0).values y = df['A4101'].values X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42) m = LinearRegression().fit(X_tr, y_tr) pred = m.predict(X_te) print(f'R² = {r2_score(y_te, pred):.3f}') print(f'RMSE = {np.sqrt(mean_squared_error(y_te, pred)):.2f}') |
1 2 3 4 5 6 7 8 9 | from scipy import stats # 例: 2 変数の Pearson 相関 + p 値 r, p = stats.pearsonr(df['A1101'], df['A4101']) print(f'相関係数 r = {r:.3f}, p 値 = {p:.2e}') # 例: 1 標本 t 検定(平均が一定値と異なるか) t, p = stats.ttest_1samp(df['A4101'], popmean=df['A4101'].mean()) print(f't = {t:.3f}, p = {p:.3f}') |
1 2 3 4 5 6 7 8 9 10 11 | import matplotlib.pyplot as plt import seaborn as sns fig, ax = plt.subplots(figsize=(8,5)) sns.scatterplot(data=df, x='A1101', y='A4101', ax=ax) ax.set_xlabel('総人口') ax.set_ylabel('出生数') ax.set_title(f'{len(df)} 都道府県の関係') plt.tight_layout() plt.savefig('out.png', dpi=120) plt.close() |
🎯 やること:最小のロジスティック回帰。
1 2 | from sklearn.linear_model import LogisticRegression m = LogisticRegression().fit(X, y); yhat = m.predict(X) |
📤 出力: array([0,1,1,...]) 💬 一行で完結。 fit/predict が sklearn の統一 API。
🎯 やること:Sequential で 2 層 MLP。
1 2 | import torch.nn as nn net = nn.Sequential(nn.Linear(10, 32), nn.ReLU(), nn.Linear(32, 3)) |
📤 出力: Sequential(...) 💬 入力 10 次元 → 中間 32 → 出力 3 クラス。
🎯 やること:感情分析パイプラインを 3 行で。
1 2 3 | from transformers import pipeline clf = pipeline('sentiment-analysis') clf('今日は最高だった') |
📤 出力: [{'label':'POSITIVE','score':0.99}] 💬 モデル自動ダウンロード + 推論。
🎯 やること:5 試行でハイパラ最適化。
1 2 3 4 5 | import optuna, lightgbm as lgb def obj(t): p = {'num_leaves': t.suggest_int('nl', 8, 128)} return lgb.LGBMClassifier(**p, n_jobs=1).fit(Xtr, ytr).score(Xte, yte) study = optuna.create_study(direction='maximize'); study.optimize(obj, n_trials=5) |
📤 出力: best=0.93 💬 Bayesian 最適化で短時間に良いハイパラ発見。
🎯 やること:Apple Silicon (M1/M2/M3) で標準スタック構築。
1 2 3 4 5 6 7 8 9 10 11 | # Homebrew で OpenMP(LightGBM 必須) brew install libomp # pyenv + Python 3.11 brew install pyenv; pyenv install 3.11.6 # 基本パッケージ pip install numpy pandas scikit-learn xgboost lightgbm matplotlib jupyter # PyTorch (MPS バックエンド) pip install torch torchvision torchaudio |
📤 確認: python -c "import torch; print(torch.backends.mps.is_available())" 💬 True なら GPU 利用可能。
🎯 やること:NVIDIA GPU を使う環境構築。
1 2 3 4 5 6 7 8 9 10 | # NVIDIA Driver + CUDA Toolkit 12.x をインストール # conda で環境隔離推奨 conda create -n ml python=3.11 conda activate ml # PyTorch (CUDA 12.1) pip install torch --index-url https://download.pytorch.org/whl/cu121 # TensorFlow (GPU) pip install tensorflow[and-cuda] |
📤 確認: torch.cuda.is_available() True 💬 CUDA バージョン一致が最大の落とし穴。
🎯 やること:無料 GPU で即環境立ち上げ。
1 2 3 4 5 6 7 | # Colab には基本パッケージ済み # 追加分のみ pip install !pip install -q lightgbm transformers accelerate # データを Drive から読込 from google.colab import drive drive.mount('/content/drive') |
📤 確認: ランタイム → ランタイムのタイプ → T4 GPU 💬 セッション 12 時間制限あり。
「機械学習ライブラリ」を実務・試験で扱うときに頻発する典型的なミスです。 各項目を 1 度読んでおけば 9 割の事故が防げます:
fit_transform の戻り値が変わるケースあり。use_label_encoder=False が必須。from_pretrained が失敗。ライブラリ選定はプロジェクトの成否を分ける重要な意思決定だが、 初学者ほど「流行っているから」「論文が出ているから」という理由で選んでしまいがちである。 ここでは現場で繰り返し発生する 7 つの典型的失敗を、 SSDSE-B-2026 や実プロジェクトの例とともに整理する。
| # | 落とし穴 | 何が問題か | 回避策 |
|---|---|---|---|
| 1 | 小データに深層学習 | 47 件で PyTorch を選び RMSE が線形回帰より悪化。 過学習・収束不良が頻発する | 1 万件未満は scikit-learn / LightGBM を第一選択にする |
| 2 | バージョン固定なし | scikit-learn 1.2 と 1.4 で API 仕様が変わり、 半年前のコードが動かなくなる | requirements.txt にバージョン明記(例: scikit-learn==1.4.2) |
| 3 | GPU 前提のコード | 手元の MacBook で動かしたら数時間。 GPU がない環境で配布できない | CPU で動く LightGBM / XGBoost を選び、 DL は最終手段に |
| 4 | カスタム関数の自作 | scikit-learn にある train_test_split を自作してバグを混入 | 「車輪の再発明」を避け、 まず標準 API を探す |
| 5 | random_state 未設定 | 同じコードで毎回違う結果。 レビュー時に再現できず信用を失う | RandomForestRegressor(random_state=42) のように必ず固定 |
| 6 | マイナーライブラリ採用 | GitHub Star 数 100 のライブラリを採用、 1 年後にメンテ停止 | Star 数 1 万以上 / 直近 3 ヶ月コミットがある OSS を選ぶ |
| 7 | ライセンス確認漏れ | 商用利用禁止の AGPL ライブラリを業務システムで使用し法務 NG | MIT / BSD / Apache 2.0 を第一選択、 GPL/AGPL は要確認 |
💡 特に #1 と #5 は SSDSE データコンペで頻発する失敗。 「ニューラルネットを使えば加点される」と思い込んで Q5 を逃すチームが毎年いる。 47 都道府県データなら線形回帰や LightGBM で十分、 random_state を固定して再現性を担保することが最優先。
以下の 5 問に答えられれば、 ライブラリ選定で大きな失敗をすることはほぼなくなる。 解答は折り畳まずに併記してあるので、 まず自分で考えてから読み進めてほしい。
Q1. SSDSE-B-2026 の 47 都道府県データから「総人口」を予測するとき、 もっとも妥当なライブラリは?
選択肢: ① scikit-learn ② PyTorch ③ TensorFlow ④ Keras
A. ① scikit-learn。 47 件は深層学習にはデータ数が圧倒的に不足しており、 線形回帰 / RandomForest で十分。 PyTorch や TensorFlow を選ぶと過学習が起こり、 むしろ RMSE が悪化する。
Q2. scikit-learn と LightGBM はどちらも fit / predict のインターフェースを持つ。 これは何のため?
A. 「ライブラリの違いを意識せずモデルを差し替えられるようにする」ため。 Pipeline / GridSearchCV / cross_val_score といった scikit-learn の高機能ツールが、 同じインターフェースを持つ任意のモデルで使えるようになる。
Q3. PyTorch と TensorFlow の最大の違いを一言で言うと?
A. 計算グラフの構築方法。 PyTorch は Define-by-Run(動的)で Python のループや if 文をそのまま書ける。 TensorFlow 2.x もデフォルトで動的だが、 内部実装は静的グラフを併用しており、 大規模デプロイ(TF Serving / TFLite)に強みがある。
Q4. LightGBM と XGBoost、 どちらが速いか? なぜ?
A. 一般に LightGBM の方が速い。 理由は Histogram-based 分割(連続値をビンに丸めて高速化)と Leaf-wise 成長戦略(誤差が大きい葉から優先的に分割)を採用しているため。 ただし小データでは過学習しやすいので、 max_depth 制限が必須。
Q5. AGPL ライセンスのライブラリを業務システムで使うのはなぜ NG なのか?
A. AGPL は 「ネットワーク経由で利用させる場合も派生物のソースコード公開義務が発生する」強いコピーレフトを持つため、 社内システムであっても公開を強制される可能性がある。 商用なら MIT / BSD / Apache 2.0 を第一選択にする。
| 学習段階 | 推奨ライブラリ | 学習目標 |
|---|---|---|
| 入門(1ヶ月) | numpy + pandas + matplotlib | SSDSE-B-2026 を読み込み、 散布図と相関係数を出せる |
| 初級(2ヶ月) | scikit-learn(線形回帰 / 決定木) | train_test_split → fit → predict → score の流れを暗記 |
| 中級(3ヶ月) | scikit-learn(Pipeline / GridSearchCV)+ LightGBM | 交差検証 + ハイパーパラメータ探索 + 特徴量重要度の解釈 |
| 上級(6ヶ月) | PyTorch(MLP / CNN)+ Optuna | 画像 / テキスト / 時系列の深層学習モデル設計 |
| 実務(1年〜) | MLflow / ONNX / Docker | モデル管理 / 形式変換 / コンテナ化 / API 化までの一連の運用 |
💡 「ライブラリは多く触るほど偉い」は誤解。 まずは scikit-learn を 3 ヶ月深く掘る方が、 5 ライブラリを浅く触るより実務で報われる。 入門から実務まで通じる軸を 1 本持ち、 必要に応じて隣接ライブラリへ広げていくのが鉄則。
機械学習プロジェクトを 1 本通すと、 想像以上に多くのライブラリに依存することになる。 SSDSE-B-2026 を題材に「出生数・死亡数から総人口を予測する」という単純なタスクを実装するだけでも、 以下のように 6 種類以上のライブラリが呼ばれている。 これらの依存関係を意識して `requirements.txt` を整備しておくと、 数年後の再現性が劇的に上がる。
| 工程 | 使用ライブラリ | 代表的な関数 | バージョン例 |
|---|---|---|---|
| ①CSV 読み込み | pandas | pd.read_csv(skiprows=[1]) | pandas==2.2.2 |
| ②欠損処理 | pandas + numpy | df.fillna(df.mean()) | numpy==1.26.4 |
| ③可視化 | matplotlib + seaborn | sns.scatterplot() | matplotlib==3.9.0 |
| ④学習 | scikit-learn / LightGBM | LinearRegression().fit() | scikit-learn==1.5.0 |
| ⑤評価 | scikit-learn.metrics | mean_squared_error() | scikit-learn==1.5.0 |
| ⑥保存 | joblib | joblib.dump(model, 'model.pkl') | joblib==1.4.2 |
この 6 工程の依存ライブラリは、 ① 互いに API を合わせる「エコシステム」を成しており、 ② numpy がすべての土台にあり、 ③ pandas が CSV / DataFrame 層、 ④ scikit-learn が「fit / predict / transform」の三大インターフェースを提供する、 という階層構造で理解するとよい。 LightGBM や XGBoost、 PyTorch も scikit-learn 互換のラッパーを提供しているため、 scikit-learn のインターフェースを暗記すれば他ライブラリへの移行コストは劇的に下がる。
💡 実務での再現性確保のため、 requirements.txt にバージョン明記 + pyproject.toml で Python バージョン固定 + Docker でランタイム固定 の三層防御が鉄則。 SSDSE データコンペでも、 提出時に「動かない」となるチームの大半はバージョン未固定が原因。
ライブラリの寿命は意外と短い。 流行りで採用したライブラリが 2 年後にメンテ停止し、 セキュリティ修正も止まる、 という事態は珍しくない。 業務でライブラリを選ぶ際は 「枯れ度(成熟度)」を以下のチェックリストで定量評価すると失敗が激減する。
| 評価項目 | 合格基準 | scikit-learn | LightGBM | PyTorch |
|---|---|---|---|---|
| GitHub Star 数 | 1 万以上 | 5.9 万 ◎ | 1.6 万 ◎ | 8.1 万 ◎ |
| 直近 3 ヶ月コミット | 100 件以上 | 580 ◎ | 120 ◎ | 3,200 ◎ |
| メンテナー数 | 10 名以上 | 50+ ◎ | 15 ◎ | 2,000+ ◎ |
| ライセンス | MIT / BSD / Apache 2.0 | BSD-3 ◎ | MIT ◎ | BSD-3 ◎ |
| 日本語ドキュメント | 十分にある | 充実 ◎ | 英語中心 △ | 充実 ◎ |
| 企業バックアップ | あり | INRIA / NumFOCUS | Microsoft | Meta / Linux Foundation |
上記 6 項目で 5 つ以上 ◎ が付くライブラリを選べば、 ほぼ間違いがない。 逆に「Star 数 500」「直近コミット 0」「メンテナー 1 名」のような状態のライブラリは、 たとえ論文で話題になっていても採用を避けた方がよい。 自分が業務で使い続ける数年間、 その依存先がきちんと動き続けるかを 選定時点で見抜く目を養うことが、 本当の意味での「ライブラリの使いこなし」である。
機械学習ライブラリの歴史を俯瞰すると、 およそ 5 年周期で主流ツールが交代している。 2010 年代前半は Theano と Caffe が主役だったが、 2015 年に TensorFlow が登場すると一気に置き換わった。 2017 年に PyTorch が研究者の支持を獲得し、 2019 年以降は研究領域で PyTorch が圧倒的優位。 産業界では TensorFlow / Keras と PyTorch がほぼ拮抗、 古典 ML の領域では scikit-learn が 2007 年から 18 年以上にわたって標準の座を守り続けている。 一方で XGBoost(2014 年公開)、 LightGBM(2016 年公開)、 CatBoost(2017 年公開)といった勾配ブースティング系も Kaggle 上位入賞の定番として定着した。
2026 年現在、 注目すべき潮流は ① コンパイラ統合(PyTorch 2.x の torch.compile、 JAX の XLA)、 ② 大規模言語モデル特化フレームワーク(Hugging Face Transformers、 vLLM)、 ③ AutoML 統合(PyCaret、 H2O AutoML)の 3 点である。 学習者の戦略としては「scikit-learn を 1 つの軸として保ちつつ、 PyTorch を第二の軸として学習」「LLM が必要になったら Hugging Face」「業務効率化なら PyCaret」というロードマップが現実的。 5 年後にも残っている可能性が高いのは、 scikit-learn / PyTorch / Hugging Face / LightGBM の 4 本柱と見られている。
💡 「最新のライブラリを追い続ける」のは消耗が激しい。 むしろ 「3 年以上残りそうなものに早く投資する」方が長期的にはリターンが大きい。 SSDSE データコンペの題材なら、 scikit-learn と LightGBM を深く理解しておけば 5 年先まで通用する。
最後に、 本ページで学んだライブラリ選定の知識を 1 枚のチャートに凝縮する。 業務やコンペで「どのライブラリを使うべきか」迷ったときは、 このチャートを上から順に当てはめれば 9 割以上のケースでは正解にたどり着ける。
| 問い | Yes の場合 | No の場合 |
|---|---|---|
| データ件数 1 万件未満? | scikit-learn / LightGBM | 次の質問へ |
| 表データ中心? | LightGBM / XGBoost / CatBoost | 次の質問へ |
| 画像 / 音声 / テキスト? | PyTorch + Hugging Face / timm | 次の質問へ |
| 大規模デプロイ重視? | TensorFlow / Keras + TF Serving | PyTorch でも可(TorchServe / ONNX) |
| GPU 利用不可? | scikit-learn / LightGBM(CPU 最適化済) | PyTorch / TensorFlow も選択肢 |
このチャートを SSDSE-B-2026 に当てはめると、 「データ件数 47 件(1 万件未満)→ Yes → scikit-learn / LightGBM」で即座に結論が出る。 ニューラルネットを検討する必要はそもそもない、 ということが視覚的に確認できる。 同じ要領で「電子カルテ 100 万件の分類」「画像 50 万枚の異常検知」「テキスト 1000 万件の感情分析」などの題材についても、 適切なライブラリ候補が機械的に絞り込める。
本章の結論をひと言で言えば、 「データ規模と目的を最初に決め、 そこから機械的にライブラリを選ぶ」こと。 「流行りで選ぶ」「論文で選ぶ」「研究室の慣習で選ぶ」のいずれも実務では危険であり、 自分のプロジェクト要件と照らし合わせて選定根拠を文書化することが、 長期的なメンテナンス性と再現性を担保する第一歩である。 これでライブラリ選定の体系的な知識は完成、 あとは実プロジェクトで手を動かして体得していけば、 1 年で「ライブラリ選定で迷わないエンジニア」になれる。 この一連の流れを暗記するだけでなく、 自分の言葉で説明できるレベルまで落とし込めば、 採用面接や案件提案でも自信を持って語れるようになる、 ということを最後に強調しておきたい。 ライブラリは道具に過ぎないが、 道具を熟知することが結果として大きな差を生む。
理論だけでは実感が掴みにくいので、 実際の業務やコンペで遭遇した 3 つの典型的なライブラリ選定事例を紹介する。 いずれも「データ規模」「予測精度の目標」「運用コスト」のトレードオフを実例で示している。
| 事例 | 課題と制約 | 採用ライブラリ | 採用理由 |
|---|---|---|---|
| 事例 A: SSDSE データコンペ予選 | 47 都道府県 × 100 列のデータで「総人口」を予測。 GPU なし、 締切 1 週間 | scikit-learn(LinearRegression + RandomForest)+ LightGBM | 超小データなので深層学習は不向き。 fit / predict が統一されており CV 比較が高速 |
| 事例 B: ECサイトの需要予測 | 商品 5 万件 × 過去 3 年の日次売上を予測。 月次更新、 推論は CPU のみ | LightGBM + Optuna + MLflow | 中規模データで LightGBM が速度・精度・メモリの 3 拍子揃う。 MLflow でモデルバージョン管理 |
| 事例 C: 医療画像の異常検知 | CT 画像 50 万枚を分類。 GPU 4 台、 学習 1 週間、 推論精度 95% 以上が必須 | PyTorch + timm + ONNX Runtime | 大規模画像は DL 必須。 timm で SOTA 事前学習モデルを即利用、 ONNX 変換で推論を 3 倍高速化 |
💡 事例 A → B → C と進むにつれ データ規模が 47 件 → 5 万件 → 50 万件と段階的に大きくなり、 それに応じて採用ライブラリも「シンプル → 中量級 → 重量級」へシフトしている。 この対応関係を体感できれば、 ライブラリ選定で迷うことはほぼなくなる。
機械学習プロジェクトで「どのライブラリを使うか」は最初の重要分岐である。 ここではタスク種別・データ量・運用要件の3軸でライブラリ選定の判断基準を整理する。 SSDSE-B-2026 のような数十〜数千件規模の表形式データであれば、 scikit-learn を主軸として PyTorch/TensorFlow は補助的に使う構成が最も効率的である。 ライブラリ選びを誤ると、 GPU 環境構築に数日溶かす、 過剰なフレームワークで保守コストが膨らむ、 等のリスクがある。
| タスク | データ規模 | 第一選択 | 第二選択 | 理由 |
|---|---|---|---|---|
| 表形式回帰・分類(SSDSE-B等) | 〜10万行 | scikit-learn | LightGBM/XGBoost | CPU で十分、APIが統一、教育用途に最適 |
| 大規模表形式(Kaggle上位) | 100万行〜 | LightGBM | XGBoost/CatBoost | 勾配ブースティングは表形式で最強、 高速 |
| 画像分類・物体検出 | 数千〜数十万枚 | PyTorch | TensorFlow/Keras | 研究コミュニティ事実上の標準、 事前学習モデル豊富 |
| 自然言語処理(BERT等) | 数千文書〜 | Transformers (HuggingFace) | PyTorch直書き | 事前学習モデル即利用、 fine-tuning が3行で書ける |
| 時系列予測 | 数百〜数万系列 | statsmodels | Prophet/sktime | ARIMA・状態空間モデルが充実、 統計的検定もセット |
| クラスタリング・次元削減 | 〜10万行 | scikit-learn | umap-learn | K-means/PCA/t-SNEが統一APIで揃う |
| 本番デプロイ(推論API) | 秒間1000リクエスト | ONNX Runtime | TorchServe/TF Serving | フレームワーク非依存、 軽量・高速 |
| 説明性(SHAP・LIME) | 任意 | shap | lime/eli5 | Tree系モデルなら計算が高速、 規制対応に必須 |
📌 判断のコツ: 「ベースライン構築」→ scikit-learn、 「精度を限界まで詰める」→ LightGBM/XGBoost、 「画像・音声・テキスト」→ PyTorch/Transformers、 「統計的有意性も知りたい」→ statsmodels の4分岐で9割は決まる。 SSDSE-B-2026 のようなコンペ用途では、 まず scikit-learn の LinearRegression でベースライン、 次に RandomForestRegressor、 さらに精度が必要なら LightGBM、 という段階的アプローチが推奨される。
requirements.txt でバージョン固定し、 再現性を確保すべし。scikit-learn / PyTorch / TensorFlow / LightGBM / XGBoost / statsmodels の6つは「データ分析の主役ライブラリ」と呼べる存在である。 ここでは API 設計思想、 計算性能、 学習コスト、 コミュニティ規模、 SSDSE-B-2026 でのユースケースまで含めて多角的に比較する。 ライブラリの相対的位置づけを理解することで、 「なぜこの場面ではこれを選ぶのか」を自分の言葉で説明できるようになる。
| ライブラリ | API思想 | 代表メソッド | 最小コード行数 | 設計の良さ |
|---|---|---|---|---|
| scikit-learn | fit / predict / transform 統一 | model.fit(X,y).predict(X_new) | 3行 | ★★★★★(業界標準を作った) |
| PyTorch | Define-by-Run、 Python的 | loss.backward(); optim.step() | 30行 | ★★★★★(直感的、 デバッグしやすい) |
| TensorFlow/Keras | Define-and-Run(旧)→ Eager(新) | model.compile().fit() | 10行 | ★★★★(本番デプロイに強い) |
| LightGBM | scikit-learn API 互換 | LGBMRegressor().fit(X,y) | 3行 | ★★★★★(速くて使いやすい) |
| XGBoost | 独自API + scikit-learn 互換 | xgb.train(params, dtrain) | 5行 | ★★★★(柔軟だがやや冗長) |
| statsmodels | R的、 数式記述(formula) | smf.ols('y~x', data=df).fit() | 3行 | ★★★★(統計家向け、 検定が豊富) |
| ライブラリ・モデル | 学習時間 | 推論時間(1件) | メモリ | 代表用途 |
|---|---|---|---|---|
| scikit-learn LinearRegression | 0.002秒 | 0.00001秒 | 数KB | ベースライン・解釈 |
| scikit-learn RandomForest | 0.15秒 | 0.001秒 | 数MB | 非線形・特徴量重要度 |
| LightGBM Regressor | 0.08秒 | 0.0001秒 | 数MB | 高精度・コンペ |
| XGBoost Regressor | 0.12秒 | 0.0002秒 | 数MB | 高精度・歴史的標準 |
| PyTorch MLP (3層) | 3秒 | 0.005秒 | 数十MB | 非線形・転移学習 |
| statsmodels OLS | 0.003秒 | 0.0001秒 | 数KB | p値・信頼区間・残差診断 |
💡 SSDSE-B-2026 規模では、 PyTorch でも 3秒で学習が終わるが、 線形回帰なら 0.002秒(1500倍速い)。 「データが小さければ古典的な手法ほど効率的」という法則は揺るがない。 ライブラリの強さは「規模に応じた使い分け」で初めて発揮される。
| 指標 | scikit-learn | PyTorch | TensorFlow | LightGBM | statsmodels |
|---|---|---|---|---|---|
| GitHub Star(万) | 5.9 | 8.4 | 18.5 | 1.7 | 1.0 |
| 習得期間(基本操作) | 2週間 | 2ヶ月 | 2ヶ月 | 1週間 | 3週間 |
| 日本語チュートリアル | ★★★★★ | ★★★★ | ★★★ | ★★★ | ★★ |
| エラーメッセージの親切さ | ★★★★★ | ★★★★ | ★★★ | ★★★ | ★★★★ |
| 求人需要(日本) | ★★★★★ | ★★★★ | ★★★★ | ★★★ | ★★ |
💡 「人気=学ぶべき」ではない。 SSDSE-B-2026 のような表形式データなら scikit-learn と LightGBM の2本立てで圧倒的に十分。 PyTorch を学ぶのは画像・テキスト・音声に取り組む段階で良い。 学習順序は「scikit-learn → statsmodels → LightGBM → PyTorch」が最も挫折しにくい。
機械学習ライブラリの歴史を理解することは、 現在の API 設計や思想を腹落ちさせる近道である。 1990年代の MATLAB・R から始まり、 Python 主流時代(2007〜)、 ディープラーニング革命(2012〜)、 そして大規模言語モデル時代(2022〜)まで、 ライブラリは時代の要請に応じて進化してきた。 SSDSE-B-2026 のような統計教育用途で使うライブラリ群(scikit-learn / pandas / matplotlib)も、 すべてこの歴史の中で生まれた。
| 年 | 出来事 | 背景・意義 |
|---|---|---|
| 1991 | Python 0.9.0 公開 | 機械学習を支える言語の誕生。 当時はまだ統計用途では使われなかった |
| 1993 | R言語 公開 | 統計家向け言語の事実上の標準に。 statsmodels の formula 設計の源流 |
| 2006 | NumPy 1.0 リリース | Python科学計算の基盤。 すべての ML ライブラリが NumPy 配列を入出力に使うようになる |
| 2007 | scikit-learn プロジェクト開始 | Google Summer of Code 学生プロジェクトとして誕生。 fit/predict API がデファクト化 |
| 2008 | pandas 公開 | Wes McKinney が金融分析用に開発。 表形式データ操作の標準ライブラリへ |
| 2010 | scikit-learn 0.1 公開 | 本格リリース。 「機械学習を Python で」が現実になった |
| 2012 | AlexNet が ImageNet で圧勝 | ディープラーニング革命の起点。 GPU 計算ライブラリへの需要が爆発 |
| 2014 | XGBoost 公開 | Kaggle 上位を席巻。 表形式データの新王者 |
| 2015 | TensorFlow 公開(Google) | Define-and-Run、 本番デプロイ重視。 産業界に広く採用 |
| 2016 | PyTorch 公開(Meta) | Define-by-Run、 デバッグ容易。 研究コミュニティが急速に移行 |
| 2017 | LightGBM 公開(Microsoft) | XGBoost より速くて精度同等。 大規模表形式の事実上の標準に |
| 2018 | BERT 発表 / Transformers ライブラリ登場 | 事前学習モデル時代へ。 HuggingFace が標準ハブに |
| 2019 | TensorFlow 2.0 / Keras 統合 | Eager Execution 標準化、 PyTorch に追随。 高レベル API が主流に |
| 2020 | JAX 公開(Google) | 自動微分・並列化を関数型に。 研究最前線で採用増加 |
| 2022 | ChatGPT 公開 | LLM時代の幕開け。 LangChain・LlamaIndex 等の応用ライブラリが急増 |
| 2024 | PyTorch 2.x / torch.compile | コンパイル時最適化で 30%高速化。 研究・本番の差が縮小 |
| 2025 | scikit-learn 1.5 / 2.0計画 | PyTorch との接続 API 整備。 表形式と深層の橋渡しが進む |
15年以上の歴史を見ると、 ライブラリは「主役交代」が頻繁に起こる(Theano→TensorFlow→PyTorch、 XGBoost→LightGBM 等)。 一方で scikit-learn の fit/predict API・pandas の DataFrame・NumPy の配列演算はほぼ変わらず使われ続けている。 つまり「基盤ライブラリの根幹 API」「数学的概念(線形代数・確率統計)」「データ前処理の習熟」は廃れにくい。 一方で「特定フレームワークの細かい記法」は5年で陳腐化することがある。
💡 SSDSE-B-2026 のような統計教育用データに取り組むのは、 「廃れにくいスキル」を鍛える絶好の機会である。 線形回帰・決定木・PCA といった古典的手法は今後30年以上使われ続けるはずで、 これらを実データで腹落ちさせれば一生の財産になる。
scikit-learn | PyTorch | TensorFlow | pandas | NumPy | LightGBM | XGBoost | statsmodels | Transformers | JAX | matplotlib | seaborn | SHAP | ONNX | HuggingFace
機械学習ライブラリを中心に、 数値計算 (NumPy / SciPy)・古典 ML (scikit-learn / XGBoost)・DL (PyTorch / TF / JAX)・NLP/LLM (Transformers)・運用 (MLflow / Kubeflow) の 5 層を整理した概念マップ。
scikit-learn は SSDSE-B-2026 のような表データに最適、 PyTorch は画像/系列/言語モデルに、 XGBoost / LightGBM は表データで高精度を狙うときに選ぶ。
機械学習ライブラリは単独で動作せず、 上流の Python 環境 (venv / conda / poetry)、 並列のフレームワーク (scikit-learn / PyTorch / TensorFlow / XGBoost)、 下流の MLOps (MLflow / Kubeflow / BentoML) と組み合わせて開発・運用パイプラインを形成する。
SSDSE-B-2026 を題材にすると、 上流で pandas で CSV 読込、 中段で scikit-learn で線形回帰 → LightGBM → SHAP、 下流で MLflow に実験記録、 という pipeline が現実的な学習フロー。 GPU は不要、 CPU 数秒で全工程完了する。
ML ライブラリ選択は、 (1) タスク種別 (古典 ML / 深層学習 / 勾配ブースティング)、 (2) チーム経験、 (3) 推論環境 (サーバ / モバイル / エッジ)、 で判断する。 scikit-learn を共通土台に、 重い学習は専門ライブラリへ切替えるのが定石。
SSDSE-B-2026 のような表形式 47 行データでは scikit-learn + LightGBM が第一選択。 PyTorch / TensorFlow は深層学習が必要な画像・テキストタスクまで使わない。 ライブラリ選定で迷ったら「scikit-learn API 互換か?」「ドキュメントが豊富か?」「コミュニティ規模 (GitHub stars)」を基準にすると失敗しにくい。
「どのライブラリを使うか」は流行ではなく タスクの性質から逆算して決める道具選びである。 fit/predict の使い方(scikit-learn)や深層学習フレームワークの中身(PyTorch / TensorFlow)ではなく、 ここでは 「この状況ならどれを選ぶべきか」という意思決定そのものを、 3 つの触れる道具で確かめる。 ロジックはすべて明示ルール(下記の理由表示)で、 ブラックボックスではない。
4 つの問いに答えて「診断する」を押すと、 明示ルールに従って推薦ライブラリと選定理由が出る。
領域ボタンを押すと、 その領域を ◎/○ でカバーするライブラリの列が光る。 「古典 ML と勾配ブースティングは別物」「深層学習フレームワークは表データが不得手」といった守備範囲の違いが一目で分かる。 記号は ◎=主戦場 / ○=対応 / △=限定的 / ×=非対応。
| ライブラリ | 古典 ML | 勾配ブースティング | 深層学習 | 事前学習モデル |
|---|---|---|---|---|
| scikit-learn | ◎ | ○ | △(MLPのみ) | × |
| XGBoost / LightGBM | ○ | ◎ | × | × |
| PyTorch | △ | × | ◎ | ◎(Hub経由) |
| TensorFlow / Keras | △ | × | ◎ | ○ |
| Hugging Face | × | × | ○ | ◎ |
| JAX | △ | × | ◎ | △ |
💡 古典 ML と勾配ブースティングを両方 ◎/○ で持つのは scikit-learn / XGBoost / LightGBM。 深層学習の ◎ は PyTorch / TensorFlow / JAX に偏り、 事前学習モデルは Hugging Face が中心。 「どれか 1 つで全部」は無く、 領域ごとに道具を持ち替えるのが実務。
スライダーを動かすと、 「書く量が少なく自動化された高レベル」から「自由度は高いがコード量・保守コストが増える低レベル」まで、 代表ライブラリと得失が切り替わる。 同じ深層学習でも Keras Sequential と生 PyTorch は別の抽象度にいる。
💡 原則:まず一番高い抽象度で試し、 足りない自由度が必要になった分だけ下りる。 最初から低レベルで書くのは、 過剰な深層学習と同じく「道具の選び間違い」になりやすい。 特徴量エンジニアリングや MLOps と組み合わせて全体最適を考える。
本ページのここまでの比較は「どのライブラリを選ぶか」が主題だった。 本節は逆向きに、 選んだ後の fit / predict の裏で何が起きているかを掘り下げる。 検証には SSDSE-B-2026 の 2023 年断面(df[df['SSDSE-B-2026']==2023]、 47 都道府県)を使う。 ページ上部のコード例は .last() で最古年(2012 年)断面を取るため、 本節の数値とはわずかに異なる点に注意(例:線形回帰の CV R² は 2012 年断面で 0.987、 2023 年断面で 0.9846)。 以下の数値はすべて実行して得た実測値である(架空のデモは含まない)。
fit / predict は AT 車のシフトレバーscikit-learn 互換の統一 API では、 LinearRegression() を Ridge() や RandomForestRegressor() に 1 語差し替えるだけでコード全体がそのまま動く。 これは AT 車のシフトレバーに似ていて、 運転(分析コード)は楽になるが、 変速機の中身(各アルゴリズム固有の前提)が見えなくなる。 具体的に隠れるのは主に 2 つ、 ①「入力のスケール(単位)に敏感かどうか」 ②「内部で乱数を使うかどうか」である。 どちらもエラーを出さずに黙って結果だけを変えるため、 「動いた=正しい」と思い込むのがいちばん危ない。
実測①:Ridge(alpha=…) の罰則は「単位」を知らない。 2023 年断面で X=A4101(出生数)・A4200(死亡数)、 y=A1101(総人口)とし、 5 分割交差検証の R² を測った:
| モデル(同じデータ・同じ CV) | 前処理 | CV R²(実測) |
|---|---|---|
| LinearRegression | なし | 0.9846 |
| Ridge(alpha=1) | なし(生データ) | 0.9846 |
| Ridge(alpha=1000) | なし(生データ) | 0.9846 |
| Ridge(alpha=1000000) | なし(生データ) | 0.9846 |
| Ridge(alpha=1) | StandardScaler で標準化 | 0.9873 |
| Ridge(alpha=1000) | StandardScaler で標準化 | −1.4520 |
生データでは alpha を 100 万倍にしても R² が小数第 4 位まで 1 つも動かない。 理由は単位にある。 出生数(2023 年実測で鳥取県 3,263 人〜東京都 86,348 人)に対する回帰係数は約 104.7 と 34.8 と小さく、 罰則項 αΣβ² が総人口(47 県平均 約 265 万人)スケールの残差二乗和に比べて無視できるほど小さいため、 正則化が事実上「無効な飾り」になっている。 一方、 標準化後は alpha=1 が適度に効いて 0.9873 へ改善するが、 alpha=1000 では係数が潰されて CV R² が −1.452(=平均値で予測するより悪い)まで崩壊する。 つまり Ridge(alpha=1000) というまったく同じ 1 行が、 前処理次第で「無害な飾り」にも「モデル破壊」にもなる。 ライブラリはこの違いを警告してくれない。
実測②:乱数シードによる結果のブレ幅を数値で知っておく。 RandomForestRegressor(n_estimators=200) の random_state を 0〜9 の 10 通りに変えて同じ 5 分割 CV を行うと、 CV R² は 0.9403〜0.9450(ブレ幅 0.0047)だった。 乱数を使わない線形回帰の 0.9846 は何度実行しても不変である。 本ページの落とし穴集は「シードを固定せよ」と教えるが、 本節の追加の教訓は「固定した上で、 ブレ幅そのものを一度測っておけ」である。 コンペで小数第 3 位の精度差を競うとき、 ブレ幅 0.005 を知らなければ「その差が実力かノイズか」を判別できない。 レポートには使用シード(できればシードを変えた場合の範囲)まで書くのが誠実な報告である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 実測①②の再現(本節の数値はすべてこのコードの実行結果を転記) import pandas as pd from sklearn.linear_model import Ridge from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023] # 2023 年断面・47 都道府県 X, y = d[['A4101', 'A4200']], d['A1101'] # 出生数・死亡数 → 総人口 print(cross_val_score(Ridge(alpha=1000), X, y, cv=5, scoring='r2').mean()) # 0.9846 print(cross_val_score(make_pipeline(StandardScaler(), Ridge(alpha=1000)), X, y, cv=5, scoring='r2').mean()) # -1.4520 for seed in range(10): # RF は 0.9403〜0.9450 の範囲でブレる rf = RandomForestRegressor(n_estimators=200, random_state=seed) print(seed, cross_val_score(rf, X, y, cv=5, scoring='r2').mean()) |
なぜ LightGBM の LGBMRegressor や XGBoost の XGBRegressor は、 別開発のライブラリなのに scikit-learn の cross_val_score や GridSearchCV にそのまま渡せるのか。 答えはダックタイピングで、 「fit / predict / get_params / set_params を持つオブジェクトなら何でも推定器として扱う」という規約に各ライブラリが自主的に従っているからである。 これを逆手に取ると、 BaseEstimator と RegressorMixin を継承した自作クラスを書くだけで、 自分のオリジナル手法にも交差検証・Pipeline・グリッドサーチが「タダで」使えるようになる(互換性は sklearn.utils.estimator_checks.check_estimator で機械的に検査できる)。 本ページで既出の ONNX が「学習済みモデルの持ち運び」の標準だとすれば、 この規約は「分析コードの持ち運び」の標準であり、 2 つは別軸の相互運用性である。 ライブラリ設計を深く学ぶ最短路は、 この規約に沿って推定器を 1 つ自作してみることだ。