コンテンツにスキップ

5.1.2 機械学習とは何か

機械学習モデリングの閉ループ図

このページを終えたら、この evidence card を残します。

ML 問題
教師あり、教師なし、評価、または特徴量エンジニアリングのタスク
ベースライン
まずは最も簡単な sklearn/モデリングループと固定の train/test 分割
出力
prediction、metric、chart、またはmodel decision note
失敗確認
データリーク、不明確なターゲット、弱いベースライン、または指標不一致
期待される成果
指標と1件の失敗観察を含む最小限のMLループ

この節は、あなたが機械学習に正式に入る最初の一歩です。大事なのは定義を暗記することではなく、機械学習と従来のプログラミングの違いを理解し、「問題の種類 → データの形 → 学習方法」を見分ける考え方を身につけることです。これが、この後の教師あり学習、教師なし学習、モデル評価の土台になります。

  • 機械学習とは何か、そして従来のプログラミングとの違いを理解する
  • 機械学習の3つの大分類(教師あり学習、教師なし学習、強化学習)を身につける
  • 機械学習の全体のワークフローを理解する
  • 正しい ML の考え方を身につける

このページでいちばん大切なのは、定義を丸暗記することではなく、まず判断のための枠組みを作ることです。

機械学習タスクの種類を判断する図

この図が理解できると、第5章の多くの節が一気に分かりやすくなります。

機械学習の最初の判断漫画

この漫画は、最初の判断チェックリストとして使えます。ルールを明確に書けるなら通常のプログラムで十分かもしれません。規則が多くの事例の中に隠れているなら、機械学習が役立ちます。そのうえで、ラベルがあるか、出力がカテゴリか数値か、評価指標で本当に有用性を示せるかを確認します。


機械学習 = 人間がルールを書き込むのではなく、コンピュータがデータから規則を自動で見つけること。

従来のプログラミング vs 機械学習

Section titled “従来のプログラミング vs 機械学習”
flowchart LR
subgraph 従来のプログラミング
R1["人間がルールを書く"] --> P1["プログラム"]
D1["データ"] --> P1
P1 --> O1["出力"]
end
subgraph 機械学習
D2["データ"] --> ML["機械学習アルゴリズム"]
O2["期待される出力"] --> ML
ML --> R2["自動で学習したルール(モデル)"]
end
style R1 fill:#fff3e0,stroke:#e65100,color:#333
style R2 fill:#e8f5e9,stroke:#2e7d32,color:#333
従来のプログラミング機械学習
入力ルール + データデータ + 期待される出力
出力結果ルール(モデル)
向いている場面ルールが明確な場合(例:税額計算)ルールを表しにくい場合(例:猫の識別)
書き方人が if-else のロジックを書くアルゴリズムがデータから自動で学習する

人間がルールをうまく説明できないタスクがあります。

# 従来のプログラミング:メールが迷惑メールか判定する
def is_spam_traditional(email):
if "無料" in email:
return True
if "当選" in email:
return True
if "クリックして受け取る" in email:
return True
# ... まだまだルールはある? 永遠に書き切れない!
return False
# 機械学習:10万件のラベル付きメールをモデルに学習させる
# model.fit(emails, labels)
# model.predict(new_email) → 自動で判定

機械学習が向いている場面:

  • ルールが複雑、または不明な場合(画像認識、音声認識)
  • ルールが変化する場合(推薦システム、不正検知)
  • データ量が多く、人手で分析しきれない場合
  • 個別最適化された結果が必要な場合

機械学習を学び始めたら、まず何をつかむべきか?

Section titled “機械学習を学び始めたら、まず何をつかむべきか?”

最初に押さえるべきなのは「モデルには何種類あるか」ではなく、この一文です:

機械学習は、手書きのルールをデータで置き換える技術です。

この考え方をつかむと、次のようなことが判断しやすくなります。

  • いつ従来のプログラミングで十分か
  • いつモデルに学習させるべきか
  • なぜデータの質がモデルの限界を直接決めるのか

初心者が早めにほどいておきたい用語

