Skip to content

3. 機械学習の基礎

第 3 回では、機械学習の基礎について学びます。前回までに学んだ Python の文法やデータ可視化の技術を活用しながら、機械学習における基本的な考え方や実践的な流れを理解していきましょう。

3.1 機械学習とは

3.1.1 機械学習の定義

機械学習(Machine Learning) とは、コンピュータがデータから自動的にパターンやルールを学習し、予測や判断を行う技術です。従来のプログラミングでは、人間が明示的にルールを記述する必要がありましたが、機械学習では、データから自動的にルールを見つけ出すことができます。

graph LR
    A[入力データ] --> C[プログラム<br/>ルール]
    B[人間が記述した<br/>ルール] --> C
    C --> D[出力結果]

    style B fill:#ffcccc
    style C fill:#e6f3ff
    style D fill:#ccffcc

例: 「気温が 30 度以上なら "暑い"、20 度以上 30 度未満なら "快適"、20 度未満なら "寒い" と判定する」というルールを人間が明示的に記述する。

graph LR
    A[入力データ] --> C[学習アルゴリズム]
    B[出力結果<br/>教師データ] --> C
    C --> D[プログラム<br/>学習済みモデル]

    style A fill:#e6f3ff
    style B fill:#e6f3ff
    style C fill:#fff4cc
    style D fill:#ccffcc

例: 過去の気温データと快適度のデータを大量に与えることで、コンピュータが自動的に判定ルールを学習する。

3.1.2 機械学習の応用例

機械学習は、私たちの身の回りのさまざまな場面で活用されています。

  • 画像認識: 顔認識、物体検出、医療画像診断
  • 自然言語処理: 機械翻訳、文章生成、感情分析
  • 音声認識: 音声アシスタント、文字起こし
  • 推薦システム: 動画配信サービスの推薦、EC サイトの商品推薦
  • 異常検知: 不正取引の検出、製造業における品質管理
  • 予測: 株価予測、需要予測、天気予報

機械学習と AI の関係

人工知能(AI: Artificial Intelligence) は、人間の知的活動をコンピュータで実現する技術全般を指します。機械学習は AI を実現するための手法の一つであり、近年の AI ブームを支える重要な技術となっています。

3.1.3 機械学習の種類

機械学習は、学習方法の違いによって大きく 3 つに分類されます。

graph LR
    A[機械学習] --> B[教師あり学習]
    A --> C[教師なし学習]
    A --> D[強化学習]

    B --> B1[分類<br/>スパムメール判定]
    B --> B2[回帰<br/>住宅価格予測]

    C --> C1[クラスタリング<br/>顧客セグメント]
    C --> C2[次元削減<br/>データ圧縮]

    D --> D1[ゲームAI]
    D --> D2[ロボット制御]

    style A fill:#e6ccff
    style B fill:#ccffcc
    style C fill:#ffffcc
    style D fill:#ffcccc
    style B1 fill:#e6f9e6
    style B2 fill:#e6f9e6
    style C1 fill:#fffde6
    style C2 fill:#fffde6
    style D1 fill:#ffe6e6
    style D2 fill:#ffe6e6
学習方法 説明 例
教師あり学習 正解ラベル付きのデータから学習 スパムメール判定、住宅価格予測
教師なし学習 正解ラベルなしのデータから学習 データのグループ分け、異常検知
強化学習 試行錯誤を通じて最適な行動を学習 ゲーム AI、ロボット制御

本講義では、機械学習の中でも最も基本的で応用範囲の広い 教師あり学習 を中心に学んでいきます。

3.2 教師あり学習の概念

3.2.1 教師あり学習とは

教師あり学習(Supervised Learning) とは、入力データとそれに対応する正解ラベル(教師データ)のペアから学習を行う手法です。機械学習モデルは、入力と出力の関係性を学習し、新しい入力データに対して出力を予測できるようになります。

教師あり学習は、解決したい問題の種類によって、さらに 2 つに分類されます。

分類(Classification)

分類 は、入力データをあらかじめ定義されたカテゴリ(クラス)に分類する問題です。出力は 離散値(カテゴリラベル)となります。

