機械学習基礎の核となる中核概念を、 本ページ内のアンカーリンクとともに一覧化。 試験前の総ざらいや、 特定の論点をピンポイントで復習したい時に活用してください。
🍰 まずはやさしく
データからパターンを見つける技術です。
未来のことを予測するために使います。
スマホの予測変換などが身近な例です。
学習の種類や注意点を学びます。
機械学習は「データからパターンを学習する」技術。 古典統計と異なり、 「予測精度」を最優先し、 大量のデータと計算資源を使うのが特徴。 タスクの種類で大きく 3 つに分類されます。
| 学習タイプ | 入力 | 出力 | 代表タスク |
|---|---|---|---|
| 教師あり | $(\boldsymbol{x}_i, y_i)$ ペア | $\hat{y}$ の予測 | 分類・回帰 |
| 教師なし | $\boldsymbol{x}_i$ のみ | 構造の発見 | クラスタリング・次元削減 |
| 強化学習 | 状態 $s$、 行動 $a$ | 方策 $\pi(a|s)$ | ロボット制御、ゲーム |
| 半教師あり | 少数 $(x,y)$ + 多数 $x$ | 同上 | ラベル付けコスト削減 |
| 自己教師あり | $\boldsymbol{x}_i$ のみ | x 内部から擬似ラベル | 事前学習(BERT/GPT等) |
入力 $\boldsymbol{x}$ と正解ラベル $y$ のペアから、 $\boldsymbol{x} \to y$ の写像を学ぶ。 機械学習の最も基本的かつ実用的なパラダイム。
データセット $\mathcal{D} = \{(\boldsymbol{x}_i, y_i)\}_{i=1}^N$ から、 損失 $L(y, f(\boldsymbol{x}))$ を最小化するモデル $f$ を学ぶ:
$$ \hat{f} = \arg\min_f \frac{1}{N}\sum_{i=1}^N L(y_i, f(\boldsymbol{x}_i)) + \lambda \Omega(f) $$
$\Omega(f)$ は正則化項(次節)。 教師ありの「種類」は y の型で決まります:
| タスク | $y$ の型 | 代表手法 | 代表的損失 |
|---|---|---|---|
| 回帰 | 連続値 | 線形回帰、 Ridge、 LASSO、 GBM | MSE、 MAE |
| 2値分類 | {0, 1} | Logistic、 SVM、 RF、 XGBoost | クロスエントロピー、 Hinge |
| 多クラス分類 | {1, ..., K} | Softmax 回帰、 NN | カテゴリカル交差エントロピー |
| 順序回帰 | 順序付きラベル | Ordinal Logistic | 専用損失 |
ラベルなしのデータ $\boldsymbol{x}_i$ から、 「データの構造」を発見する。 「何を予測するか」が明示されない探索的タスク。
エージェントが環境と相互作用して、 累積報酬を最大化する方策を学ぶ。 ゲーム AI、 ロボット制御、 推薦システムなどで活躍。
代表アルゴリズム:Q学習、 SARSA、 DQN、 Policy Gradient、 PPO、 Actor-Critic。 多腕バンディット問題(UCB、 Thompson Sampling)は強化学習の最も基本的な定式化。
機械学習の最重要規律。 データを 3 つに分けて、 役割を明確にします:
| 分割 | 用途 | 通常の割合 |
|---|---|---|
| 訓練(train) | モデルパラメータの学習 | 60〜80% |
| 検証(validation) | ハイパラ調整、 モデル選択 | 10〜20% |
| テスト(test) | 最終評価(1回だけ) | 10〜20% |
⚠️ テストデータでハイパラ調整するのは禁忌(データリーク)。 テストデータは「公開モデルの最終評価のために 1 回だけ触る」。 何度も使うと「テストにフィットしたモデル」になり、 真の汎化性能が分からなくなる。
k-fold 交差検証は、 train/validation を k 回ローテーションして安定したハイパラ調整を行う手法(詳細は 評価指標 #cv)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # ── この抜粋で使うデータを用意します ── # stratify を使うので、目的変数は「クラス」でなければならない。 import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023 年の 47 都道府県 X = df[['A1101', 'B4101']].astype(float).values # 総人口・年平均気温 aging = df['A1303'] / df['A1101'] * 100 y = (aging >= aging.median()).astype(int).values # 高齢化率が中央値以上か # 80% train+valid, 20% test X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y) # 上の 80% を 75% train, 25% valid に分割(全体の 60/20/20 になる) X_train, X_valid, y_train, y_valid = train_test_split(X_temp, y_temp, test_size=0.25, random_state=42, stratify=y_temp) print(f'train={len(X_train)}, valid={len(X_valid)}, test={len(X_test)}') |
🍰 まずはやさしく
AIを動かすための中心的な技術です。
仕組みの土台を理解するために使います。
部活の成績管理などを自動化する基礎になります。
機械学習の全体像と位置づけを読みます。
論文・記事に 「教師あり学習」「教師なし学習」「強化学習」「分類」「回帰」「特徴量」「過学習」「汎化」「バイアス-バリアンス」「損失関数」「ハイパーパラメータ」「交差検証」「訓練/検証/テスト」 として登場する機械学習の中核概念群。 個別のモデル(決定木・SVM・NN等)を学ぶ前に押さえるべき基礎の集合体です。
このページは「機械学習基礎」という、 本サイトで最も上流の概念を扱います。 ここから派生して 教師あり学習・教師なし学習・強化学習 の 3 系統に分かれ、 各系統に多数のアルゴリズム (線形回帰・決定木・SVM・k-means・Q学習...) が連なります。 統計学との違いを意識する場合は 統計学 や モデル評価 を、 工学的な実装に進む場合は AI システム開発 を併読してください。
| 立ち位置 | 隣接概念 | 関係性 |
|---|---|---|
| 上位概念 | AI コア技術 | 機械学習は AI の主要技術の一つ |
| 並列概念 | 統計学 | 予測重視 vs 解釈重視 (重なり大) |
| 下位概念 | 深層学習 | ニューラルネット系の発展形 |
| 前提知識 | 線形代数・確率論 | 行列演算・期待値が頻出 |
🍰 まずはやさしく
ルールを当てるゲームのようなものです。
データから変換のきまりを見つけるために使います。
買い物履歴から好みの商品を当てる例があります。
3つの学習方法の違いを直感的に学びます。
機械学習を一言で言えば、 「入力 $x$ と出力 $y$ のペアを大量に観察して、 その背後にある変換規則 $y = f(x)$ を当てるゲーム」です。 たとえば SSDSE-B-2026 で「総人口 $x$」から「65歳以上人口 $y$」を予測したい時、 人類がモデルを書き下ろさなくても、 47 都道府県の (総人口, 高齢者数) のペアから機械が「$y \approx 0.25 x$」のような関数を推定してくれます。
| パラダイム | 比喩 | SSDSE での例 |
|---|---|---|
| 教師あり学習 | 先生が「正解」を教えてくれる試験勉強 | 人口 → 販売額の回帰 |
| 教師なし学習 | 正解を教えてもらえずグループ分けを発見 | 47 都道府県を経済類似度でクラスタリング |
| 強化学習 | 試行錯誤しながらゲームの攻略法を学ぶ | 店舗配置を最適化する逐次決定問題 |
統計学との差異も明確にしておきましょう。 統計学は「データの背後の真のパラメータ $\theta$ を推定する」姿勢が強く、 仮説検定や信頼区間で不確実性を定量化します。 一方、 機械学習は「未知データに対する予測精度」を主目的とし、 解釈可能性を犠牲にしてでも汎化誤差を下げる方向に振ります。 SSDSE-B-2026 で「相関係数 0.991」を出すのが統計学、 「未知の都道府県の高齢者数を RMSE 約 19 万人で当てる」のが機械学習です。
機械学習の基礎概念を 3 枚で振り返る。 1 枚目 = 教師あり/教師なし/強化学習の 3 分類、 2 枚目 = 学習サイクル (データ→モデル→評価→更新)、 3 枚目 = バイアス-バリアンス分解。
→ 3 図で「学習パラダイム → 反復サイクル → 過学習回避」という ML 全体のフレームが構造的に理解できる。
機械学習の基礎概念(教師あり / 教師なし、 汎化、 過学習、 評価指標)は、 抽象的な数式だけでなく 実データで挙動を観察する ことで初めて腑に落ちる。 ここでは SSDSE-B-2026 を用いて 3 つの基礎概念を視覚化する。
| タスク | 主要指標 | 汎化評価の流儀 | SSDSE での例 |
|---|---|---|---|
| 回帰 | MSE / RMSE / $R^2$ / MAE | 5-fold CV または LeaveOneOut | 総人口 → 65歳以上人口 |
| 分類 | Accuracy / F1 / AUC | Stratified 5-fold CV | 過疎度 上位 / 下位 二値分類 |
| クラスタリング | Silhouette / Calinski-Harabasz | 複数 K で安定性検証 | 47 県の類型化 |
| 時系列 | MAPE / MASE | 時系列分割 (rolling origin) | 人口推移予測 |
このコードでやること:SSDSE-B-2026 の 47 行データに対し、 多項式回帰の次数を 1〜10 で変化させ、 訓練 $R^2$ とテスト $R^2$ を比較する。 高次数で訓練性能は上がるが汎化性能が落ちる「過学習の発生」を観察する。
📥 入力:SSDSE-B-2026 の A1101(総人口)、 A1303(65歳以上人口)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.model_selection import train_test_split df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) recent = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] mask = recent['A1101'].notna() & recent['A1303'].notna() X = recent.loc[mask, ['A1101']].values / 1_000_000 # 百万人単位に変換 (高次多項式の数値安定化) y = recent.loc[mask, 'A1303'].values X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) print('次数 訓練R^2 テストR^2') for deg in [1, 2, 3, 5, 8]: Xp_tr = PolynomialFeatures(deg).fit_transform(X_tr) Xp_te = PolynomialFeatures(deg).fit_transform(X_te) m = LinearRegression().fit(Xp_tr, y_tr) print(f'{deg:>3} {m.score(Xp_tr, y_tr):.4f} {m.score(Xp_te, y_te):.4f}') |
📤 実行結果(参考値):
💬 結果の読み方:訓練 $R^2$ は次数を上げてもほぼ頭打ちだが、 テスト $R^2$ は次数 2 がピーク(0.993)。 次数 3 以降はテスト $R^2$ が下がり続け、 次数 8 では 0.51 まで悪化する。 高次項が東京などの外れ値に過剰反応するためで、 これが 過学習の本質。 47 行のような小データほど過学習しやすい。
関連: 機械学習 / 教師あり学習 / 教師なし学習 / 過学習 / 汎化 / 交差検証 / 評価指標
機械学習は伝統的に 教師あり学習・教師なし学習・強化学習の 3 大パラダイムで整理されてきた。 これに加え近年は 半教師あり学習(少量のラベル + 大量の無ラベル)、 自己教師あり学習(マスク予測などで自前のラベルを生成)、 少数ショット学習(数例から汎化)など中間的なパラダイムが急速に発展している。 各パラダイムは「何を最適化するか」が根本的に異なる:教師あり学習は予測誤差、 教師なし学習はデータ構造(クラスタ・低次元表現・密度)、 強化学習は期待累積報酬を最大化する。 SSDSE-B-2026 のような少量の表データでは、 教師あり学習(回帰・分類)と教師なし学習(クラスタリング・PCA)が主戦場で、 強化学習は適用が難しい。
パラダイムを横断的に支える理論的基盤は、 (1) 経験リスク最小化 (ERM)、 (2) 正則化、 (3) 汎化境界(PAC 学習・VC 次元)の 3 本柱である。 ERM は「訓練データ上の損失最小化が真のリスク最小化に近似的に等しい」という仮定の下で最適化問題を解く。 正則化は「複雑なモデルにペナルティ」を与え過学習を抑制する。 PAC 学習理論は「ある精度を保証するために必要なサンプル数」の上界を理論的に与え、 VC 次元はモデルの表現力を定量化する。 これらの理論は、 SSDSE のような n=47 の小データでは特に重要で、 「47 行で何が学べるか」の限界を冷静に評価する物差しになる。
| サンプル数 n | 特徴量数 d | 推奨モデル | 回避すべきモデル |
|---|---|---|---|
| < 100 | < 10 | 線形回帰 / Ridge / Lasso | 深層学習 / ランダムフォレスト |
| 100〜1000 | < 100 | 勾配ブースティング (LightGBM) | 巨大 DNN |
| 1000〜10万 | 100〜数千 | XGBoost / 中規模 NN | 手動特徴量設計のみ |
| > 10万 | > 数千 | 深層学習 / Transformer | 線形モデルのみ(表現不足) |
SSDSE-B-2026 は (n, d) ≒ (47, 数百) の 「サンプル数 < 特徴量数」に該当し、 表の第 1 行どころか「最も避けるべき領域」に近い。 この場合は 特徴量を厳選(事前知識または PCA)して d を 10 以下に抑えるか、 L1 正則化(Lasso)でスパース解を強制する戦略が有効である。 「n < d でも勾配ブースティングが回せる」のは技術的には可能だが、 解釈性と汎化性能の保証が弱くなる。
このコードでやること:SSDSE-B-2026 の 47 行データに対し、 ランダムフォレストの max_depth を 1〜20 で変化させ、 訓練 $R^2$ とテスト $R^2$ を観察する。 木を深くするほど訓練性能は上がるが、 テスト性能は浅い段階で頭打ちになる例。
📥 入力:SSDSE-B-2026 の A1101(総人口)、 B4101(年平均気温)、 A1303(65歳以上人口)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pandas as pd from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) recent = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] m = recent[['A1101','B4101','A1303']].dropna() X = m[['A1101','B4101']].values y = m['A1303'].values X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) print('max_depth 訓練R^2 テストR^2') for depth in [1, 2, 3, 5, 10, 20]: rf = RandomForestRegressor(max_depth=depth, n_estimators=100, random_state=0) rf.fit(X_tr, y_tr) print(f'{depth:>10} {rf.score(X_tr, y_tr):.4f} {rf.score(X_te, y_te):.4f}') |
📤 実行結果(参考値):
💬 結果の読み方:テスト $R^2$ は max_depth=2 で最良(0.920)。 さらに深くすると訓練 $R^2$ は 0.99 近くまで伸びるがテスト $R^2$ は 0.90 前後で横ばい〜微減。 47 行の小データでは「複雑なモデルほど良い」は成立しない。
2018 年以降、 機械学習の主戦場は 「特化型モデルをゼロから学習」から「事前学習済み基盤モデルを微調整」へと急速にシフトしている。 BERT / GPT / CLIP のような大規模モデルが公開ウェブテキスト・画像で事前学習され、 個別タスクへの転用は Fine-tuning や Few-shot prompting で行うのが主流である。 これにより、 タスクごとに数万件のラベル付きデータを集める必要がなくなり、 小データでも高性能を出せるようになった。 SSDSE-B-2026 のような数十行の表データでも、 LLM にコンテキストを与えれば自然言語での説明・要約・含意推論が可能で、 古典的機械学習の枠組みを補完する。
ただし表データの予測精度に関しては、 依然として LightGBM や XGBoost といった勾配ブースティングが最強である。 Google や Meta の最新研究 (2024) でも、 Tabular Data ベンチマークでは XGBoost が深層学習を上回る事例が多い。 つまり「機械学習の全領域で深層学習が勝つ」わけではなく、 データの形に応じて手法を選ぶ判断力が今も最も重要なスキルである。
機械学習の発展は、 広義の AI ブームと密接に連動している。 第 1 次 AI ブーム (1950-1960 年代) では、 パーセプトロン (Rosenblatt 1958) が登場したが、 線形分離不可能な XOR 問題で挫折した。 第 2 次 AI ブーム (1980 年代) では、 誤差逆伝播法 (Rumelhart 1986) が多層パーセプトロンの学習を可能にし、 さらに決定木・SVM・ベイジアンネットなど多様な手法が花開いた。 しかし計算機の限界とデータ不足で実用化は限定的だった。 第 3 次 AI ブーム (2012 年〜) では、 AlexNet が ImageNet で圧勝して以来、 深層学習が画像・音声・自然言語のあらゆる領域を席巻している。 この長い歴史の中で、 機械学習の基礎概念(教師あり・教師なし、 過学習、 評価指標、 Cross Validation)は、 ほとんど変わらない普遍的な枠組みとして生き残ってきた。
機械学習モデルの予測誤差は、 理論的に (1) ベイズ誤差 (irreducible error)、 (2) バイアス、 (3) バリアンスの 3 つに分解される。 これは予測誤差 $E[(y - \hat{y})^2]$ を以下のように分解した結果である:
$E[(y - \hat{y})^2] = \sigma^2 + (\text{Bias}[\hat{y}])^2 + \text{Var}[\hat{y}]$
ここで $\sigma^2$ はノイズ項(どれだけ良いモデルでも消せない誤差)、 $\text{Bias}$ はモデルが真の関数からどれだけ偏っているか(モデルが単純すぎると大きい)、 $\text{Var}$ は訓練データを変えると予測値がどれだけ揺れるか(モデルが複雑すぎると大きい)を表す。 「単純なモデルは高バイアス・低バリアンス」「複雑なモデルは低バイアス・高バリアンス」というトレードオフが、 機械学習の根本的な制約である。 SSDSE-B-2026 の 47 行データのような小サンプル状況では、 ランダムフォレストの深さを増やすとバリアンスが急速に増大し、 全体誤差が悪化する。 そのため 「シンプルなモデル + 強い正則化」が小データの定石となる。
機械学習の失敗の中でも特に発見が遅れがちなのが データ漏洩 (data leakage)である。 これは、 訓練時にテストデータの情報が漏れ込み、 評価指標が異常に高くなる現象を指す。 典型的な漏洩パターンは以下の 5 種類:
(1) 標準化を全データで行ってから分割。 StandardScaler を train + test 全体に fit_transform すると、 テストデータの平均・分散の情報が訓練に漏れる。 正しくは「train でのみ fit、 test には transform」とする。
(2) 時系列データのランダム分割。 時系列データを train_test_split でランダムに分割すると、 未来のデータで過去を予測する逆因果が発生する。 正しくは時系列分割(過去 → 未来)。
(3) 目的変数からの派生特徴量。 「過去 1 年の平均給与」を目的変数とする場合に「過去 1 年の最高給与」を特徴量に含めると、 強い相関で過学習する。 「特徴量は目的変数を観測する前に確定すべき」が原則。
(4) 患者 / 顧客の重複。 同じ患者の複数受診データを train と test に分散させると、 患者固有の特徴が漏れる。 GroupKFold で患者単位に分割すべき。
(5) 欠損補完の全体実施。 全データで mean imputation を行うと、 テストの平均が訓練に漏れる。 正しくは「train で計算した平均を test の欠損補完にも使う」。
これら 5 種類の漏洩は SSDSE-B-2026 のような小データでも頻繁に発生する。 「テスト性能が異様に高い」「Cross Validation の分散が極小」が漏洩の兆候であり、 必ず擬似コードレベルで分割の境界線を確認すべきである。
機械学習を学ぶ標準的な経路は、 (1) 統計の基礎 → (2) 線形代数・最適化 → (3) 機械学習の概論 → (4) 実装 (scikit-learn) → (5) 深層学習という 5 段階である。 SSDSE-B-2026 はこのうち (3) の段階で扱う絶好の教材となる。 47 行のデータは「線形回帰の傾きを手計算で確認できる」「相関係数を直感的に把握できる」「クロスバリデーションを 5-fold で完全に走らせられる」など、 学習者にとって 「手の届く」 サイズだからである。 巨大なデータセットで学び始めると、 計算時間が長くて試行錯誤しにくく、 直感も働きにくい。 「小さなデータで原理を理解、 大きなデータで実装スキルを磨く」という二段構えが効率的である。
独学リソースとしては、 (a) Hastie, Tibshirani, Friedman "The Elements of Statistical Learning" (古典・無料 PDF あり)、 (b) Bishop "Pattern Recognition and Machine Learning" (PRML)、 (c) Andrew Ng の Coursera 講義(実装重視)、 (d) Google の ML Crash Course(コードベース)、 (e) Kaggle の Notebook 学習(実データでの試行錯誤)が定番である。 日本語では「ゼロから作るディープラーニング」シリーズ(斎藤康毅)が、 数式と実装のバランスが良く初学者に人気である。 SSDSE-B-2026 を題材にした各種チュートリアルも、 独立行政法人統計センターや JSDA から公開されている。
機械学習プロジェクトの標準的なライフサイクルは、 1996 年に確立された CRISP-DM (Cross-Industry Standard Process for Data Mining)の 6 段階で表現される:(1) ビジネス理解、 (2) データ理解、 (3) データ準備、 (4) モデリング、 (5) 評価、 (6) デプロイメント。 これは 30 年経った今も大きく変わっておらず、 多くの実プロジェクトでこの順序を踏襲する。 ただし現代では、 デプロイメント後の「監視・再学習・廃止」が新たな 3 段階として追加され、 計 9 段階で考えるのが一般的である。
SSDSE-B-2026 を用いた学習プロジェクトでこのライフサイクルを実演するなら、 「都道府県別人口の予測モデル」というテーマで以下のように進める:(1) ビジネス理解 = 「2030 年の都道府県別人口を予測したい」、 (2) データ理解 = 「SSDSE は何年から始まる、 どの列が人口か」、 (3) データ準備 = 「欠損補完・スケーリング」、 (4) モデリング = 「線形回帰 / Ridge / ランダムフォレストを試す」、 (5) 評価 = 「Cross Validation で RMSE を比較」、 (6) デプロイメント = 「Web ダッシュボードで予測値を提供」。 各段階を意識して進めると、 プロジェクト管理スキルも同時に身につく。
Python の機械学習エコシステムは、 各ライブラリが「何を得意とするか」が明確に分化している:
(1) scikit-learn: 線形モデル・木ベース・クラスタリング・前処理の標準。 API が統一されており初学者に最適。 SSDSE-B-2026 規模では第一選択。
(2) XGBoost / LightGBM / CatBoost: 勾配ブースティングの専門。 表データの予測精度では事実上のチャンピオン。 Kaggle 上位はほぼこれら。
(3) PyTorch / TensorFlow / Keras: 深層学習フレームワーク。 PyTorch が研究界、 TensorFlow が産業界、 Keras が初学者向け。 画像・音声・テキスト処理が主戦場。
(4) Hugging Face Transformers: 事前学習済み Transformer モデルのライブラリ。 BERT・GPT・T5 などを 3 行のコードで呼べる。 NLP の事実上の標準。
(5) statsmodels: 統計モデリング(GLM、 時系列、 仮説検定)の専門。 scikit-learn が機械学習指向なのに対し、 統計検定指向。 SSDSE-B-2026 の経済分析にも有用。
これら 5 つのライブラリを使い分けるスキルが、 現代の機械学習エンジニアの基礎リテラシーである。 SSDSE-B-2026 を題材とした演習では、 (1) scikit-learn から始めて、 (5) statsmodels で統計的有意性を補強し、 (2) LightGBM で精度比較するという流れが標準的である。 学習者は、 同じデータに対して複数ライブラリを試すことで、 「同じ問題でもライブラリによって結果が微妙に異なる」現実を体験できる。
機械学習研究と実装で最も軽視されがちなのが 再現性 (reproducibility)である。 同じコード・同じデータでも、 ライブラリのバージョン・乱数シード・ハードウェア・OS によって結果が変わることがある。 これを防ぐためのチェックリストは以下:
(a) random_state、 seed を全ライブラリで明示。 (b) requirements.txt または pyproject.toml でライブラリのバージョン固定。 (c) Docker で OS・ライブラリ環境を完全再現。 (d) データのバージョンも DVC (Data Version Control) などで管理。 (e) GPU 計算では torch.use_deterministic_algorithms(True) で決定的アルゴリズムを強制。 これら 5 点を守ることで、 「自分の PC では動いたのに他人の PC で違う結果」という問題を回避できる。
SSDSE-B-2026 のような公開データでも、 数年経つと SSDSE のバージョン更新で値が変わる可能性がある。 そのため、 研究論文や教材で SSDSE を引用する際は、 「SSDSE-B-2026」のように年度を明示し、 ダウンロードした CSV ファイル自体を成果物リポジトリに含めるか、 ハッシュ値を記録しておくことが望ましい。 こうした再現性への配慮が、 教育・研究の質を高める基盤となる。
機械学習の基礎を学んだ後、 実務で活躍するためには、 以下の 3 つの心構えが重要である:
(1) 「精度」だけでなく「ビジネス価値」を意識する。 Kaggle のような競技では精度向上が目的だが、 実務では「精度が 0.001 上がる代わりに保守コストが 2 倍になる」モデルは採用されない。 「シンプルで保守しやすい」が常にトップ精度より優先される現実を受け入れる。 SSDSE-B-2026 のような社会データの場合も、 「複雑なモデルで R^2 が 0.99 になった」より「線形回帰で R^2 が 0.95 で説明可能」のほうが政策決定には有用なケースが多い。
(2) 「データ理解」を機械学習より先に深める。 Garbage In, Garbage Out の格言通り、 データの質が悪ければどんな高度なモデルも無意味である。 SSDSE-B-2026 を扱う前に、 「この列は何の指標か」「欠損が多い理由は何か」「外れ値の県は何があったか」をドメイン知識と照らし合わせて理解することが、 機械学習成功の前提となる。 統計局の Web サイトで定義を確認、 都道府県別の歴史的経緯を調査、 専門家にヒアリング、 などの地道な作業が結局はモデル精度に効いてくる。
(3) 「不確実性」を定量化する習慣をつける。 機械学習の予測は「平均値」だけでなく「予測区間」「予測の信頼度」を伴うべきである。 SSDSE-B-2026 の小データでは特に重要で、 「2030 年の秋田県人口は 90 万人」ではなく「85〜95 万人(80% 区間)」と幅で報告するのが誠実な姿勢である。 ベイズ的アプローチや Bootstrap で予測区間を出す技術を、 基礎段階から習得することが重要である。 これは「過学習を防ぐ」「過信を避ける」両方の意味で、 機械学習エンジニアの倫理的責任にもつながる。
機械学習の基礎を一通り学んだ学習者の次のステップは、 興味と目的に応じて以下のいずれかとなる:
(A) 深層学習の研究: Transformer・GAN・拡散モデルといった最先端アーキテクチャの理解と実装。 PyTorch を使った CV / NLP / 音声処理の実装スキル。 論文を読みこなす英語力と数学力。
(B) MLOps の専門化: 機械学習モデルを本番運用するための CI/CD・モデル監視・データドリフト検出・A/B テスト設計。 Docker・Kubernetes・MLflow・Kubeflow・Vertex AI などのインフラスキル。
(C) 因果推論への展開: 相関ではなく因果関係を測る統計手法。 DiD・RDD・操作変数法・傾向スコア・Causal Forest など。 SSDSE-B-2026 のような社会データに最適な学問領域。
(D) 専門ドメインへの深化: 医療・金融・農業・教育など特定ドメインに特化し、 「データ + ドメイン知識」のハイブリッド人材として活躍する道。 SSDSE-B-2026 で扱われる公衆衛生・経済・教育の各分野は深化先の候補。
いずれの道を選んでも、 機械学習の基礎概念(教師あり・教師なし、 過学習、 評価指標、 Cross Validation など)は土台となり続ける。 SSDSE-B-2026 で身につけた基礎を、 自分の興味・キャリアの方向性に応じて発展させていくことが、 次なる学びへの確実な道筋となる。
機械学習の基礎を「読んで理解する」だけでなく「実験で身体化する」ためには、 以下の 5 つの定番演習を一通り経験することが推奨される:
(1) 線形回帰の係数解釈: SSDSE-B-2026 の「総人口 → 65歳以上人口」のような単純回帰で、 係数が「総人口 1 人増えるごとに高齢者数がどれだけ増えるか」と解釈できることを確認する。 切片の意味も体感する。
(2) 過学習の可視化: 多項式回帰の次数を 1〜10 で変化させ、 訓練誤差とテスト誤差の挙動を観察する。 高次数で訓練誤差が 0 に近づくがテスト誤差は U 字を描くことを確認する。
(3) Cross Validation の比較: 5-fold、 10-fold、 LeaveOneOut の 3 種類で同じデータを評価し、 分散の違いを確認する。 小データでは LeaveOneOut のほうが安定するが計算量が増える。
(4) クラス不均衡の処理: SSDSE の指標から「上位 5 県と下位 42 県」の極端な不均衡分類問題を作り、 通常の Accuracy では評価できないことを実感する。 F1 や AUC で評価する習慣をつける。
(5) 特徴量重要度の解釈: ランダムフォレストや LightGBM で feature_importance_ を取り出し、 SHAP 値で各予測の根拠を可視化する。 「単一の特徴量重要度」と「個別予測の SHAP 値」の違いを理解する。
これら 5 つの演習を SSDSE-B-2026 で一通り行うと、 機械学習の基礎概念がただの言葉ではなく、 具体的なコードとグラフとして身体化される。 教科書を読んで「分かった気になる」段階から、 「自分で実験できる」段階へとレベルアップする道筋となる。 教育者は、 こうした演習を「課題」として明示的にカリキュラムに組み込むことで、 学習者の理解を確実なものにできる。
深層学習・LLM・自律エージェントといった最先端 AI 技術が急速に発展する現代でも、 機械学習の基礎概念(教師あり / 教師なし、 過学習、 汎化、 Cross Validation、 評価指標、 バイアス・バリアンス、 正則化など)は 永続的な土台として価値を持ち続ける。 表層的なフレームワークやライブラリは数年で陳腐化するが、 基礎概念は 50 年以上前から本質的に変わっていない。 SSDSE-B-2026 のような実データで基礎を身につけた学習者は、 どんな最新技術が登場しても、 その「本質的な何が新しいか」を見抜く目を持ち続けられる。 これこそが、 機械学習の基礎を学ぶことの最大の価値である。
機械学習という用語は 1959 年に Arthur Samuel によって「明示的にプログラムされずに学習する能力をコンピュータに与える研究分野」と定義された。 当初はチェッカーゲームでの自己対局学習が代表例だったが、 その後 60 年余りでパーセプトロン (1958)、 決定木 (1986)、 ニューラルネット (1986)、 SVM (1995)、 ランダムフォレスト (2001)、 深層学習 (2012)、 Transformer (2017)、 LLM (2018-) と、 主要アルゴリズムが次々と登場した。 これらの発展は、 計算機の高速化・データ量の爆発・最適化理論の進歩という 3 つの要因が組み合わさって実現したものである。
本ページで扱った「機械学習の基礎概念」は、 これら全てのアルゴリズムを横断する普遍的な枠組みであり、 個別アルゴリズムを学ぶ前にこの土台を固めることで、 後の学習が遥かに効率化される。 SSDSE-B-2026 のような実データを使って基礎を身につけた学習者は、 教材で扱われた以外のデータセット(Kaggle のコンペ、 自社の業務データなど)にもスムーズに応用できる。 「データの形」「課題の種類」「評価方法」を見極める力が、 機械学習エンジニアの最も重要な専門性なのである。
機械学習の基礎を確実に身につけるためには、 以下の 3 つの推奨プロジェクトを順に経験することが効果的である:
プロジェクト 1:SSDSE-B-2026 の都道府県別人口予測。 線形回帰から始めて、 Ridge、 ランダムフォレスト、 LightGBM へと段階的にモデルを高度化する。 各モデルの精度・解釈性・学習時間を比較し、 「どのモデルがこの問題に最適か」を判断する経験を積む。
プロジェクト 2:SSDSE で都道府県のクラスタリング。 K-Means、 階層的クラスタリング、 DBSCAN を試し、 47 都道府県を 3〜5 のクラスタに分類する。 各クラスタの特徴を「経済規模」「人口構成」「産業構造」などで解釈し、 教師なし学習の本質を体感する。
プロジェクト 3:SSDSE の時系列予測。 都道府県別の人口推移を、 ARIMA、 Prophet、 LSTM で予測する。 時系列特有の交差検証(rolling origin)を実装し、 「未来は過去から学習する」という時系列予測の特殊性を理解する。 これにより、 機械学習の基礎が「現実世界の意思決定支援」につながることを実感できる。 これら 3 つのプロジェクトを完遂すれば、 機械学習の基礎概念を「コードで実装できる」レベルまで身体化できる。 この段階に到達した学習者は、 自分の興味に応じて深層学習・因果推論・MLOps・専門ドメインといった発展領域へ進む準備が整っている。 SSDSE-B-2026 が提供する「身近で扱いやすい実データ」が、 こうした学習の確実な出発点となることを、 強調しておきたい。
機械学習の基礎概念は (1) 教師あり学習、 (2) 教師なし学習、 (3) 強化学習の 3 つに分けられる。 ここでは SSDSE-B-2026 の都道府県データを使って、 これらを同一データで比較できる視覚的補足を追加する。 教師あり学習は「ラベルから予測」、 教師なし学習は「ラベルなしで構造発見」、 と全く異なる思考法であることを実感する。
このコードでやること: SSDSE-B-2026 で「総人口 → 65歳以上人口」を教師あり線形回帰で予測する。 機械学習の最も基礎的なパラダイムを、 47 都道府県の実データで体感する。
📥 入力データ (SSDSE-B-2026 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df23 = df[df['SSDSE-B-2026'] == 2023].copy() X = df23[['A1101']] # 総人口 y = df23['A1303'] # 65歳以上人口 model = LinearRegression().fit(X, y) y_pred = model.predict(X) print(f'傾き = {model.coef_[0]:.4f}') print(f'切片 = {model.intercept_:.2f}') print(f'R^2 = {r2_score(y, y_pred):.4f}') |
📤 実行例:
💬 結果の読み方: R²=0.982 は「総人口 1 変数だけで 65歳以上人口の 98.2% の変動を説明できる」ことを意味する。 教師あり学習の「ラベルから入力 → 出力の関係を学ぶ」基本動作が、 SSDSE で確かに機能している。 教師なし学習 (k-means) はラベル不要で、 強化学習は試行錯誤による報酬最大化、 とパラダイムが根本的に異なる。
| パラダイム | ラベル要件 | SSDSE での実例 | 評価指標 |
|---|---|---|---|
| 教師あり学習 | 必須 | 総人口 → 65歳以上人口予測 | R²・RMSE・F1 |
| 教師なし学習 | 不要 | 47 都道府県のクラスタリング | シルエット・Davies-Bouldin |
| 強化学習 | 報酬設計 | 交通信号最適化 (SSDSE 交通データ起点) | 累積報酬・学習速度 |
補足: 3 つのパラダイムは「データの種類」と「問題設計」で使い分ける。 ラベル付きデータが十分ある → 教師あり、 ラベルがない → 教師なし、 環境とのインタラクションがある → 強化学習、 と判断する。 関連: AI / 分類 / クラスタリング / AI の応用分野。
🍰 まずはやさしく
計算で正解に近づける仕組みのことです。
予測のミスを最小にするために使います。
テストの点数を上げる勉強法に似ています。
誤差を減らすための数式について読みます。
機械学習の数理的核心は次の 3 つの式に凝縮されます。
(1) 期待リスク (汎化誤差) — 学習器の真の性能:
$$R(f) = \mathbb{E}_{(x,y) \sim \mathcal{D}}\bigl[\ell(f(x), y)\bigr]$$(2) 経験リスク — 訓練データで近似:
$$\hat{R}_n(f) = \frac{1}{n}\sum_{i=1}^{n} \ell\bigl(f(x_i), y_i\bigr)$$(3) ERM 原理 — 経験リスクを最小化する関数を選ぶ:
$$\hat{f} = \arg\min_{f \in \mathcal{F}} \hat{R}_n(f) + \lambda \cdot \Omega(f)$$ここで $\mathcal{D}$ は真の分布 (未知)、 $\ell$ は損失関数 (二乗誤差・交差エントロピー等)、 $\mathcal{F}$ は仮説空間、 $\Omega(f)$ は正則化項、 $\lambda \geq 0$ は正則化の強さ。
Valiant (1984) が定式化した PAC (Probably Approximately Correct) 学習は、 「サンプル数 $n$ をどれだけ取れば、 汎化誤差を確率 $1-\delta$ で $\epsilon$ 以下に抑えられるか」を保証します。
$$\Pr\bigl[\,|R(\hat{f}) - \hat{R}_n(\hat{f})| > \epsilon \,\bigr] \leq 2|\mathcal{F}| \exp(-2n\epsilon^2)$$これを変形すると、 必要サンプル数は $n \geq \frac{1}{2\epsilon^2}\ln\frac{2|\mathcal{F}|}{\delta}$ となり、 仮説空間が大きいほど (モデルが複雑なほど) 必要データ数が増えることが分かります。 これが「複雑モデル=過学習しやすい」の数学的根拠です。
PAC 学習の発展版として、 仮説空間 $\mathcal{F}$ の「複雑度」を VC 次元 (Vapnik-Chervonenkis dimension) $d_{\mathrm{VC}}$ で測ると、 サンプル複雑度の上界がより精密になります。
$$n \geq O\!\left(\frac{1}{\epsilon}\Bigl(d_{\mathrm{VC}} \ln\frac{1}{\epsilon} + \ln\frac{1}{\delta}\Bigr)\right)$$| モデル | VC 次元 $d_{\mathrm{VC}}$ | SSDSE-B-2026 (n=47) で十分か? |
|---|---|---|
| 線形回帰 (1 特徴) | 2 | 余裕で十分 |
| 線形回帰 (10 特徴) | 11 | ぎりぎり安全 |
| 決定木 (深さ 5) | ~30 | 過学習リスク大 |
| ランダムフォレスト (100 本) | ~数百 | 完全に過学習領域 |
これが「47 都道府県データに DL を当てるのは過剰」と言われる根拠です。 サンプルサイズ $n$ がモデル複雑度に対して不足だと、 PAC 保証が崩れて汎化誤差を制御できません。 だからこそ SSDSE では 交差検証 による厳密な評価が不可欠です。
「機械学習で何かやりたい」と言われた時に、 ゼロから本番までを SSDSE-B-2026 を使って具体的にどう進めるか。 ベテランデータサイエンティストの暗黙知を 9 ステップで言語化します。
| # | ステップ | アウトプット | SSDSE-B-2026 での具体例 |
|---|---|---|---|
| 1 | 問題定義 | 「何を予測したいか」「成功の定義」 | 「47 都道府県の 65歳以上人口を ±10% で予測」 |
| 2 | データ収集 | CSV、 DB、 API 等 | pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) |
| 3 | EDA | 統計量、 ヒストグラム、 相関ヒートマップ | df.describe(), df.corr().style.background_gradient() |
| 4 | 前処理 | 欠損補完、 外れ値処理、 標準化 | 対数変換 np.log1p(df['A1101']) で右裾の歪み解消 |
| 5 | 特徴量設計 | 既存列の組合せ、 ドメイン知識の注入 | 「人口当たり○○」「高齢化率」など比率特徴量を追加 |
| 6 | モデル選定 | 線形 / 木 / DNN の候補リスト | n=47 と小さいので Ridge / RandomForest が候補 |
| 7 | 学習・評価 | cross_val_score、 GridSearchCV | 5-fold CV で R² の平均±SD を報告 |
| 8 | デプロイ | pickle、 FastAPI、 Docker | joblib.dump → 推論 API として公開 |
| 9 | 運用監視 | drift 検出、 再訓練ループ | 毎年 SSDSE 更新時に PSI チェック + 再訓練 |
反復性: このフローは線形ではなく螺旋状。 ステップ 7 の結果が悪ければ ステップ 4-6 に戻る、 ステップ 9 で drift が見つかればステップ 2 から再取得、 という反復が常態です。
ERM の式 $\hat{R}_n(f) = \frac{1}{n}\sum \ell(f(x_i), y_i)$ の $\ell$ に何を入れるかで、 学習されるモデルの性格が決まります。
| 損失 | 数式 | 用途 | 特徴 |
|---|---|---|---|
| 二乗誤差 (MSE) | $(y-\hat{y})^2$ | 回帰 | 外れ値に敏感、 滑らかで最適化簡単 |
| 絶対誤差 (MAE) | $|y-\hat{y}|$ | 回帰 | 外れ値に頑健、 不微分点あり |
| Huber | MSE と MAE の混合 | 回帰 | 両者の良いとこ取り |
| 交差エントロピー | $-\sum y_k \log \hat{y}_k$ | 分類 | 確率出力を要求、 softmax と相性◎ |
| Hinge | $\max(0, 1 - y\hat{y})$ | SVM | マージン最大化、 確率出力なし |
| Quantile | 非対称な MAE | 回帰 | 分位点予測 (信頼区間付き) |
SSDSE-B-2026 で「東京の販売額」のような外れ値が支配的なデータでは、 MSE を盲目的に使うと東京に過剰適合します。 MAE や log 変換 (= log-RMSE) を併用するのが現実解。
| 軸 | 統計学 | 機械学習 |
|---|---|---|
| 主目的 | 推測・解釈 | 予測精度の最大化 |
| モデル仮定 | 明示的 (正規分布、 独立性等) | 緩い (関数形は任意) |
| 指標 | p 値、 信頼区間、 AIC/BIC | RMSE、 AUC、 F1 (テストデータ) |
| サンプルサイズ | 小〜中 (数十〜数千) | 中〜大 (数千〜数百万) |
| 変数数 | 少 (解釈優先で絞る) | 多 (特徴量を増やす) |
| 理論基盤 | 確率論・尤度 | 統計的学習理論・最適化 |
| 代表ツール | R, statsmodels, SAS | scikit-learn, XGBoost, PyTorch |
| アウトプット | 論文・レポート | 本番システム・API |
共存の視点: 両者は対立ではなく補完。 統計学で変数選択と解釈を行い、 機械学習で運用システム化と精度向上を行う、 というのが現代データサイエンスの標準ワークフロー。 SSDSE-B-2026 でいえば、 「相関係数で関係性確認 → 機械学習で予測モデル構築」という 2 段階アプローチが理想。
上の 3 式を、 記号一つ一つにラベルを貼って言葉で読み下します。
| 記号 | 読み方 | 意味 (SSDSE-B-2026 文脈) |
|---|---|---|
$R(f)$ | アール エフ | 関数 $f$ を未知の全データに適用したときの平均損失 (真の予測誤差) |
$\mathcal{D}$ | スクリプト ディー | データの「真の生成分布」(全世界の都道府県データを生み出す確率法則。 観測不可) |
$\hat{R}_n(f)$ | アール ハット エヌ | 手元の $n$ サンプル (たとえば 47 都道府県) で計算した平均損失。 $R(f)$ の標本近似 |
$\ell$ | エル (損失) | 1 サンプル当たりの誤差 (回帰なら $(f(x)-y)^2$、 分類なら $-\log p(y \mid x)$) |
$\Omega(f)$ | オメガ | モデルの複雑さペナルティ (L2 なら $\|w\|^2$)。 過学習を防ぐ |
$\lambda$ | ラムダ | 正則化の強さ。 大 → モデルが単純、 小 → 訓練データに忠実 (過学習リスク) |
$\arg\min$ | アーグミン | 「最小化する $f$ を選ぶ」操作。 候補集合 $\mathcal{F}$ の中から最良の関数を 1 つ選ぶ |
📖 物語として読むと: 「データの生成元 $\mathcal{D}$ は神様しか知らない。 私たちは 47 サンプルしか持っていない。 だから真のリスク $R(f)$ は計算できず、 手元データの平均誤差 $\hat{R}_n(f)$ で代用する。 ただし $\hat{R}_n$ を盲目的に最小化すると過学習するので、 モデルの複雑さペナルティ $\lambda \Omega(f)$ を加えてバランスを取る」。 これが ERM + 正則化の全体像です。
テストデータでの予測誤差は3 つの成分に分解できます。 これが「ハイパーパラメタ調整の理論的指針」になるので、 機械学習基礎として必ず押さえたい話題です。
$$\mathbb{E}\bigl[(y - \hat{f}(x))^2\bigr] = \underbrace{(\mathbb{E}[\hat{f}(x)] - f(x))^2}_{\text{バイアス}^2} + \underbrace{\mathrm{Var}[\hat{f}(x)]}_{\text{分散}} + \underbrace{\sigma^2}_{\text{ノイズ (不可避)}}$$| 成分 | 直感 | 単純モデル | 複雑モデル |
|---|---|---|---|
| バイアス² | 「平均的にどれだけずれているか」 | 大 (underfit) | 小 |
| 分散 | 「データ次第でどれだけ揺れるか」 | 小 | 大 (overfit) |
| ノイズ σ² | 「データそのものの不確実性」 | 無関係 | 無関係 |
機械学習モデル選定の本質は 「バイアスと分散のトレードオフを最小化する複雑度を見つけること」であり、 これが交差検証によるハイパーパラメタ調整の理論的根拠です。 SSDSE で次数 1 → 多項式次数 2 への移行が「バイアス減少 (underfit 脱出)」、 次数 8 → 10 が「分散増加 (overfit)」に相当します。
SSDSE-B-2026(47都道府県、 2023年)から、 家計支出3項目(食料費・住居費・教育費)を使い、 教師あり分類(東日本/西日本)と教師なしクラスタリング(3群)を実行して比較します。 ここでは scikit-learn の標準API でパイプラインを組みます。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 2023年のみ抽出 df23 = df[df['SSDSE-B-2026']==2023].copy() X = df23[['L322101', 'L322102', 'L322108']].values X_std = StandardScaler().fit_transform(X) # 西日本(関西以西)を1、東日本を0としてラベル化(仮の例) west = ['京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県'] y = df23['Prefecture'].isin(west).astype(int).values print(X_std.shape, y.sum()) # (47,3) 22 |
SSDSE-B 47県の家計支出(食料費・住居費・教育費)から「西日本かどうか」を予測した場合、 5-fold CV の F1 はおよそ 0.62〜0.70 程度。 47サンプルと小さいため標準偏差が大きく出ます。 過学習を防ぐため LogisticRegression(C=1.0) のような弱い正則化が安全です。
3クラスタに分けると、 都市圏グループ(東京・大阪等)、 北海道・東北グループ、 西日本郊外グループの3群が抽出されることが多い。 シルエット係数(sklearn.metrics.silhouette_score)が 0.3 を超えれば、 ある程度クラスタが分離できていると判断できる。
| 観点 | 教師あり(Logistic) | 教師なし(KMeans) |
|---|---|---|
| 目的 | 西/東 を当てる | 県の自然なグループを発見 |
| 評価 | F1, AUC, accuracy | シルエット係数、 Davies-Bouldin |
| サンプル数依存 | 小さいと不安定(n=47) | クラスタ数依存だが教師ありより頑健 |
| 解釈 | 係数で「どの食品が西日本性に効くか」分かる | クラスタ中心で「各群の食生活の特徴」が分かる |
💡 得られる洞察:47県という小データの場合、 教師ありは小サンプルゆえに過学習しやすく、 むしろ教師なしクラスタリングのほうが「県の食文化の構造」を素直に表現することが多い。 これはまさにML設計の核心。
機械学習の基本サイクル fit → predict → score を、 SSDSE-B-2026 の実値で追体験します。 入力は A1101 (総人口)、 出力は A1303 (65歳以上人口)。
SSDSE-B-2026 から代表 5 県を取り出します (単位: いずれも千人)。
| 都道府県 | 総人口 $x$ (千人) | 65歳以上 $y$ (千人) | 予測 $\hat{y}=0.25x$ | 誤差 $y-\hat{y}$ | $(y-\hat{y})^2$ |
|---|---|---|---|---|---|
| 東京都 | 14,086 | 3,205 | 3,521.5 | -316.5 | 100,172 |
| 大阪府 | 8,763 | 2,424 | 2,190.8 | 233.2 | 54,406 |
| 愛知県 | 7,477 | 1,923 | 1,869.2 | 53.8 | 2,889 |
| 広島県 | 2,738 | 825 | 684.5 | 140.5 | 19,740 |
| 鳥取県 | 537 | 179 | 134.2 | 44.8 | 2,003 |
経験リスク (MSE): $\hat{R}_5(f) = \frac{1}{5}(100172 + 54406 + 2889 + 19740 + 2003) = \frac{179210}{5} = 35842.0$
RMSE: $\sqrt{35842.0} \approx 189.3$ (千人)。 平均 1,711 千人に対し誤差 ±189 千人 (11%) は、 単純な傾き 0.25 モデルでは東京の外れ値が支配的であることを示唆します。 ここから「対数変換」「外れ値除外」「説明変数追加」へと改善サイクルを回すのが ML の典型ワークフロー。
合成データでモデル別 bias², variance, noise の和を計算する。
| モデル | bias² | variance | noise | 合計 |
|---|---|---|---|---|
| 低複雑 | 0.20 | 0.05 | 0.10 | 0.35 |
| 適度 | 0.05 | 0.10 | 0.10 | 0.25 |
| 高複雑 | 0.01 | 0.30 | 0.10 | 0.41 |
1 2 3 4 5 6 7 | import numpy as np b2 = np.array([0.20, 0.05, 0.01]) v = np.array([0.05, 0.10, 0.30]) n = 0.10 total = b2 + v + n print(f"合計誤差: {total}") print(f"最良 index: {total.argmin()}") |
💬 手計算 (Step 2) 「適度」 (index=1) と Python 出力が完全一致。
同じ「教師あり 2値分類」でも、 ライブラリと API スタイルによって書き方が大きく変わります。 ここでは scikit-learn / xgboost / lightgbm / pytorch の4種類の最小コードを示します。
1 2 3 4 5 6 7 8 9 10 11 | from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import GridSearchCV pipe = Pipeline([('sc', StandardScaler()), ('clf', LogisticRegression(max_iter=1000))]) grid = GridSearchCV(pipe, {'clf__C': [0.01, 0.1, 1, 10]}, cv=5, scoring='f1') grid.fit(X_train, y_train) print(grid.best_params_, grid.best_score_) |
1 2 3 4 5 6 7 | import xgboost as xgb model = xgb.XGBClassifier(n_estimators=500, max_depth=4, learning_rate=0.05, eval_metric='logloss', early_stopping_rounds=20) model.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], verbose=False) print(model.best_iteration, model.best_score) |
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 31 32 | import numpy as np, pandas as pd, lightgbm as lgb from sklearn.model_selection import train_test_split # LightGBM は category 型の列をそのまま (one-hot にせず) 扱える。 # ただし列名で指定するので DataFrame が要る。X_train は数値だけの # ndarray なので categorical_feature=['region'] を渡すと TypeError になる。 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 都道府県コード (R01000 → 1) から 8 地方区分を作る no = df['Code'].str[1:3].astype(int) region = pd.cut(no, bins=[0, 1, 7, 14, 23, 30, 35, 39, 47], labels=['北海道', '東北', '関東', '中部', '近畿', '中国', '四国', '九州沖縄']) Xc = pd.DataFrame({'A1101': df['A1101'].astype(float), # 総人口 'B4101': df['B4101'].astype(float), # 年平均気温 'region': region.astype('category')}) # ← カテゴリ列 aging = df['A1303'] / df['A1101'] * 100 yc = (aging >= aging.median()).astype(int) Xc_tr, Xc_va, yc_tr, yc_va = train_test_split( Xc, yc, test_size=0.3, random_state=42, stratify=yc) model = lgb.LGBMClassifier(n_estimators=500, learning_rate=0.05, min_child_samples=3, verbose=-1) model.fit(Xc_tr, yc_tr, categorical_feature=['region'], eval_set=[(Xc_va, yc_va)], callbacks=[lgb.early_stopping(50, verbose=False), lgb.log_evaluation(0)]) print('特徴量 :', list(Xc.columns)) print('feature_importances_:', model.feature_importances_) print('best_iteration :', model.best_iteration_) |
MLの予測結果を、 統計検定で「ベースラインより有意に良いか」確かめたい場面では scipy.stats が活躍。
1 2 3 4 5 | from scipy import stats # 2つのモデルの CV スコア(5回ずつ)を Wilcoxon 検定で比較 scores_a = [0.82, 0.85, 0.83, 0.84, 0.86] scores_b = [0.78, 0.80, 0.79, 0.81, 0.80] print(stats.wilcoxon(scores_a, scores_b)) |
テーブルデータでも、 特徴量が多くなったら PyTorch でカスタムNNを書く価値があります。
1 2 3 4 5 6 7 8 9 10 | import torch, torch.nn as nn torch.manual_seed(0) # 実行のたびに同じ結果が出るようにする class MLP(nn.Module): def __init__(self, d): super().__init__() self.net = nn.Sequential(nn.Linear(d, 64), nn.ReLU(), nn.Dropout(0.3), nn.Linear(64, 1)) def forward(self, x): return self.net(x).squeeze(-1) model = MLP(d=10) |
🎯 このコードでやること: SSDSE-B-2026 の総人口 (A1101) を説明変数、 65歳以上人口 (A1303) を目的変数にして、 訓練 80% / テスト 20% に分割した上で線形回帰の fit → predict → score を実行する。
📥 入力データ (SSDSE-B-2026 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] # 最新年(2023)の47都道府県 X = df[['A1101']] # 総人口 (説明変数) y = df['A1303'] # 65歳以上人口 (目的変数) X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42) model = LinearRegression().fit(X_tr, y_tr) y_pred = model.predict(X_te) print(f'係数: {model.coef_[0]:.3f}') print(f'切片: {model.intercept_:.0f}') print(f'RMSE: {np.sqrt(mean_squared_error(y_te, y_pred)):.0f}') print(f'R^2 : {r2_score(y_te, y_pred):.4f}') |
📤 実行例:
💬 結果の読み方: R²=0.961 は説明力が極めて高い。 RMSE 約 187,801 (人)。 係数 0.262 は「総人口が 1 万人増えると 65歳以上人口が約 2,620 人増える」と解釈できる。
🎯 このコードでやること: 47 都道府県という小サンプルでも汎化誤差を信頼できる形で推定するために、 5-fold 交差検証で R² の平均と分散を出す。
📥 入力データ: 例 1 の X, y をそのまま流用 (47 行 × 1 列)。
1 2 3 4 5 6 | from sklearn.model_selection import cross_val_score from sklearn.linear_model import LinearRegression scores = cross_val_score(LinearRegression(), X, y, cv=5, scoring='r2') print(f'各 fold の R^2: {[f"{s:.3f}" for s in scores]}') print(f'平均 R^2 ± 標準偏差: {scores.mean():.3f} ± {scores.std():.3f}') |
📤 実行例:
💬 結果の読み方: 5 fold すべてで R² ≧ 0.92 と安定。 単一の train/test split に頼らず、 「どの 9〜10 県をテストにしても説明力が高い」ことが示せた。 これが「過学習していない」根拠になる。
🎯 このコードでやること: 標準化 → 線形回帰の流れを Pipeline でカプセル化し、 leakage を防ぎつつ複数指標 (A1101=総人口, B4101=年平均気温) を入力にした重回帰を行う。
📥 入力データ: A1101 (総人口、 人) と B4101 (年平均気温、 ℃) はスケールが大きく異なるため、 標準化を挟む。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score X2 = df[['A1101', 'B4101']] # 総人口 + 年平均気温 y2 = df['A1303'] # 65歳以上人口 pipe = Pipeline([ ('scaler', StandardScaler()), ('reg', Ridge(alpha=1.0)), ]) cv_r2 = cross_val_score(pipe, X2, y2, cv=5, scoring='r2') print(f'Pipeline R^2 (5-fold): {cv_r2.mean():.4f} ± {cv_r2.std():.4f}') |
📤 実行例:
💬 結果の読み方: 説明変数を 1 個 (総人口) → 2 個 (総人口 + 気温) に増やしても R² は 0.952 → 0.951 とほぼ横ばい。 気温は 65歳以上人口の説明力をほとんど持たないためで、 「無関係な特徴量を足しても精度は上がらない」good 例。 Ridge の正則化 ($\lambda=1$) で過学習を抑制し、 Pipeline 化により標準化パラメタが訓練データのみで計算される (= leakage 防止)。
🎯 このコードでやること: 多項式次数を 1 → 10 に増やし、 訓練誤差は単調減少するが汎化誤差は U 字を描く「過学習」の典型挙動を SSDSE で再現する。
📥 入力データ: X=A1101 (総人口)、 y=A1303 (65歳以上人口)。 47 都道府県全件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import numpy as np X_tr, X_te, y_tr, y_te = train_test_split(X / 1_000_000, y, test_size=0.3, random_state=0) # X は百万人単位に変換 (数値安定化) for d in [1, 2, 3, 5, 8, 10]: m = make_pipeline(PolynomialFeatures(d), LinearRegression()).fit(X_tr, y_tr) rmse_tr = np.sqrt(mean_squared_error(y_tr, m.predict(X_tr))) rmse_te = np.sqrt(mean_squared_error(y_te, m.predict(X_te))) print(f'次数={d:2d} train_RMSE={rmse_tr:>9.0f} test_RMSE={rmse_te:>9.0f}') |
📤 実行例:
💬 結果の読み方: 次数 1→2 は訓練・テスト両方が改善 (underfit 脱出)。 次数 3 以降はテスト RMSE が増加し過学習に転じる (高次項が東京などの外れ値に過剰反応)。 教科書通り「次数 2」が最適点。
機械学習の基礎は 3 学習タイプ (教師あり/教師なし/強化学習) と、 汎化 (generalization) の概念で整理できる。 ここでは sklearn で教師あり・教師なしを 1 コードで概観し、 cross_val_score で汎化性能を測る。 数式を言葉で読み解くと「訓練データへの当てはまりではなく、 未知データへの予測精度を最大化する」。 SSDSE-B-2026 を用いて「総人口で65歳以上人口を予測」する単純例で示す。
このコードでやること:SSDSE-B-2026 の都道府県の総人口 (A1101) と 65歳以上人口 (A1303) を読み、 線形回帰 (教師あり) と KMeans クラスタリング (教師なし) を実行、 さらに 5-fold cross validation で汎化 R² を計測する。
📥 入力データ (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.cluster import KMeans from sklearn.model_selection import cross_val_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] X = df[['A1101']].values # 総人口 y = df['A1303'].values # 65歳以上人口 # 教師あり: 線形回帰 + 5-fold CV で汎化評価 lr = LinearRegression() scores = cross_val_score(lr, X, y, cv=5, scoring='r2') print(f'CV R^2 mean = {scores.mean():.3f} std = {scores.std():.3f}') # 教師なし: KMeans で 3 クラスタに分け、都市規模ラベルに見立てる km = KMeans(n_clusters=3, random_state=0, n_init=10).fit(X) print('cluster sizes:', pd.Series(km.labels_).value_counts().to_dict()) |
📤 実行すると次の出力が得られる:
💬 結果の読み方: cross_val_score の R² 平均 0.952 は「訓練 R² ではなく未知データに対する性能」で、 過学習していないことを示す。 std=0.020 と分散が小さく、 fold 間で安定。 KMeans 結果は東京が単独クラスタになる典型的な外れ値挙動で、 機械学習の前処理で「外れ値除外」を判断する材料になる。 統計学なら同じ問題を「最小二乗推定量の標準誤差」で扱うが、 機械学習では cross validation の R² の分散で扱うのが流儀の違い。
機械学習の中核問題。 訓練データだけで完璧に予測できても、 未知データで失敗するモデルは無価値。
原因:(1) モデルが複雑すぎる、 (2) 訓練データが少なすぎる、 (3) ノイズに過剰適合、 (4) 特徴量が多すぎる(次元の呪い)。
| 状態 | 訓練誤差 | 検証誤差 | 対策 |
|---|---|---|---|
| 未学習 | 高 | 高 | モデル複雑化、 特徴量増、 学習時間延長 |
| 良好 | 低 | 低 | そのまま |
| 過学習 | 低 | 高 | 正則化、 データ増、 早期停止、 シンプル化 |
予測誤差は数学的に 3 成分に分解できます:
$$ \mathbb{E}[(y - \hat{f}(\boldsymbol{x}))^2] = \underbrace{(\mathbb{E}[\hat{f}] - f)^2}_{\text{Bias}^2} + \underbrace{\mathrm{Var}(\hat{f})}_{\text{Variance}} + \underbrace{\sigma^2_\varepsilon}_{\text{Noise}} $$
これがいわゆるバイアス-バリアンスのトレードオフ。 モデルを複雑にすれば バイアス↓ だが バリアンス↑。 シンプルにすれば バイアス↑ だが バリアンス↓。 最適は両者の和が最小になる点。
「予測 $\hat{y}$ と正解 $y$ のズレ」を測る関数。 機械学習は損失を最小化する最適化問題として定式化されます。
| タスク | 損失 | 公式 |
|---|---|---|
| 回帰 | MSE | $\frac{1}{n}\sum (y_i - \hat{y}_i)^2$ |
| 回帰(ロバスト) | MAE、 Huber | $\frac{1}{n}\sum |y_i - \hat{y}_i|$ |
| 2値分類 | クロスエントロピー(Log Loss) | $-\sum [y \log \hat{p} + (1-y)\log(1-\hat{p})]$ |
| 多クラス分類 | Categorical Cross-Entropy | $-\sum_k y_k \log \hat{p}_k$ |
| SVM | ヒンジ損失 | $\max(0, 1 - y \hat{f})$ |
| ランキング | Pairwise / NDCG 損失 | 専用 |
勾配降下法で損失を最小化します。 学習率 $\eta$、 勾配 $\nabla L$ で:$\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \eta \nabla L$。
モデル学習前に決める「設定値」。 学習中に最適化されるパラメータ(重み $\boldsymbol{w}$ など)と区別。 例:
ハイパラ探索手法:
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 31 32 33 | from sklearn.model_selection import (GridSearchCV, RandomizedSearchCV, cross_val_score) from sklearn.ensemble import RandomForestClassifier # 探索したいハイパーパラメータ。辞書の波かっこは 1 個。 # {{...}} と書くと「集合の中に辞書」になり unhashable type: 'dict' で落ちる。 param_grid = { 'n_estimators': [100, 200, 500], 'max_depth': [3, 5, 10, None], 'min_samples_split': [2, 5, 10] } gs = GridSearchCV(RandomForestClassifier(random_state=0), param_grid, cv=5, scoring='f1') gs.fit(X_train, y_train) print('GridSearch best:', gs.best_params_, round(gs.best_score_, 4)) # Optuna でベイズ最適化 (グリッドと違い連続的に探索できる) import optuna optuna.logging.set_verbosity(optuna.logging.WARNING) def objective(trial): params = { 'n_estimators': trial.suggest_int('n_estimators', 50, 300), 'max_depth': trial.suggest_int('max_depth', 2, 32), } clf = RandomForestClassifier(random_state=0, **params) return cross_val_score(clf, X_train, y_train, cv=5, scoring='f1').mean() study = optuna.create_study(direction='maximize', sampler=optuna.samplers.TPESampler(seed=0)) study.optimize(objective, n_trials=10) print('Optuna best :', study.best_params, round(study.best_value, 4)) |
「複数のハイパラ設定をテストデータで評価し、 最も良いものを選ぶ」のは典型的なデータリーク。 テストデータが間接的に学習に使われ、 報告する精度が楽観バイアスを持ちます。 対策は train / valid / test の 3分割 または nested CV。 validで選び、 testは最後に1度だけ評価。 Kaggle で「ローカル CV と public LB の差が大きい」現象も、 多くはこれが原因。
StandardScaler().fit_transform(X_all) → 分割、 は テストデータの平均・分散が学習に漏れる 古典的バグ。 必ず train で fit してtestには transform のみ。 scikit-learn の Pipeline + cross_val_score を使えば自動的に正しい順序で実行される。 これは時系列CVでも同じ。
陽性率 1% のデータで「全て陰性」と予測するモデルでも accuracy = 99%。 一見高精度に見えても完全に無能。 不均衡データでは F1, AUC-ROC, AUC-PR, balanced accuracy を使う。 また、 訓練時には class_weight='balanced' や SMOTE / undersampling を検討。 業務指標(コストマトリクス)に直結する評価軸を選ぶことが大事。
時系列で train_test_split(shuffle=True) を使うと、 未来の情報で過去を予測するという「タイムトラベル」が発生し、 精度が異常に高く見える。 必ず TimeSeriesSplit や Walk-Forward Validation を使い、 train は test より時間的に前のデータだけにする。 同様の問題は「同じユーザーが train/test 両方に出る」場合にも発生し、 GroupKFold が必要。
本番運用では、 推論速度・モデルサイズ・解釈性・公平性(fairness)・データドリフト耐性も同じくらい重要。 例:医療診断 AI で AUC が高くても、 黒人患者に対する性能が極端に低い場合、 倫理的に運用できない。 「精度シングルメトリック思考」を脱却し、 多次元評価ダッシュボードを作るのがプロの態度です。
論文ベンチで SOTA な Transformer も、 中小企業の 1万行テーブルデータでは XGBoost に負けることが多い。 まずはベースライン(線形回帰・決定木)から始め、 段階的に複雑化するのが鉄則。 各段階で「複雑化のコスト(学習時間・解釈不能性)」と「精度向上」を天秤にかける。 Occam's Razor は ML でも有効です。
「深層学習は特徴量を自動的に学ぶ」は画像・音声・自然言語では真。 しかしテーブルデータでは人間の知識による特徴設計(比率・差分・対数変換・カテゴリ変数の集約・時間ラグ等)が予測精度に最も効きます。 ドメイン知識を持つ人と協働するのが、 結局のところ最強の戦略です。
機械学習基礎を中心に、 教師あり (回帰/分類)・教師なし (クラスタリング/次元削減)・強化学習の 3 大分類と、 訓練/検証/テスト分割、 過学習・汎化、 損失関数・最適化を整理した概念マップ。
機械学習の基礎は (1) 訓練/検証/テスト分割、 (2) 汎化誤差の評価、 (3) 過学習対策の 3 本柱で構成される。 SSDSE-B-2026 で県別の総人口 → 65歳以上人口を予測するモデルを組むなら、 47 件を 80/20 で分割し交差検証する。
機械学習基礎は単独の手法ではなく、 上流のデータ準備 (欠損処理・特徴量設計)、 並列の教師あり/教師なし/強化学習、 下流の評価 + デプロイ + 監視という ML プロジェクトの全工程を貫通する基盤概念群。 各概念が他の用語の前提となる。 ここでは「接続 (前後の流れ)」「統合 (組合せ運用)」「比較 (代替手段との違い)」の 3 視点で隣接手法を整理する。
| 視点 | 機械学習基礎 | 統計モデリング | 深層学習 |
|---|---|---|---|
| 主目的 | 予測精度の最大化 | パラメタ推定と仮説検定 | 表現学習 (画像/音声/言語) |
| モデル前提 | データ駆動で柔軟 | 分布・線形性等を明示 | 大量データで非線形を学習 |
| 解釈性 | 中 (アルゴリズム依存) | 高 (係数の意味が明確) | 低 (要 SHAP/Attention) |
| 必要データ量 | 中 (千〜万) | 少 (百〜千) | 多 (万〜億) |
| 代表例 | RF / SVM / 勾配ブースティング | 線形回帰 / GLM / ANOVA | CNN / Transformer / LLM |
SSDSE-B-2026 で機械学習基礎を一気通貫で学ぶなら、 上流で 47 県データを訓練 35 / テスト 12 に分割、 中段で線形回帰・決定木・SVM を学習、 下流で交差検証 + 混同行列で評価、 さらに SHAP で解釈、 という流れが教科書フロー。
過学習を防ぐ最も基本的な手法。 損失関数に「モデルの複雑さペナルティ」を加える:
$$ L_{\text{total}} = L_{\text{data}} + \lambda \Omega(\boldsymbol{w}) $$
詳細は regularization グループ、 Ridge、 LASSO。
| ❌ 誤解 | ✅ 正しい理解 |
|---|---|
| 訓練データの精度が高ければ良いモデル | 過学習を疑う。 検証データ・テストデータで評価必須 |
| 複雑なモデルほど良い | バリアンスが増え、 汎化性能が下がる |
| ハイパラ調整はテストデータでやる | データリーク。 検証データ or CV を使う |
| 機械学習=何でも学習できる | 良いデータ・特徴量・問題設計が前提 |
| 教師なし学習は教師ありの劣化版 | 役割が違う。 探索・発見のための強力な道具 |
| 特徴量は機械的に作れば良い | ドメイン知識に基づく特徴量エンジニアリングが性能に直結 |
| 深層学習なら常に最強 | テーブルデータでは GBM(XGBoost等)が勝つことが多い |
過学習の典型例。 対策:(1) モデル複雑度を下げる(決定木なら深さ制限)、 (2) 正則化を強める、 (3) 訓練データを増やす、 (4) 特徴量を減らす、 (5) Early Stopping、 (6) アンサンブル化(バギング等)、 (7) クロスバリデーションで安定性確認。
必ずしも。 確認事項:(1) 解釈性が必要なら LR の方が良い、 (2) 本番推論時間を考慮、 (3) 標準偏差も見る(0.85±0.05 vs 0.72±0.01 なら微妙)、 (4) ドメイン知識から見て予測根拠が妥当か、 (5) 過学習していないか。 ML は「精度だけ」ではなく実務制約を含めて判断。
モデルは平均的には正しい答えに近い予測をするが、 訓練データが変わると予測が大きく揺れる。 つまり過学習傾向。 対策:シンプルなモデル、 正則化、 データ増加、 アンサンブル(特にバギングはバリアンスを下げる)。
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 | # ── この抜粋で使うデータを用意します(英字の項目コードで読み込み)── import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=0) df = df[df['Code'].astype(str).str.match(r'^R\d{5}$', na=False)].copy() for _c in df.columns[3:]: df[_c] = pd.to_numeric(df[_c], errors='coerce') df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()] import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.cluster import KMeans from sklearn.model_selection import cross_val_score # 前処理... X = df[['L322101','L322108','L322102']].values # 家計3項目 X_std = StandardScaler().fit_transform(X) # 教師あり:東日本/西日本 を予測 # y = ... # scores = cross_val_score(LogisticRegression(), X_std, y, cv=5, scoring='f1') # 教師なし:47県を3クラスタに km = KMeans(n_clusters=3, random_state=42, n_init=10).fit(X_std) print(km.labels_) |
「教師あり 2値分類タスク(n=1500、 陽性比率 12%)に対し、 Logistic Regression、 Random Forest、 XGBoost を比較。 train/valid/test = 60/20/20 で分割(stratify)。 検証データでハイパラを Optuna で 100 trial 探索後、 5-fold CV による評価:XGBoost AUC=0.87±0.02、 RF=0.84±0.02、 LR=0.78±0.01。 最終テストでは XGBoost が AUC=0.86、 F1=0.62。 バイアス・バリアンス的に XGBoost は他より高いバリアンスが疑われたため、 アーリーストッピング適用。」
ML 基礎概念の理解順序は、 (1) ラベルの有無で教師あり/なし/強化の分類、 (2) 出力の型で回帰/分類/クラスタリング、 (3) モデル複雑度とデータ量のバランス、 で組み立てる。 まず基本概念を押さえてから具体アルゴリズムへ進むのが効率的。
初学者は SSDSE-B-2026 の県別データで「総人口から65歳以上人口を予測」というシンプルな回帰問題から始めるのが推奨。 線形回帰 → ランダムフォレスト → XGBoost の順で RMSE を比較し、 各段階で「過学習が起きていないか」「特徴量の重要度はどうか」を確認するルーチンを身につける。
スライダーでモデルの複雑度(多項式の次数)を動かし、 機械学習の基本ワークフロー データを訓練/テストに分割 → モデルを訓練 → テストで評価 を体感します。 データは真の関数(薄い灰色の破線)にノイズを加えて生成し、 青=訓練データ と 橙=テストデータ に分けています。 次数を上げると訓練誤差はどこまでも下がりますが、 テスト誤差は「未学習 → 適切 → 過学習」のU字を描きます。 計算は最小二乗法(正規方程式)で正確に行っています。
凡例: ●訓練 / ●テスト / - - 真の関数 / ●最良の次数(テスト誤差最小)。 右のグラフはドラッグ/タップでも次数を選べます。
機械学習とは 「観測した (x, y) から背後の規則 y=f(x) を学び、 未知の x に適用する」 こと。 次数を上げるほどモデルは訓練点を細かくなぞれますが、 それは「規則」ではなく「たまたまのノイズ」まで暗記しているだけかもしれません。 本当に価値があるのは、 まだ見ていないテストデータで当たること=汎化です。 スライダーを 0 → 3 → 9 と動かし、 当てはめ曲線が「なだらか → ちょうど良い → うねうね」と変わる様子と、 右の学習曲線でテスト誤差が下がってから再び上がるバイアス-バリアンスのU字を見比べてください。
本ページはここまで「3 大パラダイム・ERM・過学習・train/valid/test」という手続きを扱ってきました。 この深化セクションでは一段掘り下げ、 そもそもなぜ有限のデータから未知のデータへ一般化できるのかという原理的な問い — 帰納バイアス (inductive bias) — を、 SSDSE-B-2026 の実測値 (n=47) を使った LOOCV 実験で検証します。 姉妹ページ (過学習・バイアス-バリアンス) が「複雑度の調整」を扱うのに対し、 ここでは「モデルが暗黙に置いている仮定そのもの」に光を当てます。
47 個の点がどんなに綺麗に直線に乗っていても、 「48 個目も直線に乗る」ことは論理的には保証されません (ヒュームの帰納の問題)。 それでも機械学習が機能するのは、 各モデルが世界に対する仮定 = 帰納バイアスを持ち込んでいるからです。
ノーフリーランチ定理 (Wolpert, 1996) はこれを定理の形で述べたものです:「あり得る全ての問題にわたって平均すると、 どの学習アルゴリズムの性能も同じ」。 つまり万能のモデルは存在せず、 うまくいくのは「そのデータの生成構造に合った帰納バイアスを選べた時」だけ。 モデル選択とは、 実は「データにどの仮定を貸し与えるかの選択」なのです。
SSDSE-B-2026 の 2023 年・47 都道府県で、 65歳以上人口 (A1303) → 死亡数 (A4200) を予測してみます (相関係数 r = 0.999 のほぼ線形な関係。 例:東京都は 65歳以上 3,205,000 人・死亡 137,241 人、 鳥取県は 179,000 人・8,290 人)。 3 つの帰納バイアスを LOOCV (leave-one-out 交差検証:n=47 と小さいため、 1 県を抜いて残り 46 県で学習を 47 回繰り返す) で比較した実測結果:
| モデル (帰納バイアス) | 訓練 RMSE (人) | LOOCV RMSE (人) | 判定 |
|---|---|---|---|
| 平均値予測 (ベースライン) | — | 29,397 | 基準 |
| 線形回帰 (大域直線) | 1,266 | 1,370 | ✅ 仮定がデータ構造と一致 |
| 1-NN (局所性) | 0 | 5,646 | △ 訓練誤差 0 は暗記の証拠 |
| 9 次多項式 (高自由度) | 1,068 | 700,862 | ❌ 崩壊 |
ここに 3 つの重要な落とし穴が凝縮されています:
📝 なお「65歳以上人口→死亡数」で線形回帰の傾きは 0.0419 (切片 1,234 人)。 「高齢者のおよそ 4.2% が年間に亡くなる」という人口学的に解釈可能な構造があるからこそ、 線形という強い仮定が当たった — 帰納バイアスの選択はドメイン知識の反映でもあります。