Section titled “初心者が早めにほどいておきたい用語”
用語何を意味するかこの章でなぜ重要か
MLMachine Learning の略図、ファイル名、プロジェクトメモで何度も出てきます
model学習されたルールや関数学習後に保存され、再利用され、予測に使われるものです
algorithm学習方法決定木、ロジスティック回帰、K-Means は学習前にはアルゴリズムです
trainingデータから学ぶ処理コードでは多くの場合 fit を呼んだときに起こります
inference学習済みモデルを新しいデータに使うことsklearn では predictpredict_proba として現れます
baseline最初に超えるべき一番単純な結果後の改善が本物か、偶然かを判断する基準になります
metric成功を測るものさしAccuracy、F1、MAE、RMSE はそれぞれ違う評価の問いに答えます

初心者にとって特に大切なのは、algorithmmodel の違いです。アルゴリズムは学習のレシピで、モデルはそのレシピがデータを見たあとに得られる学習済みの結果です。


flowchart TD
ML["機械学習"]
ML --> SL["教師あり学習<br/>Supervised Learning"]
ML --> UL["教師なし学習<br/>Unsupervised Learning"]
ML --> RL["強化学習<br/>Reinforcement Learning"]
SL --> CL["分類<br/>(メール→迷惑/正常)"]
SL --> RG["回帰<br/>(特徴→住宅価格予測)"]
UL --> CLU["クラスタリング<br/>(顧客のグループ分け)"]
UL --> DR["次元削減<br/>(データ圧縮)"]
RL --> G["ゲームAI"]
RL --> RO["ロボット制御"]
style SL fill:#e3f2fd,stroke:#1565c0,color:#333
style UL fill:#fff3e0,stroke:#e65100,color:#333
style RL fill:#e8f5e9,stroke:#2e7d32,color:#333

教師あり学習——“正解”がある

Section titled “教師あり学習——“正解”がある”

核心:入力と出力が対になった大量のデータを使って、対応関係を学習します。

種類出力
分類離散的なカテゴリメール→迷惑/正常、画像→猫/犬
回帰連続値面積→住宅価格、特徴→気温
# 教師あり学習のデータ形式
# X(特徴/入力) y(ラベル/出力)
# [面積, 部屋数, 階数] → 住宅価格
# [120, 3, 15] → 350万円
# [80, 2, 8] → 220万円
# [200, 4, 20] → 580万円

重要:学習データにはラベル(正解)が必要です。モデルの目的は、X から y を予測できるようになることです。

ある問題が教師あり学習か、すぐ見分けるには?

Section titled “ある問題が教師あり学習か、すぐ見分けるには?”

自分にこう聞いてみましょう。

  • 「入力 → 正しい出力」の組みになったデータを持っているか?

もしあるなら、たいてい教師あり学習です。 次にこう考えます。

  • 出力はカテゴリか、それとも連続値か?

すると自然に次の2つに分かれます。

  • 分類
  • 回帰

教師なし学習——“正解”がない

Section titled “教師なし学習——“正解”がない”

核心:入力データだけがあり、ラベルはありません。モデルがデータの中の構造やパターンを自分で見つけます。

種類何をするか
クラスタリング似ているデータをまとめる顧客のグループ分け、ニュースの分類
次元削減特徴量の数を減らすPCA(第4章で学習済み)
異常検知異常なデータを見つけるクレジットカード不正検知
# 教師なし学習のデータ:ラベルなし
# X(特徴)
# [支出額, 購入頻度, 最終購入日]
# [500, 10, 3日前]
# [50, 2, 30日前]
# [1000, 20, 1日前]
# → モデルが自動で「高価値顧客」「低頻度顧客」などのグループに分ける

教師なし学習で誤解しやすい点

Section titled “教師なし学習で誤解しやすい点”

初心者は、教師なし学習を「機械が勝手に本当の答えを見つけるもの」と考えがちです。 でも、より正確にいうと次の通りです。

  • モデルは、ひとつのあり得る構造を見つける手助けをする
  • ただし、その構造にビジネス上の価値があるかどうかは、最後に人が解釈する必要がある