graph LR
    A[入力データ<br/>メールの内容] --> B[分類モデル]
    B --> C[スパム]
    B --> D[通常メール]

    style A fill:#e6f3ff
    style B fill:#fff4cc
    style C fill:#ffcccc
    style D fill:#ccffcc

例

  • メールがスパムかどうかを判定する(2 クラス分類)
  • 手書き数字を 0〜9 に分類する(10 クラス分類)
  • アヤメの品種を分類する(3 クラス分類)

回帰(Regression)

回帰 は、入力データから連続的な数値を予測する問題です。出力は 連続値 となります。

graph LR
    A[入力データ<br/>面積, 築年数, 駅距離] --> B[回帰モデル]
    B --> C[価格: 4500万円]

    style A fill:#e6f3ff
    style B fill:#fff4cc
    style C fill:#ffffcc

例

  • 住宅の面積や築年数から価格を予測する
  • 気温や湿度から電力消費量を予測する
  • 学習時間から試験の点数を予測する

分類と回帰の見分け方

予測したい値が「カテゴリ」なら分類、「数値」なら回帰と考えると分かりやすいです。

  • 「この花は何という品種ですか?」 → 分類
  • 「この家の価格はいくらですか?」 → 回帰

3.2.2 特徴量とラベル

教師あり学習では、以下の 2 つの要素が重要になります。

  • 特徴量(Feature): 予測に使用する入力データ。説明変数とも呼ばれる
  • ラベル(Label): 予測したい出力データ。目的変数とも呼ばれる

例: 住宅価格予測の場合

面積(㎡) 築年数(年) 駅からの距離(分) 価格(万円)
80 5 10 4500
60 15 5 3200
100 2 15 5800
  • 特徴量: 面積、築年数、駅からの距離
  • ラベル: 価格

機械学習モデルは、特徴量からラベルを予測する関係性を学習します。

3.2.3 学習と予測

教師あり学習のプロセスは、大きく「学習」と「予測」の 2 つのフェーズに分けられます。

学習(Training)

学習フェーズでは、訓練データ(Training Data)を用いてモデルのパラメータを調整します。モデルは、特徴量とラベルの関係性を学習し、予測能力を獲得します。

graph LR
    A[訓練データ] --> B[特徴量]
    A --> C[ラベル]
    B --> D[モデルの学習]
    C --> D
    D --> E[学習済みモデル]

    style A fill:#e6f3ff
    style D fill:#fff4cc
    style E fill:#ccffcc

予測(Prediction)

予測フェーズでは、学習済みモデルを使って、新しい入力データに対する出力を予測します。

graph LR
    A[新しいデータ<br/>特徴量のみ] --> B[学習済みモデル]
    B --> C[予測結果<br/>ラベル]

    style A fill:#e6f3ff
    style B fill:#ccffcc
    style C fill:#ffffcc

重要な注意点

学習に使ったデータと同じデータで予測を行っても、モデルの真の性能は評価できません。未知のデータに対してどれだけ正確に予測できるかが重要です。これについては次のセクションで詳しく説明します。

3.3 データ分割の重要性

3.3.1 なぜデータを分割するのか

機械学習モデルの目的は、未知のデータに対して正確な予測を行うこと です。学習に使用したデータに対して高い精度が出ても、新しいデータに対して予測できなければ意味がありません。

このような状態を 過学習(Overfitting) と呼びます。過学習は、モデルが訓練データを「暗記」してしまい、一般的なパターンを学習できていない状態です。

過学習を防ぎ、モデルの真の性能を評価するために、データを複数のセットに分割します。

3.3.2 訓練データとテストデータ

最も基本的なデータ分割は、データを 訓練データ(Training Data) と テストデータ(Test Data) の 2 つに分ける方法です。

  • 訓練データ: モデルの学習に使用するデータ
  • テストデータ: モデルの性能を評価するために使用するデータ(学習には使わない)
graph TB
    A[全データ<br/>100%] --> B[訓練データ<br/>70-80%]
    A --> C[テストデータ<br/>20-30%]

    B --> D[モデルの学習に使用]
    C --> E[モデルの評価に使用]

    style A fill:#e6ccff
    style B fill:#ccffcc
    style C fill:#ffffcc
    style D fill:#e6f9e6
    style E fill:#fffde6

データ分割の比率

