🍰 まずはやさしく
データからルールを見つける技術です。
未来のことを予測するために使います。
スマホの予測変換などが身近な例です。
この章では機械学習の結論を学びます。
機械学習(Machine Learning):データからパターンを学習し、 未知のデータに対して予測・推論する技術全般
🍰 まずはやさしく
機械学習についての解説ページです。
基礎となる重要な考え方を学びます。
都道府県のデータを使って練習します。
おすすめの読む順番を案内します。
このページは「機械学習(Machine Learning)」の用語解説です。 機械学習の基礎カテゴリにおける重要概念で、 機械学習の基礎 グループ教材の中で繰り返し登場します。 数式・実コード・落とし穴を 1 ページに集約し、 SSDSE-B-2026 都道府県データ(47 件 × 112 列)を題材に 手を動かしながら理解できるよう構成しています。
別称:ML。 まず 💡 30秒結論 で全体像を、 次に 🎨 直感 → 📐 数式 → 🧮 実値 → 🐍 Python の順で読むのがおすすめ。
🍰 まずはやさしく
データから自動でルールを作る方法です。
人間がルールを全部書かなくて済みます。
人口から出生数を当てるような仕組みです。
学習の3つの種類について解説します。
機械学習は「人間がルールを 1 つずつ書く」のではなく、 「データから自動でルール(モデル)を獲得する」アプローチです。 たとえば「都道府県の人口から出生数を予測する」課題で、 旧来の ルールベース なら「人口 100 万人未満→出生数は約 X 千人、 100-300 万人→約 Y 千人…」と人が境界を決めますが、 機械学習は SSDSE-B-2026 の 47 都道府県 × N 変数の表を読ませると、 線形回帰なら 1 本の直線、 決定木なら if-then ツリー、 ニューラルネットなら多層の重み を自動で当てはめます。 ルールベース AI → 機械学習 → 深層学習 と進むほど、 人間の手作業(特徴量設計)が減り、 代わりに データ量・計算資源・正則化 が品質を支配します。
3 大パラダイム= 教師あり(正解ラベル付き、 例: 47 都道府県の出生率を予測)・教師なし(ラベルなし、 例: 都道府県を 5 クラスタに分ける)・強化学習(報酬を最大化、 例: 在庫発注タイミング)。 SSDSE-B のような表データなら scikit-learn(pip install scikit-learn、 fit/predict の統一 API)、 画像・音声・自然言語なら PyTorch / TensorFlow が事実上の標準です。 「データから関数 f(x) を学ぶ」という抽象を、 上記の道具で 具体的なコード 3-5 行 に落とすのが現代の機械学習です。
比喩: ルールベースが「料理本通りに作る」なら、 機械学習は「1000 食分の味見データから自動でレシピを再構築する」シェフです。 サンプルが多いほどレシピは正確になり(バイアス低下)、 一方で偏ったサンプルだけ与えると偏ったレシピしか作れない(選択バイアス)という弱点も持ちます。
🍰 まずはやさしく
計算で間違いを最小にする仕組みです。
より正確な予測を行うために使います。
都道府県の数値を式に当てはめます。
予測に使う数式について詳しく学びます。
機械学習は「真のリスク (期待損失) の最小化」問題ですが、 真の分布 $\mathcal{D}$ は未知のため 経験リスク + 正則化項で近似します。 SSDSE-B-2026 の都道府県データ ($X_{\text{population}}, Y_{\text{births}}$ など $n=47$) に当てはめると、 各記号が具体的に意味を持ちます。
主定義 (期待リスク最小化、 理想形):
別表現 (経験リスク最小化 + 正則化、 実装で実際に解く形):
パラメータ条件: $n \ge 1$ (学習データ数)、 $\lambda \ge 0$ (正則化強度)、 $L(\cdot,\cdot) \ge 0$ (損失非負)、 $\mathcal{F}$ は仮説集合 (線形/木/NN など)。 SSDSE-B-2026 では $n=47$、 $x_i$ = 都道府県 $i$ の人口、 $y_i$ = 出生数 (二乗誤差 $L(y,\hat{y})=(y-\hat{y})^2$ を想定)。
英語名 Machine Learning。 別称:ML。
「$f^* = \arg\min_{f \in \mathcal{F}} \; \mathbb{E}_{(x,y)\sim\mathcal{D}}[L(f(x), y)] + \lambda\,\Omega(f)$」を 1 記号ずつ日本語に置き換えると、 機械学習の本質「仮説の中で最も真実に近い f を探す」が見えてきます。
| 記号 | 読み方 | 意味 | SSDSE-B 例 |
|---|---|---|---|
| $x$ | エックス | 入力(特徴量ベクトル) | 都道府県の人口・面積・世帯数など |
| $y$ | ワイ | 出力(予測したい値・ラベル) | 出生数(連続値) |
| $f$ | エフ | モデル(x を y にうつす関数) | 線形回帰 $\hat{y}=ax+b$、 決定木、 NN |
| $\mathcal{F}$ | エフ・スクリプト | 仮説空間(候補モデル全体の集合) | 「全ての 2 変数線形式」「深さ 5 までの木」 |
| $\mathcal{D}$ | ディー・スクリプト | 真のデータ分布(観測できない理想) | 「全ての都道府県・全年で起きうる組」 |
| $L$ | ロス | 損失関数(誤差の大きさ) | MSE $=(y-\hat{y})^2$、 cross-entropy |
| $\mathbb{E}$ | 期待値(イー) | 分布全体の平均 | 「47 県+未観測県の平均誤差」 |
| $\Omega(f)$ | オメガ | 正則化(モデルの複雑さペナルティ) | $\|w\|_2^2$ (L2)、 $\|w\|_1$ (L1) |
| $\lambda$ | ラムダ | 正則化の強さ(ハイパーパラメータ) | $\lambda=0$ で過学習、 大きいと過小学習 |
| $\arg\min$ | アーグミン | 「最小にする f を返せ」 | 候補の中で誤差最小のモデルを採用 |
1 行ずつ読み下し:
経験リスク最小化(ERM): 真の $\mathcal{D}$ は観測不能なので、 訓練データ $\{(x_i,y_i)\}_{i=1}^n$ の平均 $\frac{1}{n}\sum L(f(x_i),y_i)$ で代用します。 これが scikit-learn の model.fit(X, y) の正体です。 $n \to \infty$ で平均は真の期待値に収束(大数の法則)、 これが「データを増やすほど良くなる」根拠です。
SSDSE-B 都道府県データに対し、 scikit-learn で 3 つのモデル(線形回帰・決定木・ランダムフォレスト) を訓練し、 性能を比べます。
データ出典:SSDSE-B-2026(独立行政法人統計センター)。 47 都道府県 × 複数年(最新 2023)の社会統計データ。
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 | import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) X = df[['総人口', '65歳以上人口']].values y = df['15歳未満人口'].values X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42) models = { 'LinearRegression': LinearRegression(), 'DecisionTree': DecisionTreeRegressor(max_depth=4, random_state=0), 'RandomForest': RandomForestRegressor(n_estimators=200, random_state=0), } for name, m in models.items(): m.fit(X_train, y_train) score = m.score(X_test, y_test) # R^2 cv = cross_val_score(m, X, y, cv=5).mean() print(f'{name:<18} test_R2={score:.3f} CV_R2={cv:.3f}') |
実行結果の要約(上のコードの実測値):
| 項目 | 値 |
|---|---|
| LinearRegression test R² | 0.973 |
| DecisionTree test R² | 0.878 |
| RandomForest test R² | 0.860 |
| LinearRegression 5-CV R² | 0.956 |
| DecisionTree 5-CV R² | 0.915 |
| RandomForest 5-CV R² | 0.915 |
scikit-learn / pandas を使った最小実装パターン。 上の SSDSE-B 計算と同じスタイルですが、 ここでは「読み込み→前処理→学習→評価」のテンプレを 4 つのスニペットに分けます。
1 2 3 4 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) print(df.shape, df.columns.tolist()[:8]) |
1 2 3 | X = df[['総人口','65歳以上人口']].values y = df['15歳未満人口'].values print('X shape =', X.shape, ', y shape =', y.shape) |
1 2 3 4 5 6 | from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) model = RandomForestRegressor(n_estimators=300, random_state=0).fit(X_tr, y_tr) print('R^2 (test) =', model.score(X_te, y_te)) |
1 2 3 4 5 6 | import matplotlib.pyplot as plt pred = model.predict(X_te) plt.scatter(y_te, pred) plt.plot([y_te.min(), y_te.max()], [y_te.min(), y_te.max()], 'r--') plt.xlabel('実測'); plt.ylabel('予測'); plt.title('「機械学習」関連モデルの予測精度') plt.tight_layout(); plt.savefig('out.png', dpi=150) |
※ 「機械学習」固有の本格コードは上の 🧮 SSDSE-B 実値計算 節を参照。
機械学習を 30 秒で言えば「データから自動的にパターンを学習する手法の総称。 ルールを人間が書くのではなく、 データから「学ばせる」。」ですが、 実務で迷わないためにはもう一段深い理解が必要です。 ここでは「何が分かれば自信を持って使えるか」を、 3 つの観点で整理します。
| 観点 | 問い | 答え方の指針 |
|---|---|---|
| 定義の根拠 | なぜこの式・この定義になったのか? | 「何を最小化/最大化したいか」から逆算する |
| 境界条件 | いつ使える/使えないのか? | 「データの形」「分布の前提」を確認する |
| 他との関係 | 隣接概念とは何が違うのか? | 「共通点」と「分かれ目」を 1 つずつ挙げる |
💡 暗黙の前提:機械学習 が「うまく機能する」には、 データに対する暗黙の仮定(独立同分布、 適切な前処理、 十分なサンプル数)があります。 これを言語化できるかどうかで、 失敗時のデバッグ力が大きく変わります。
数式 $\hat\theta = \arg\min_\theta L(\theta; D) + \lambda R(\theta)$ を「ぼんやり眺める」から「自分の言葉で説明できる」レベルに引き上げます。
左辺は何か(スカラー?関数?)、 右辺は和・積・最大化のどれが主役か。 ここで「式の文型」が見えます。
記号それぞれに「データ/パラメータ/確率/集合」のラベルを貼り、 「これは固定」「これは動かす」を区別します。
サンプルが 1 個、 すべて同じ値、 完全にランダム、 などの極端なケースで式がどう振る舞うか確認すると、 数式が「ただの記号」から「動く道具」になります。
SSDSE 公的データを題材に、 機械学習 を実際に動かす最小コードです。 paths は引数に直書きで、 初心者がコピペで動かせる形を優先しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd import numpy as np # データ読み込み(SSDSE-B 都道府県・47 県 × 約 112 列) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) print('shape:', df.shape) print('列の先頭:', df.columns.tolist()[:6]) # 必要な列だけ取り出して整形 features = ['総人口', '15歳未満人口', '65歳以上人口'] df_use = df[features].copy() print(df_use.describe()) |
次に、 機械学習 に固有の処理を加えます。 ここがページごとの「肝」になる部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, r2_score X = df[['総人口', '65歳以上人口']].fillna(0).values y = df['合計特殊出生率'].fillna(df['合計特殊出生率'].median()).values X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) model = RandomForestRegressor(n_estimators=200, max_depth=4, random_state=0).fit(X_tr, y_tr) pred_tr = model.predict(X_tr) pred_te = model.predict(X_te) print(f'train R^2 = {r2_score(y_tr, pred_tr):.3f}') print(f'test R^2 = {r2_score(y_te, pred_te):.3f}') print(f'test RMSE = {np.sqrt(mean_squared_error(y_te, pred_te)):.4f}') |
さらに可視化を加えると、 学んだ内容が「眼で」確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 | import matplotlib.pyplot as plt plt.figure(figsize=(7,5)) plt.scatter(y_te, pred_te, alpha=0.7, edgecolor='k') lims = [min(y_te.min(), pred_te.min()), max(y_te.max(), pred_te.max())] plt.plot(lims, lims, 'r--', linewidth=2, label='完全予測ライン') plt.xlabel('実測 出生率') plt.ylabel('予測 出生率') plt.title('機械学習 を使ったモデルの予測精度(SSDSE-B-2026)') plt.legend() plt.tight_layout() plt.savefig('out_machine-learning.png', dpi=150) |
最後に、 同じ問題を別の角度から見る「クロスバリデーション版」も用意します。
1 2 3 4 5 6 7 8 | from sklearn.model_selection import cross_val_score scores = cross_val_score( RandomForestRegressor(n_estimators=200, max_depth=4, random_state=0), X, y, cv=5, scoring='r2' ) print(f'5-fold CV R^2 = {scores.mean():.3f} (±{scores.std():.3f})') print('各 fold:', np.round(scores, 3)) |
「機械学習」と混同しやすい概念を 1 つの表に並べることで、 違いが鮮明になります。 「共通点」と「分かれ目」を意識して読みましょう。
| 用語 | 何に焦点 | 機械学習との違い | 使う場面 |
|---|---|---|---|
| 機械学習(本ページ) | 直感の核:データから自動的にパターンを学習する手法の総称。 ルールを人… | — | 基本系 |
| 類似概念 A | 同じ目的だが定義が異なる | 数式の形・計算量が違う | 特殊ケース・改良 |
| 類似概念 B | 対象データの種類が違う | 前処理・後処理の手順が異なる | 別ドメイン |
| 上位概念 | 機械学習を一般化した枠組み (人工知能・統計学習) | 機械学習 は特殊化された場合 | 理論を整理するとき |
| 下位概念 | 機械学習 の特定の応用 | 機械学習 を道具として使う | 具体タスク |
⚠️ 注意:「似ているからどれでも同じ」と考えると、 微妙な前提の違いから誤った結論を導きがちです。 まずは 1 つの定義に絞って深く理解し、 そのうえで他の概念に拡張するのが安全です。
fit は訓練データだけに対して行い、 テストには transform のみを適用。 これを混同するとデータリーケージになる。機械学習 は、 統計学と計算機科学の流れの中から生まれました。 下の年表はこの分野全体の流れで、 機械学習 固有の年表ではありません。 この用語がどの時代の産物かを掴むために置いています。
| 時期 | 出来事 | この時代に起きたこと |
|---|---|---|
| 前史 | 統計学・情報理論の基盤整備 | 数式的な土台 |
| 古典期 | この分野の黎明(1960〜80 年代) | 「機械学習」の原型が登場 |
| 展開期 | scikit-learn / TensorFlow など実装の普及(2010〜) | 誰でも 1 行で使える時代に |
| 現代 | 大規模モデル時代(2020〜) | 「機械学習」の意味が再解釈される |
現代の文脈では、 古典的な定義のままでは説明しきれない使い方も出てきています。 教科書の定義を出発点としつつ、 実務での「変奏」も知っておくとよいでしょう。
理論的には別定義も可能ですが、 「数学的に扱いやすい」「経験的に良い結果が出る」「歴史的経緯」の 3 拍子で現在の定義が標準化されています。 学術論文では別定義を「変種」として議論することもよくあります。
教育用途・探索的分析では十分。 ただし「統計的有意」を主張するには n=47 は不足することが多いので、 解釈は慎重に。 ブートストラップで信頼区間を出すと頑健性が確かめられます。
PyTorch / TensorFlow / XGBoost / LightGBM など多数。 ただし基本的な動作確認は scikit-learn が一番速いので、 まず sklearn で動かしてから他に移植するのがおすすめ。
計算量・メモリの観点でアルゴリズムを切り替える必要があります。 mini-batch 版、 サブサンプリング、 近似アルゴリズムの利用を検討します。 47 県スケールで本質を理解した後の応用課題です。
古典的な定義は原典(教科書や著名論文)、 実装は使用ライブラリのバージョン情報を併記するのが標準。 「Murphy 2012」「Hastie et al. 2009」あたりが定番引用です。
下の「📚 関連グループ教材」セクションのリストが、 推奨される学習順序の一つです。 上位概念から入って詳細に降りる「トップダウン」と、 1 つの具体例から始めて他に広げる「ボトムアップ」、 どちらも一長一短。 自分の学び方に合わせて。
「機械学習」を理解した次に何を学ぶか、 5 ステップで提案します。 順序は厳密ではなく、 興味のあるところから飛び入りで OK。
| 項目 | 内容 |
|---|---|
| 用語 | 機械学習(Machine Learning) |
| 1 行定義 | データから自動的にパターンを学習する手法の総称。 ルールを人間が書くのではなく、 データから「学ばせる」。 |
| 数式 | $\hat\theta = \arg\min_\theta L(\theta; D) + \lambda R(\theta)$ |
| SSDSE 適用例 | 47 都道府県データで、 線形回帰/決定木/ランダムフォレストを比較 |
| 主要ライブラリ | scikit-learn, pandas, numpy |
| 典型的な落とし穴 | スケーリング忘れ・データリーケージ・前提分布 |
| 次に学ぶ | 機械学習の基礎 グループ教材 |
※ このチートシートは「30 秒で復習」用。 詳しくは各セクションへ。
統計データ解析コンペティション過去論文で「機械学習」がどのように登場し、 どんな問題を解決したかを見てみます。 論文ページからリンクして本ページに来た方も、 ぜひもう一度自分の関心ある論文を見直してみてください。
| 論文の方向性 | 「機械学習」の役割 | 学べる点 |
|---|---|---|
| 人口動態の予測 | 将来予測モデルの構成要素として | 時系列との組み合わせ方 |
| 地域格差の分析 | 都道府県をクラスタリング・分類する基盤 | 教師なし/教師ありの切り替え |
| 経済指標の関係性 | 特徴量間の関係を可視化・解釈 | 解釈可能性とのトレードオフ |
| 健康・福祉データ | 少数派ラベルに対する頑健性 | 不均衡データの扱い方 |
| テキスト解析 | 前処理・後処理の枢要 | NLP との接続 |
💡 論文を読むときのコツ:「この論文では『機械学習』を何のために使っているか?」「もし使わなかったら何が問題だったか?」を意識すると、 技術選定の判断軸が身に付きます。
同じ「機械学習」を使うにも、 データの形・規模・目的によって書き方が変わります。 4 つの典型パターンを示します。
1 2 3 4 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) print(df.shape, df.head(3)) |
1 2 3 4 5 6 7 8 9 10 | from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import Ridge pipe = Pipeline([ ('scaler', StandardScaler()), ('model', Ridge(alpha=1.0)), ]) pipe.fit(X_tr, y_tr) print('R^2 =', pipe.score(X_te, y_te)) |
1 2 3 4 5 6 | from sklearn.model_selection import GridSearchCV params = {'model__alpha': [0.01, 0.1, 1.0, 10.0, 100.0]} gs = GridSearchCV(pipe, params, cv=5, scoring='r2', n_jobs=-1) gs.fit(X, y) print('best:', gs.best_params_, 'score:', gs.best_score_) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import matplotlib.pyplot as plt import json pred = gs.predict(X_te) plt.figure(figsize=(7,5)) plt.scatter(y_te, pred, alpha=0.7, edgecolor='k') plt.plot([y_te.min(), y_te.max()], [y_te.min(), y_te.max()], 'r--') plt.xlabel('実測'); plt.ylabel('予測'); plt.title('機械学習 結果') plt.tight_layout(); plt.savefig('result_machine-learning.png', dpi=150) with open('result_machine-learning.json', 'w', encoding='utf-8') as f: json.dump({'best_params': gs.best_params_, 'cv_score': gs.best_score_, 'test_score': gs.score(X_te, y_te)}, f, ensure_ascii=False, indent=2) |
「機械学習」は AI / 統計学から派生し、 教師あり・教師なし・強化学習に枝分かれする巨大な体系。 5 方向に整理することで、 「自分が今やっているのは深層学習なのか古典的機械学習なのか」「線形回帰は機械学習に入るのか」といった位置づけの混乱を整理できる。
| 方向 | 隣接概念 | 関係性 |
|---|---|---|
| 北 (上位) | 機械学習・統計学 | 機械学習を包含する大きな枠組み (AI・統計学) |
| 南 (下位) | 画像認識・推薦・需要予測 | 機械学習を使う具体例 (Kaggle, scikit-learn 適用案件) |
| 東 (発展) | 深層学習・強化学習・自己教師あり | 古典的機械学習の弱点 (特徴量設計の人手依存) を補う発展形 |
| 西 (前提) | 線形代数・確率統計・最適化 | 機械学習の理論を理解するための土台 (行列演算・MLE・勾配降下) |
| 中央 | 機械学習 | 本ページの主役 (データから自動でパターンを学ぶ手法群) |
機械学習の用語数は膨大なので、 5 方向の見取図を持っていないと「いま勉強している手法は全体の中でどの位置か」が見えなくなる。 たとえば Random Forest は南(具体)×アンサンブル系、 Self-Supervised Learning は東(発展)×半教師あり系、 と置けると論文を読むスピードが体感 2 倍以上になる。
「機械学習」を本当に理解できたか、 自分でテストできるクイズです。 答えは展開で確認。
模範回答:上の「💡 30秒結論」を参照。 ポイントは「何のために使うか」を最初に言うこと。 定義や数式から入ると相手が引きます。
模範回答:$y$ (正解) と $x$ (入力) は学習データから与えられて固定。 $\theta$ (パラメータ) を勾配降下で更新する。 教師あり学習では「データを使って $\theta$ を $L$ が小さくなる方向に動かす」が本質。
模範回答:n=47 と非常に小さいため、 深層学習より 線形回帰・Ridge・GBM が安定。 訓練/検証/テスト分割すると各 15 件程度になり、 Leave-One-Out CV や 5-fold CV を採用。 特徴量も 100+ あるので Ridge/Lasso 等の正則化が必須。
模範回答:上の「🌐 似た概念との比較」表を参照。 1 文で言える違いを持っておくと、 「なぜこっちを選んだか」を説明できます。
模範回答:①データ漏洩 (test set の情報を train で使う)、 ②目的変数のスケール・分布を確認せず損失設計、 ③訓練データの偏り (selection bias) — の 3 つが頻出。 とくに SSDSE のような n=47 では fold 切り方で R² が ±0.2 ぶれることもあり、 評価の不確実性を必ず示すこと。
「機械学習」は単独で学ぶよりも、 関連する複数の用語をセットで学ぶ方が効率的です。 関連グループ教材へのリンクを整理します。
| グループ教材 | 含まれる主な用語 | 「機械学習」の位置 |
|---|---|---|
| 機械学習の基礎 | 教師あり/なし、 損失、 汎化、 過学習 | 中核 |
| モデル選択 | CV、 ハイパーパラメータ、 交差検証 | 関連 |
| 評価指標 | R²、 RMSE、 ROC-AUC、 confusion matrix | 関連 |
| 決定木 | 情報利得、 エントロピー、 ジニ | 特定の応用 |
| 分類 | 2 値・多値・不均衡 | タスク |
| クラスタリング | K-means、 階層型、 DBSCAN | 教師なし側 |
💡 機械学習の独学ロードマップ:① 機械学習の基礎(教師あり / なし / 過学習 / 汎化)→ ② 線形回帰 + ロジスティック回帰(最も解釈しやすい)→ ③ 決定木 + Random Forest(非線形を一気に体験)→ ④ CV + 評価指標(実務に必須)→ ⑤ 深層学習。 各段階で SSDSE-B-2026 を題材にコードを書いて初めて「腹落ち」する。
機械学習を使うかルールベースで済ますかは、 (1) パターンが明文化できるか、 (2) 教師データが 1000 件以上あるか、 (3) 誤分類のコストが許容範囲か、 で判定する。 明文化可能ならルール、 データ不足なら統計、 それ以外で初めて ML を選ぶ。 直前章「🔗 隣接手法への橋渡し」で示した「データ収集 → 特徴量 → 学習 → 評価 → 運用」パイプラインのうち、 本フローは 学習 段のアルゴリズム選択を担う。
[START] そもそも ML が必要か? ↓ Q1: ルールで明文化できる業務か? ├ Yes (税率計算・有効性チェック) → ルールエンジン / SQL で十分 └ No (画像認識・需要予測・自然言語) → Q2 へ ↓ Q2: 教師ラベル (Y) は得られるか? ├ Yes (過去実績・人手アノテーション可) → Q3 (教師あり) へ ├ 一部のみ (ラベル少 + 未ラベル多) → 半教師あり / 自己学習 └ No (グルーピングしたい・異常を出したい)→ 教師なし学習 → Q5 へ ↓ Q3: 目的変数 Y は連続か離散か? ├ 連続値 (売上・温度・GDP) → 回帰 → Q4 へ ├ カテゴリ (Yes/No・3 クラス以上) → 分類 → Q4 へ └ 時間順序つき → 時系列予測 (ARIMA / Prophet / LSTM) ↓ Q4: 解釈性と精度どちらを優先?データ量は? ├ 解釈優先 + 小データ (~数百行) → 線形 / ロジスティック回帰 ├ 精度優先 + 中規模 (数千〜数十万行) → 勾配ブースティング (XGBoost / LightGBM) ├ 精度最優先 + 大規模 + 画像/テキスト → 深層学習 (CNN / Transformer) └ 解釈 + 非線形 → 決定木 / ランダムフォレスト + SHAP ↓ Q5: 教師なしの目的は? ├ グループ分け (顧客セグメント) → K-means / 階層クラスタリング ├ 次元圧縮 (可視化・特徴抽出) → PCA / UMAP / t-SNE ├ 異常検知 (不正検知・故障予知) → Isolation Forest / One-Class SVM └ 関連ルール (購買バスケット) → アソシエーション分析 [次段: 評価] → MAE / RMSE / R² (回帰) / Accuracy / F1 / AUC (分類) で評価 → 学習-検証曲線で過学習を確認、 交差検証で汎化性能を測る → 章 11「関連用語」の評価指標群へ
実務では「まず線形回帰やロジスティック回帰でベースライン → 必要なら勾配ブースティング → さらに必要なら深層学習」と段階を踏むのが鉄則で、 SSDSE-B-2026 程度の 47 件データなら線形モデルが最強なケースが多い。 Q4 で「データが 47 件しかないのに XGBoost を選ぶ」のは典型的なアンチパターンで、 train/test split で過学習が即座に露呈する。
| 状況 | 第 1 候補 | 第 2 候補 | 避けるべき |
|---|---|---|---|
| 47 県データで出生数を予測 | 線形回帰 | Ridge / Lasso | 深層学習 (過学習) |
| 10 万行の購買履歴で離反予測 | XGBoost / LightGBM | ランダムフォレスト | 単純なロジスティック (精度不足) |
| 画像 100 万枚を分類 | CNN / Vision Transformer | 転移学習 (ResNet / ViT) | 手作り特徴 + SVM |
| ラベル無しユーザを分類 | K-means | 階層クラスタ + シルエット | 教師ありモデルを無理やり適用 |
機械学習は単体の手法ではなくパイプラインとして実装する。 上流のデータ収集 → 特徴量設計 → 学習 → 評価 → デプロイ → 監視まで一気通貫で接続し、 各段で異なる用語(前処理・特徴選択・交差検証・MLOps)と組み合わせて初めて価値を生む。
SSDSE-B-2026 の 47 都道府県データを使う場合、人口・年齢構成・出生などの列を特徴量に、目的変数(例: 出生数)を回帰で予測し、Leave-one-out CV で汎化性能を測り、最後に SHAP で寄与を解釈する、というフローが定番。
ここは 本ページ限定の架空データ(乱数シード固定で毎回同じ・実データではありません)を使い、 機械学習の心臓部である 「データ → 予測 → 損失 → 更新」 のループを 1 ステップずつ手で回します。 教師ありではモデルが誤りを見てパラメータを少しずつ直し、決定境界が動いて損失が下がる様子を体感できます。 教師なし(クラスタリング)に切り替えるとラベル無しでも色分けが自動で現れ、 強化学習では報酬を手がかりに良い行動へ収束します。個別手法の詳細は 教師あり学習 / 教師なし学習 / クラスタリング / 強化学習 / 分類 / 深層学習 を参照。
上の ⚠️ 落とし穴 では 過学習 を単独で扱いましたが、 実務の診断では反対側の未学習(underfitting)との連続体として見るのが要点です。 未学習=モデルが単純すぎて訓練データすら説明できない状態、 過学習=複雑すぎて訓練データの「ノイズまで暗記」した状態。 両者は 1 本の軸(モデル複雑さ)の両端で、 ちょうど良い複雑さが 汎化 性能の頂点になります。 この背後には バイアス-バリアンス のトレードオフがあります。
| 症状 | 訓練誤差 | 検証誤差 | 対処 |
|---|---|---|---|
| 未学習(高バイアス) | 大きい | 大きい(訓練と近い) | 特徴量追加・モデルを複雑に・正則化を弱める |
| ちょうど良い | 小さい | 小さい(訓練に近い) | この状態を維持し、 最後にテストで一度だけ確認 |
| 過学習(高バリアンス) | とても小さい | 大きい(訓練と乖離) | データ追加・正則化を強める・モデルを単純に |
訓練→検証→テストの三段構えは、 この診断を「反則なし」で回すための規律です。 役割を混ぜないことが肝心:訓練=パラメータを合わせる、 検証=モデルの複雑さ・ハイパーパラメータを選ぶ(何度触ってもよい)、 テスト=最終性能を一度だけ測る(選択には絶対に使わない)。 検証をテストに流用すると本番性能を過大評価します。 SSDSE-B-2026 のように $n=47$ と小さい場合は 3 分割だと各群が痩せるため、 検証段を 交差検証(5-fold や Leave-One-Out)に置き換え、 テストだけ手元に残す構成が現実的です。 なお学習曲線(横軸=訓練データ量、 縦軸=誤差)で「両誤差が高止まり→未学習」「訓練だけ低く検証が高い→過学習」を目で判定できます。
💡 「未学習」は本用語集に単独ページがまだ無いため、 当面は本補足と バイアス-バリアンス を参照してください。 “損失が下がった=良い” ではなく、 検証誤差が下がったかで判断するのが分かれ目です。
既存の落とし穴章(6 つ・さらに 5 つ)でも触れていない、 見落とされがちだが実害の大きい罠が再現性(reproducibility)です。 「昨日 R²=0.87 だったのに今日は 0.79」——原因の多くは乱数・バージョン・データの版が固定されていないことにあります。 データリーク と並んで、 論文・コンペで結果が崩れる二大要因です。
train_test_split(random_state=...) だけでなく、 モデル側(RandomForestRegressor(random_state=...))、 numpy のグローバル乱数、 交差検証の KFold(shuffle=True, random_state=...) まで。 1 か所でも抜けると結果が揺れます。 とくに $n=47$ の SSDSE-B では fold の切り方ひとつで R² が大きくぶれます(本ページ クイズ Q5 参照)。pip freeze > requirements.txt(または conda env export)を成果物と一緒に保存し、 論文には版を明記します。SSDSE-B-2026.csv のようにファイル名へ版を含め、 取得日・出典 URL・skiprows や encoding='cp932' といった読み込み条件まで記録します。 前処理(欠損補完・スケーリングの基準値)も「訓練データから算出した値」を保存しておくと本番で再現できます。n_jobs=-1)や浮動小数点の演算順序、 GPU の非決定性で微小に値がずれることがあります。 「小数第 3 位まで完全一致」を求めず、 結論が変わらない範囲かで判断するのが実務的です。⚠️ 再現性の欠如は「不正」ではなく「証明不能」を招きます。 第三者(採点者・査読者・半年後の自分)が同じ数字に到達できて初めて、 モデル選択 の主張は説得力を持ちます。(「再現性」も本用語集に単独ページがまだ無いため、 当面は本補足を参照してください。)
「統計学と機械学習は別物」という誤解は根強いですが、 両者は同じ土台(データからパラメータを推定する)の上に立ち、 主目的の重心が違うだけです。 古典統計は推論(inference)=「なぜ・どの変数がどれだけ効くか、 それは偶然か」を重視し、 機械学習は予測(prediction)=「未知データでいくつになるか」を重視します。 線形回帰 は両方の市民で、 係数の仮説検定を見れば統計、 テスト誤差で選べば機械学習になります。
| 観点 | 古典統計(推論寄り) | 機械学習(予測寄り) |
|---|---|---|
| 問い | この変数は本当に効くか(有意か) | 未知の対象でどれだけ当たるか |
| 評価 | p 値・信頼区間・モデル適合度 | テスト誤差・交差検証スコア |
| 複雑さ制御 | 変数選択・AIC/BIC・仮定の検証 | 正則化・交差検証・早期終了 |
| 典型手法 | t 検定・分散分析・一般化線形モデル | Random Forest・勾配ブースティング |
この地続き感は バイアス-バリアンス 分解を「共通言語」にすると一望できます:
💡 実務の勘所:小標本で「差の有無」を主張したいなら統計的推論、 未知データでの当てやすさが目的なら機械学習。 SSDSE-B-2026($n=47$)では、 まず線形回帰で係数の符号と大きさを解釈し(統計)、 次に交差検証で予測力を測る(機械学習)——両輪で回すと結論が頑健になります。(「アンサンブル学習」「統計的推論」の単独ページは未整備のため、 当面は本補足と各リンク先を参照してください。)