なので教師なし学習では、「結果を出すこと」と同じくらい「結果をどう説明するか」が大切です。

強化学習——“試行錯誤”で学ぶ

Section titled “強化学習——“試行錯誤”で学ぶ”

核心:エージェント(Agent)が環境の中で行動し、報酬や罰則をもとに方針を調整します。

要素説明
エージェント意思決定を行う AI
環境エージェントがいる世界
状態いまの環境情報
行動エージェントが取れる選択
報酬行動のあとに得られるフィードバック
# 強化学習のイメージ:子犬のしつけ
# 状態:子犬が見ている環境
# 行動:座る / 立つ / 握手する
# 報酬:うまくできた → おやつ(+1)、失敗した → なし(0)
# 何度も試行錯誤するうちに、子犬は正しい行動を学ぶ
教師あり学習教師なし学習強化学習
データにラベルがある?あるない報酬信号がある
目的ラベルを予測する構造を見つける報酬を最大化する
代表的なアルゴリズム線形回帰、決定木K-Means、PCAQ-Learning、PPO
AI の応用画像分類、翻訳顧客のグループ分け、推薦ゲーム AI、ロボット

flowchart TD
A["1. 問題定義<br/>何を解決したいのか?"] --> B["2. データ収集<br/>関連データを集める"]
B --> C["3. データ前処理<br/>クリーニング、特徴量エンジニアリング"]
C --> D["4. モデル選択<br/>線形回帰? 決定木?"]
D --> E["5. モデル学習<br/>学習データで当てはめる"]
E --> F["6. モデル評価<br/>テストデータで検証する"]
F --> G{"結果は十分?"}
G -->|"まだ足りない"| H["7. 調整<br/>パラメータ調整、モデル変更"]
H --> D
G -->|"十分"| I["8. デプロイ<br/>実際の予測に使う"]
style A fill:#e3f2fd,stroke:#1565c0,color:#333
style E fill:#fff3e0,stroke:#e65100,color:#333
style I fill:#e8f5e9,stroke:#2e7d32,color:#333

この流れは、初心者向けにこう言い換えられます。

まず問題を決め、データを準備し、動くものを作り、結果を見て、少しずつ改善する。

これが、実は第5章全体の土台になる考え方です。

ML でとても重要な考え方のひとつは、学習データでモデルを評価してはいけないということです。

import numpy as np
# データセットのシミュレーション
rng = np.random.default_rng(seed=42)
n = 100
X = rng.normal(size=(n, 3))
y = rng.integers(0, 2, n)
# 通常は 80% を学習、20% をテストに使う
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print(f"学習データ: {X_train.shape[0]} 件")
print(f"テストデータ: {X_test.shape[0]} 件")

期待される出力:

Terminal window
学習データ: 80 件
テストデータ: 20 件
flowchart LR
D["全データ<br/>100件"]
D -->|"80%"| TR["学習データ<br/>80件<br/>モデルの学習に使う"]
D -->|"20%"| TE["テストデータ<br/>20件<br/>モデル評価に使う"]
style TR fill:#e3f2fd,stroke:#1565c0,color:#333
style TE fill:#e8f5e9,stroke:#2e7d32,color:#333

学習・検証・テストとデータ漏えいのガードレール図

この図を読むときは、まず3つの境界線に注目してください。学習データは学習に使い、検証データは方針選びに使い、テストデータは最後の評価だけに使います。もし、途中の処理でテストデータの情報を先に見てしまうと、たとえば全データで先に標準化したり、全データで先に特徴量を選んだりして、モデルの点数が「見かけ上高く」なってしまうことがあります。

初心者がやりがちな落とし穴:「学習できた」を「覚えた」と勘違いする

Section titled “初心者がやりがちな落とし穴:「学習できた」を「覚えた」と勘違いする”

機械学習でとても大事な分かれ道はここです。

  • 学習データでうまくいくからといって、本当に規則を学べたとは限らない
  • 単に学習データを覚えているだけのこともある

だからこの節から、次の習慣を持つようにしましょう。

  • 高いスコアを見たら、まず「それは学習データのスコア? テストデータのスコア?」と確認する