訓練データとテストデータの分割比率は、一般的に 7:3 や 8:2 が使われます。データ量が少ない場合は訓練データの割合を増やし、データ量が十分にある場合はテストデータの割合を増やすこともあります。

3.3.3 検証データ

より洗練された機械学習プロジェクトでは、データを 3 つに分割することがあります。

  • 訓練データ(Training Data): モデルの学習に使用
  • 検証データ(Validation Data): モデルの調整・選択に使用
  • テストデータ(Test Data): 最終的な性能評価に使用
graph TB
    A[全データ<br/>100%] --> B[訓練データ<br/>60-70%]
    A --> C[検証データ<br/>10-20%]
    A --> D[テストデータ<br/>10-20%]

    B --> E[モデルの学習]
    C --> F[ハイパーパラメータの調整]
    D --> G[最終評価]

    style A fill:#e6ccff
    style B fill:#ccffcc
    style C fill:#ffffcc
    style D fill:#ffcccc
    style E fill:#e6f9e6
    style F fill:#fffde6
    style G fill:#ffe6e6

検証データは、モデルのハイパーパラメータ(学習の設定値)を調整する際に使用します。検証データで性能を確認しながらモデルを改善し、最後にテストデータで最終的な性能を評価します。

データ分割の重要性

データを適切に分割しないと、モデルの真の性能を正しく評価できません。特に、テストデータは一度も学習に使用してはいけません。「試験問題を見ながら勉強する」ようなものになってしまい、正しい評価ができなくなります。

3.4 学習と予測の流れ

3.4.1 機械学習の典型的なワークフロー

機械学習プロジェクトは、一般的に以下のような流れで進みます。

graph TB
    A[1. データの収集] --> B[2. データの理解・可視化]
    B --> C[3. データの前処理]
    C --> D[4. データの分割]
    D --> E[5. モデルの選択]
    E --> F[6. モデルの学習<br/>訓練データを使用]
    F --> G[7. モデルの評価<br/>テストデータを使用]
    G --> H{性能は<br/>十分か?}
    H -->|No| C
    H -->|Yes| I[9. モデルのデプロイ<br/>実運用]

    style A fill:#e6f3ff
    style B fill:#e6f3ff
    style C fill:#ffffcc
    style D fill:#ffffcc
    style E fill:#ffcccc
    style F fill:#ccffcc
    style G fill:#ccffcc
    style H fill:#ffe6e6
    style I fill:#e6ccff

各ステップについて、簡単に説明します。

1. データの収集

機械学習の第一歩は、問題を解決するためのデータを収集することです。データは CSV ファイル、データベース、API、Web スクレイピングなど、さまざまな方法で取得できます。

2. データの理解・可視化

収集したデータの構造や特性を理解するために、統計量の計算やグラフの作成を行います(第 2 回で学んだ可視化技術が活躍します)。

3. データの前処理

機械学習モデルが扱えるようにデータを整形します。欠損値の処理、外れ値の除去、特徴量のスケーリング(正規化)などを行います。

3. データの分割

前述のとおり、データを訓練データとテストデータに分割します。

5. モデルの選択

解決したい問題に適した機械学習アルゴリズムを選択します(線形回帰、決定木、ニューラルネットワークなど)。

6. モデルの学習

訓練データを使ってモデルを学習させます。

7. モデルの評価

テストデータを使ってモデルの性能を評価します。精度、再現率、平均二乗誤差などの評価指標を用います。

8. モデルの改善

評価結果が不十分であれば、前処理やモデルの設定を変更し、再度学習と評価を繰り返します。

9. モデルのデプロイ

満足のいく性能が得られたら、モデルを実際のサービスやアプリケーションに組み込んで運用します。

3.4.2 Python による実装の基本パターン

Python の機械学習ライブラリ scikit-learn を使った基本的な実装パターンは以下のようになります(詳細は次回以降で学びます)。

# ライブラリのインポート
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 1. データの準備(X: 特徴量, y: ラベル)
X = [[面積1, 築年数1], [面積2, 築年数2], ...]
y = [価格1, 価格2, ...]

# 2. データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 3. モデルの作成
model = LinearRegression()

# 3. モデルの学習
model.fit(X_train, y_train)

# 5. モデルの予測
y_pred = model.predict(X_test)