コードを読む前に、まず全体の流れを見ておきましょう。

最小の機械学習プロジェクトの流れ

この図は、最小限でも役に立つ ML プロジェクトの形です。問題を決め、Xy を用意し、モデルを学習し、指標で評価し、次に何を改善するかを決めます。下のコードはあえて小さくしています。各行を図のステップに対応づけながら読めるようにするためです。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 1. データを読み込む
iris = load_iris()
X, y = iris.data, iris.target
print(f"データセット: {X.shape[0]} 件のサンプル, {X.shape[1]} 個の特徴量, {len(set(y))} 個のカテゴリ")
# 2. 学習データとテストデータに分ける
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. モデルを選んで学習する
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train) # 学習!
# 4. 予測して評価する
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"テストデータの正解率: {accuracy:.1%}")

期待される出力:

Terminal window
データセット: 150 件のサンプル, 4 個の特徴量, 3 個のカテゴリ
テストデータの正解率: 100.0%

たった数行で、完全な ML プロジェクトが1つ完成します! これからの章で、各ステップを少しずつ深掘りしていきます。

もし ModuleNotFoundError: No module named 'sklearn' と表示されたら、先にこの章の依存ライブラリをインストールしてください。

Terminal window
python -m pip install --upgrade scikit-learn

ここで scikit-learn はインストールするパッケージ名で、sklearn は Python コードで import するモジュール名です。

コードは次の対応で読むと分かりやすくなります。

コードのキーワード意味なぜ重要か
load_iris()組み込みの練習用データセットを読み込むファイルをダウンロードせず、安全に最初の練習ができます
X特徴量行列、つまり入力の列モデルはこの値から規則を学びます
y目的変数、つまり正解ラベル教師あり学習では、学習のためにラベルが必要です
train_test_splitデータを学習用と確認用に分けるすでに見たデータでモデルを評価することを防ぎます
fitモデルを学習するここでアルゴリズムが学習済みモデルになります
predict学習済みモデルを新しい入力に使う実際のアプリで使う推論のステップです
accuracy_score正しく予測できた割合を計算するモデルの振る舞いを測れる数字に変えます
random_stateランダムな分割やモデルの乱数を固定する何度実行しても同じ結果になり、学習しやすくなります

用語英語意味
サンプルSample1件のデータ
特徴量Featureサンプルを表す属性(入力の各列)
ラベルLabel / Targetサンプルの”正解”(予測したい値)
学習データTraining Setモデルを学習させるためのデータ
テストデータTest Setモデルを評価するためのデータ
過学習Overfittingモデルが学習データを”暗記”してしまい、汎化能力が低いこと
未学習Underfittingモデルが単純すぎて、学習データすらうまく学べないこと
汎化Generalization新しいデータでもうまく動く能力
ハイパーパラメータHyperparameter人が設定する必要があるパラメータ(学習率、木の深さなど)
データ漏えいData leakageテストデータや未来情報が誤って学習に入り、スコアが実力以上に見えること
検証データValidation Set最終テストの前に、モデルやハイパーパラメータを選ぶためのデータ
flowchart LR
A["未学習<br/>モデルが単純すぎる<br/>直線で曲線データを当てはめる"]
B["ちょうどよい<br/>モデルの複雑さが適切<br/>規則をうまく当てはめる"]
C["過学習<br/>モデルが複雑すぎる<br/>ノイズまで当てはめる"]
style A fill:#ffebee,stroke:#c62828,color:#333
style B fill:#e8f5e9,stroke:#2e7d32,color:#333
style C fill:#ffebee,stroke:#c62828,color:#333
import matplotlib.pyplot as plt
rng = np.random.default_rng(seed=42)
x = np.linspace(0, 1, 20)
y = np.sin(2 * np.pi * x) + rng.normal(size=20) * 0.3
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
x_smooth = np.linspace(0, 1, 200)
# 未学習:1次多項式(直線)
coeffs = np.polyfit(x, y, 1)
axes[0].scatter(x, y, color='steelblue', s=40)
axes[0].plot(x_smooth, np.polyval(coeffs, x_smooth), 'r-', linewidth=2)
axes[0].set_title('未学習(直線)\n単純すぎて規則を捉えられない')
# ちょうどよい:3次多項式
coeffs = np.polyfit(x, y, 3)
axes[1].scatter(x, y, color='steelblue', s=40)
axes[1].plot(x_smooth, np.polyval(coeffs, x_smooth), 'r-', linewidth=2)
axes[1].set_title('ちょうどよい(3次多項式)\n規則をうまく当てはめている')
# 過学習:18次多項式
coeffs = np.polyfit(x, y, 18)
axes[2].scatter(x, y, color='steelblue', s=40)
y_overfit = np.polyval(coeffs, x_smooth)
y_overfit = np.clip(y_overfit, -3, 3)
axes[2].plot(x_smooth, y_overfit, 'r-', linewidth=2)
axes[2].set_title('過学習(18次多項式)\nノイズまで当てはめている')
axes[2].set_ylim(-3, 3)
for ax in axes:
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

要点説明
機械学習データから規則を学ぶこと
教師あり学習ラベルあり、予測を学ぶ(分類/回帰)
教師なし学習ラベルなし、構造を見つける(クラスタリング/次元削減)
強化学習試行錯誤で方針を学ぶ(報酬ベース)
基本の流れデータ → 前処理 → 学習 → 評価 → デプロイ
学習/テスト分割必ず分ける。過学習を防ぐため

この節で一番持ち帰ってほしいこと

Section titled “この節で一番持ち帰ってほしいこと”

もし一文だけ覚えるなら、これです。

機械学習の本当の出発点は、モデルを覚えることではなく、問題・データ・評価方法をきちんと対応づけることです。

この節で得てほしい最重要ポイントは次の通りです。

  • 教師あり学習と教師なし学習を区別できる
  • 分類と回帰を区別できる
  • なぜ学習データとテストデータを分ける必要があるか分かる
  • 第5章以降のアルゴリズムは、すべてこの地図の中にあると分かる

次のタスクが分類か回帰かを判断してください。

  1. 明日の気温を予測する
  2. 写真に人の顔があるかどうかを判定する
  3. ある株の明日の終値を予測する
  4. ニュースをスポーツ/テクノロジー/エンタメ/金融に分ける
  5. あるユーザーが離脱するかを予測する

scikit-learn の load_wine() データセットを使って決定木分類器を学習し、テストデータの正解率を出力してください。

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
wine = load_wine()
X_train, X_test, y_train, y_test = train_test_split(
wine.data, wine.target, test_size=0.2, random_state=42, stratify=wine.target
)
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
accuracy = model.score(X_test, y_test)
print(f"テスト精度:{accuracy:.3f}")

現在の sklearn では、期待される出力はおおよそ次のようになります。

Terminal window
テスト精度:0.944

sklearn のバージョンや分割設定が変わると、結果が少し変わることがあります。ここで大切なのは、データを読み込み、分割し、学習データだけで学習し、テストデータで評価する流れです。

4.3節の過学習の例を修正し、異なる次数の多項式(1, 3, 5, 10, 18)でデータを当てはめて、5枚のサブプロットを描き、複雑さが当てはまり方に与える影響を観察してください。

参考実装と解説
  1. 明日の気温と株価の終値は、予測対象が数値なので回帰です。顔の有無、ニュースカテゴリ、ユーザー離脱は、予測対象が離散ラベルなので分類です。
  2. load_wine() の演習では、教師あり学習の基本手順を守ります。特徴量とラベルを読み込み、学習前に train/test に分け、X_train, y_train だけで fit し、X_test, y_test で score します。この分割で 0.944 前後の精度は自然ですが、数値そのものよりテストデータを学習に漏らさないことが重要です。
  3. 1 次はたいてい単純すぎて underfitting し、3 次や 5 次は主な傾向を捉えやすく、10 次や 18 次はノイズまで追いかけることがあります。訓練データへの当てはまりだけでなく、検証/テスト誤差も見て複雑さを判断します。