# 6. モデルの評価
score = mean_squared_error(y_test, y_pred)
print(f"誤差: {score}")

このパターンは、ほとんどの教師あり学習で共通しています。次回以降の講義で、実際のデータセットを使って詳しく実践していきます。

3.5 線形回帰と単回帰分析

3.5.1 単回帰分析

線形回帰(Linear Regression) は、最もシンプルな機械学習アルゴリズムの一つで、データを直線で近似するモデルです。

1 つの特徴量 \(x\) からラベル \(y\) を予測する場合、線形回帰モデルは以下のように表されます。

\[ y = ax + b \]

ここで、\(a\) は傾き、\(b\) は切片です。機械学習では、これらのパラメータをデータから自動的に学習します。

graph LR
    A[特徴量 x<br/>学習時間] --> B[線形回帰モデル<br/>y = ax + b]
    B --> C[ラベル y<br/>試験の点数]

    style A fill:#e6f3ff
    style B fill:#fff4cc
    style C fill:#ffffcc

このように、1 つの特徴量から予測を行う回帰分析を単回帰分析(Simple Linear Regression) と呼びます。

3.5.2 簡単なデータでの実践

以下は、簡単なデータを使って線形回帰を実践する例です。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# サンプルデータの作成(学習時間と試験の点数)
# X: 学習時間(時間)、y: 試験の点数(点)
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8]])
y = np.array([45, 55, 60, 65, 70, 75, 80, 85])

# 線形回帰モデルの作成
model = LinearRegression()

# モデルの学習
model.fit(X, y)

# 学習したパラメータの確認
print(f"傾き: {model.coef_[0]:.2f}")
print(f"切片: {model.intercept_:.2f}")

# 予測
X_new = np.array([[9], [10]])  # 新しいデータ
y_pred = model.predict(X_new)
print(f"学習時間 9 時間の予測点数: {y_pred[0]:.2f}")
print(f"学習時間 10 時間の予測点数: {y_pred[1]:.2f}")

# 可視化
plt.scatter(X, y, color='blue', label='Training Data')
plt.plot(X, model.predict(X), color='red', label='Regression Line')
plt.scatter(X_new, y_pred, color='green', marker='x', s=100, label='Prediction')
plt.xlabel('Study Hours')
plt.ylabel('Test Score')
plt.legend()
plt.grid(True)
plt.show()

このコードを実行すると、学習時間と試験の点数の関係を表す直線が描かれ、新しいデータに対する予測も行われます。

単回帰分析の利点

単回帰分析は非常にシンプルなモデルですが、以下のような利点があります:

  • 計算が高速で、大規模データにも対応できる
  • 結果が解釈しやすい(傾きと切片の意味が明確)
  • 実装が簡単
  • 可視化が容易(2次元グラフで表現できる)

複雑なデータには向きませんが、まず最初に試すべき基本的なモデルです。

3.6 NumPy の基礎知識

機械学習では、NumPy(Numerical Python)ライブラリを頻繁に使用します。NumPy は数値計算を高速に行うための配列操作ライブラリです。

3.6.1 NumPy 配列の作成

NumPy の中心となるデータ構造は、ndarray(N-dimensional array) と呼ばれる多次元配列です。

import numpy as np

# 1次元配列(ベクトル)の作成
x = np.array([1, 2, 3, 4, 5])
print(x)  # [1 2 3 4 5]
print(f"形状: {x.shape}")  # (5,)
print(f"次元数: {x.ndim}")  # 1

# 2次元配列(行列)の作成
X = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
print(X)
print(f"形状: {X.shape}")  # (3, 3)
print(f"次元数: {X.ndim}")  # 2

3.6.2 配列の形状変換

機械学習では、データの形状を適切に変換する必要があります。

import numpy as np

# 1次元配列を2次元配列に変換
x = np.array([1, 2, 3, 4, 5])
X = x.reshape(-1, 1)  # (-1, 1) は「行数は自動、列数は1」
print(X)
# [[1]
#  [2]
#  [3]
#  [4]
#  [5]]
print(f"形状: {X.shape}")  # (5, 1)

# reshape(-1, 1) の意味
# -1: その次元のサイズを自動計算
# 1: 列数を1に固定

なぜ reshape が必要か

scikit-learn の多くのモデルは、特徴量として2次元配列を期待します。

  • 1次元配列: [1, 2, 3, 4, 5] → shape が (5,) → エラーになる
  • 2次元配列: [[1], [2], [3], [4], [5]] → shape が (5, 1) → 正しく動作

つまり、reshape(-1, 1) で「1つの特徴量を持つデータ」として正しく認識されます。

3.6.3 便利な配列生成関数

import numpy as np

# 連続した値を生成
arr1 = np.arange(0, 10, 2)  # 0から10未満まで、2刻み
print(arr1)  # [0 2 4 6 8]

# 等間隔の値を生成
arr2 = np.linspace(0, 1, 5)  # 0から1まで、5等分
print(arr2)  # [0.   0.25 0.5  0.75 1.  ]

# ゼロ配列
zeros = np.zeros((3, 4))  # 3行4列のゼロ配列
print(zeros)

# 乱数配列
np.random.seed(42)  # 再現性のため
random_data = np.random.rand(5, 3)  # 5行3列の乱数(0〜1)
print(random_data)

3.6.4 配列の演算

NumPy 配列は、要素ごとの演算が簡単に行えます。

import numpy as np

x = np.array([1, 2, 3, 4, 5])

# スカラーとの演算
print(x + 10)  # [11 12 13 14 15]
print(x * 2)   # [ 2  4  6  8 10]

# 配列同士の演算(要素ごと)
y = np.array([10, 20, 30, 40, 50])
print(x + y)   # [11 22 33 44 55]
print(x * y)   # [ 10  40  90 160 250]

# 統計関数
print(f"平均: {x.mean()}")     # 3.0
print(f"合計: {x.sum()}")      # 15
print(f"最大値: {x.max()}")    # 5
print(f"最小値: {x.min()}")    # 1
print(f"標準偏差: {x.std()}")  # 1.41...

NumPy の速度

NumPy は C 言語で実装されているため、Python のリストよりも数十倍〜数百倍高速です。大量のデータを扱う機械学習では必須のライブラリです。

3.7 scikit-learn の基礎知識

scikit-learn(サイキット・ラーン)は、Python で最も広く使われている機械学習ライブラリです。

scikit-learn 公式サイト

scikit-learn の公式ドキュメントには、豊富なチュートリアルやAPIリファレンスが用意されています。

3.7.1 scikit-learn の設計思想

scikit-learn は、一貫した API 設計が特徴です。どのアルゴリズムも以下のパターンで使えます。

from sklearn.モジュール名 import モデル名

# 1. モデルの作成
model = モデル名()

# 2. モデルの学習
model.fit(X_train, y_train)

# 3. モデルの予測
y_pred = model.predict(X_test)

# 3. モデルの評価
score = model.score(X_test, y_test)

このパターンは、線形回帰、決定木、ニューラルネットワークなど、すべてのモデルで共通しています。

3.7.2 主要なモジュール

scikit-learn は機能ごとにモジュールが分かれています。

graph LR
    A[scikit-learn] --> B[linear_model<br/>線形モデル]
    A --> C[tree<br/>決定木]
    A --> D[ensemble<br/>アンサンブル学習]
    A --> E[model_selection<br/>モデル選択・評価]
    A --> F[preprocessing<br/>前処理]
    A --> G[metrics<br/>評価指標]

    B --> B1[LinearRegression<br/>線形回帰]
    B --> B2[LogisticRegression<br/>ロジスティック回帰]

    E --> E1[train_test_split<br/>データ分割]
    E --> E2[cross_val_score<br/>交差検証]

    F --> F1[StandardScaler<br/>標準化]
    F --> F2[MinMaxScaler<br/>正規化]

    G --> G1[accuracy_score<br/>精度]
    G --> G2[mean_squared_error<br/>MSE]

    style A fill:#e6ccff
    style B fill:#ccffcc
    style C fill:#ccffcc
    style D fill:#ccffcc
    style E fill:#ffffcc
    style F fill:#ffcccc
    style G fill:#e6f3ff

3.7.3 LinearRegression の詳細

線形回帰モデル LinearRegression の主要な属性とメソッドを理解しましょう。

from sklearn.linear_model import LinearRegression
import numpy as np

# データの準備
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])

# モデルの作成と学習
model = LinearRegression()
model.fit(X, y)

# 学習したパラメータの確認
print(f"係数(傾き): {model.coef_}")         # [2.]
print(f"切片: {model.intercept_}")           # 0.0

# 予測
X_new = np.array([[6], [7]])
y_pred = model.predict(X_new)
print(f"予測値: {y_pred}")                   # [12. 14.]

# スコア(R²)の計算
score = model.score(X, y)
print(f"R²スコア: {score}")                  # 1.0(完璧なフィット)

重要な属性とメソッド

属性(学習後に利用可能)

  • model.coef_: 係数(重み)の配列
  • model.intercept_: 切片(バイアス)

メソッド

  • model.fit(X, y): モデルの学習
  • model.predict(X): 予測値の計算
  • model.score(X, y): R²スコアの計算

3.7.4 train_test_split の詳細

データ分割を行う train_test_split の使い方を詳しく見てみましょう。

from sklearn.model_selection import train_test_split
import numpy as np

# サンプルデータ
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
y = np.array([2, 4, 6, 8, 10, 12, 14, 16, 18, 20])

# 基本的な使い方
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,      # テストデータの割合(20%)
    random_state=42     # 乱数シード(再現性のため)
)

print(f"訓練データ数: {len(X_train)}")  # 8
print(f"テストデータ数: {len(X_test)}")  # 2

# test_size のいろいろな指定方法
# test_size=0.2    → 20% をテストデータに
# test_size=0.3    → 30% をテストデータに
# test_size=2      → 2サンプルをテストデータに(整数指定も可能)

# シャッフルの制御
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    shuffle=True,       # シャッフルする(デフォルト)
    random_state=42
)

# シャッフルしない場合(時系列データなど)
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    shuffle=False       # シャッフルしない
)

random_state の重要性

random_state を指定しないと、実行するたびに異なるデータ分割になります。

  • 指定する場合: 再現性が保たれる(デバッグや比較に便利)
  • 指定しない場合: 毎回異なる分割(実験の頑健性を確認する場合に有用)

講義や演習では random_state=42 を指定することが多いです。

3.7.5 よく使う評価指標

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np

# 実際の値と予測値
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])

# MSE(平均二乗誤差)
mse = mean_squared_error(y_true, y_pred)
print(f"MSE: {mse:.4f}")  # 0.375

# RMSE(平均二乗平方根誤差)
rmse = np.sqrt(mse)
print(f"RMSE: {rmse:.4f}")  # 0.6124

# MAE(平均絶対誤差)
mae = mean_absolute_error(y_true, y_pred)
print(f"MAE: {mae:.4f}")  # 0.5

# R²スコア(決定係数)
r2 = r2_score(y_true, y_pred)
print(f"R²: {r2:.4f}")  # 0.9486

3.8 演習問題

演習 3-1: NumPy 配列の作成と統計量

演習 3-1(初級)

以下のテンプレートコードを完成させて、次の処理を行ってください。

  1. np.arange を使って、10 から 100 まで(100 を含まない)10 刻みの 1 次元配列 x を作成する
  2. x の 形状(shape) を表示する
  3. x の 平均値、最大値、標準偏差 をそれぞれ表示する
  4. x を scikit-learn に渡せるよう、形状 (9, 1) の 2 次元配列 X に変換し、X の形状を表示する
テンプレートコード
import numpy as np

# 1. 10 から 100 まで(100 を含まない)10 刻みの配列を作成
x = ___

# 2. 形状を表示
print(f"x の形状: ___")

# 3. 平均・最大・標準偏差
print(f"平均: ___")
print(f"最大値: ___")
print(f"標準偏差: ___")

# 4. 2 次元配列に変換
X = ___
print(f"X の形状: ___")

演習 3-2: 単回帰モデルで売上を予測する

演習 3-2(初級)

あるアイスクリーム店の「最高気温」と「1 日の売上個数」のデータが以下のように得られました。線形回帰モデルを学習させ、「気温が 32℃ のときの売上個数」を予測してください。

また、学習されたモデルの「傾き」と「切片」を表示し、訓練データと回帰直線を散布図でプロットしてください。

気温(℃) 売上(個)
22 45
24 52
26 61
28 70
30 78
テンプレートコード
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# データ
X = np.array([22, 24, 26, 28, 30]).reshape(-1, 1)
y = np.array([45, 52, 61, 70, 78])

# 1. モデルの作成と学習

# 2. 傾きと切片の表示

# 3. 気温 32 度のときの売上を予測

# 4. 散布図と回帰直線の可視化

演習 3-3: データ分割と性能評価

演習 3-3(中級)

あるクラスの学生 12 人について、「1 週間の勉強時間」と「試験の点数」を調査したところ、以下のデータが得られました。

このデータを「訓練データ 75%、テストデータ 25%」に分割し、訓練データで線形回帰モデルを学習させた後、テストデータに対する予測を行い、「平均二乗誤差(MSE)」と 「R² スコア」を計算して表示してください。random_state は 42 を指定すること。

study_hours = [2, 3, 5, 6, 7, 8, 10, 12, 14, 15, 18, 20]
scores      = [40, 50, 55, 62, 65, 68, 72, 78, 82, 85, 90, 95]
テンプレートコード
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

study_hours = [2, 3, 5, 6, 7, 8, 10, 12, 14, 15, 18, 20]
scores      = [40, 50, 55, 62, 65, 68, 72, 78, 82, 85, 90, 95]

# 1. NumPy 配列に変換し、X は 2 次元に整形

# 2. 訓練データとテストデータに分割(テスト 25%, random_state=42)

# 3. モデルの作成と学習

# 4. テストデータで予測

# 5. MSE と R² を計算して表示

演習 3-4: 人工データで回帰モデルを評価する

演習 3-4(中級)

以下の手順で人工データを生成し、線形回帰の挙動を確認してください。

  1. np.random.seed(0) で乱数シードを固定する
  2. np.linspace(0, 10, 50) で 0 から 10 までの等間隔な値 50 個を生成し、特徴量 X(形状 (50, 1))を作る
  3. 真の関係を \(y = 3x + 5\) とし、これに np.random.normal(0, 2, 50) で生成したノイズを加えてラベル y を作る
  4. データを「訓練 80%、テスト 20%」(random_state=0)に分割する
  5. 線形回帰モデルを学習させ、学習された「傾き」と「切片」を表示する(真の値 3, 5 にどの程度近いか確認)
  6. テストデータでの「R² スコア」を表示する
  7. 訓練データ(青)、テストデータ(緑)、学習した回帰直線(赤)を 1 つの散布図で可視化する
テンプレートコード
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# 1. 乱数シードを固定

# 2. X を生成(形状 (50, 1))

# 3. y を生成(真の関係 y = 3x + 5 にノイズを加える)

# 4. 訓練・テストに分割

# 5. モデルの学習と傾き・切片の表示

# 6. R² スコアを表示

# 7. 可視化

3.9 まとめ

第 3 回のまとめ

機械学習の基本概念

  • 機械学習は、データからパターンを自動的に学習する技術
  • 教師あり学習、教師なし学習、強化学習の 3 種類がある

教師あり学習

  • 正解ラベル付きのデータから学習する手法
  • 分類問題と回帰問題の 2 つに大別される
  • 特徴量(入力)からラベル(出力)を予測する

データ分割の重要性

  • 訓練データでモデルを学習し、テストデータで評価する
  • データを適切に分割しないと、モデルの真の性能を評価できない
  • 過学習を防ぐために、未知のデータで評価することが重要

機械学習のワークフロー

  • データ収集 → 理解・可視化 → 前処理 → 分割 → 学習 → 評価 → 改善
  • scikit-learn を使った実装パターンは共通している

線形回帰(単回帰分析)

  • 1つの特徴量から予測を行う最もシンプルな手法
  • y = ax + b の形でデータを近似する
  • 計算が高速で、結果が解釈しやすく、可視化も容易

NumPy の基礎

  • NumPy は数値計算を高速に行うための配列操作ライブラリ
  • reshape(-1, 1) で1次元配列を2次元配列に変換できる
  • 要素ごとの演算が簡単に行える

scikit-learn の基礎

  • 一貫したAPI設計(fit, predict, score)
  • LinearRegression で線形回帰モデルを作成
  • train_test_split でデータを分割
  • 各種評価指標(MSE, RMSE, MAE, R²)を計算できる