ななぶろ

-お役立ち情報を気楽に紹介するブログ-

機械学習プログラム例:教師あり学習の基礎と実践

www.amazon.co.jp

はじめに

機械学習は、データからパターンを学習し、将来の予測や意思決定を行うための強力な技術です。その中でも「教師あり学習」は、ラベル付けされたデータを用いてモデルを訓練する手法であり、様々な分野で広く活用されています。本記事では、教師あり学習の基本的な概念から具体的なプログラム例までを解説します。

1. 教師あり学習とは?

教師あり学習(Supervised Learning)は、機械学習の一種で、入力データとそれに対応する正解ラベルのペアを用いてモデルを訓練する方法です。まるで先生が学生に答えを教えながら学習を進めるように、モデルは与えられたデータから入力と出力の関係性を学びます。

教師あり学習の主な種類:

  • 回帰(Regression): 連続的な値を予測するタスク。例えば、住宅価格の予測や株価の予測などです。
  • 分類(Classification): カテゴリを予測するタスク。例えば、メールのスパム判定や画像認識などです。

教師なし学習との違い:

教師あり学習と対比されるのは「教師なし学習」です。教師なし学習では、ラベル付けされていないデータを用いてデータの構造やパターンを発見します。クラスタリングや次元削減などが代表的な手法です。

2. 教師あり学習のプロセス

教師あり学習の一般的なプロセスは以下の通りです。

  1. データ収集: 問題に適したデータを収集します。
  2. データ前処理: 欠損値の処理、外れ値の除去、データの正規化など、モデルが学習しやすいようにデータを加工します。
  3. 特徴量エンジニアリング: モデルの性能を向上させるために、既存の特徴量を組み合わせて新しい特徴量を作成したり、ドメイン知識に基づいて適切な特徴量を選択したりします。
  4. データ分割: 収集したデータを「訓練データ」「検証データ」「テストデータ」に分割します。
    • 訓練データ: モデルの学習に使用するデータです。
    • 検証データ: モデルのハイパーパラメータ調整や過学習のチェックに使用するデータです。
    • テストデータ: 最終的なモデルの性能評価に使用するデータです。
  5. モデル選択: 問題に適した機械学習アルゴリズムを選択します。(例:線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、サポートベクターマシン、ニューラルネットワークなど)
  6. モデル訓練: 訓練データを用いてモデルを学習させます。
  7. モデル評価: 検証データを用いてモデルの性能を評価し、必要に応じてハイパーパラメータを調整します。
  8. モデルテスト: テストデータを用いて最終的なモデルの性能を評価します。

3. 具体例:線形回帰による住宅価格予測

ここでは、最も基本的な教師あり学習アルゴリズムである「線形回帰」を用いて、住宅価格を予測する簡単なプログラム例を紹介します。

問題設定:

  • 入力データ: 住宅の広さ(平方メートル)
  • 出力データ: 住宅価格(万円)

線形回帰モデル:

住宅価格 = a * 広さ + b

ここで、abは学習によって決定されるパラメータです。

Pythonプログラム例 (scikit-learnを使用):

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

# 訓練データ
広さ = np.array([30, 40, 50, 60, 70]).reshape((-1, 1))  # 広さを2次元配列に変換
価格 = np.array([250, 350, 450, 550, 650])

# モデルの作成と訓練
model = LinearRegression()
model.fit(広さ, 価格)

# 回帰係数と切片
print("回帰係数 (a):", model.coef_[0])
print("切片 (b):", model.intercept_)

# 予測
新しい広さ = np.array([45]).reshape((-1, 1))
予測価格 = model.predict(新しい広さ)
print("広さが45平方メートルの住宅の予測価格:", 予測価格[0])

# 可視化
plt.scatter(広さ, 価格, label="訓練データ")
plt.plot(広さ, model.predict(広さ), color='red', label="回帰直線")
plt.xlabel("広さ (平方メートル)")
plt.ylabel("価格 (万円)")
plt.title("住宅価格予測(線形回帰)")
plt.legend()
plt.show()

解説:

  1. numpyは数値計算ライブラリ、sklearn.linear_modelはscikit-learnの線形回帰モデル、matplotlib.pyplotはグラフ描画ライブラリです。
  2. 訓練データとして、住宅の広さと価格のペアを用意します。
  3. LinearRegression()で線形回帰モデルを作成し、fit(広さ, 価格)で訓練データを学習させます。
  4. model.coef_[0]で回帰係数(傾き)を、model.intercept_で切片を取得します。
  5. predict()メソッドを用いて新しい広さの住宅価格を予測します。
  6. 最後に、訓練データと回帰直線をグラフにプロットして可視化します。

4. 具体例:ロジスティック回帰によるスパムメール判定

次に、分類問題である「スパムメール判定」をロジスティック回帰を用いて行うプログラム例を紹介します。

問題設定:

  • 入力データ: メール本文に含まれる単語の出現頻度
  • 出力データ: スパムメールかどうか (0 or 1)

ロジスティック回帰モデル:

P(スパムメール) = sigmoid(a * x + b)

ここで、xは入力特徴量ベクトル(単語の出現頻度)、abは学習によって決定されるパラメータ、sigmoidはシグモイド関数です。

Pythonプログラム例 (scikit-learnを使用):

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 訓練データ(簡略化のため、単語の出現頻度のみを使用)
メール本文 = ["これはスパムメールです", "お得な情報!", "重要なお知らせ", "こんにちは"]
ラベル = [1, 1, 0, 0]  # 1: スパム, 0: 通常

# 単語の出現頻度を特徴量として抽出(簡略化のため、単語数をカウント)
特徴量 = np.array([[1], [2], [1], [1]]) # 各メールの単語数

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(特徴量, ラベル, test_size=0.3, random_state=42)

# モデルの作成と訓練
model = LogisticRegression()
model.fit(X_train, y_train)

# 予測
y_pred = model.predict(X_test)

# 評価
accuracy = accuracy_score(y_test, y_pred)
print("正解率:", accuracy)
print(classification_report(y_test, y_pred))

解説:

  1. sklearn.model_selection.train_test_splitはデータを訓練データとテストデータに分割する関数です。
  2. sklearn.metrics.accuracy_scoreは正解率を計算する関数、classification_reportは分類レポートを出力する関数です。
  3. 特徴量としては、ここではメール本文の単語数をカウントしています。実際には、TF-IDFなどの手法を用いてより高度な特徴量を抽出することが一般的です。
  4. モデルの訓練後、テストデータを用いて予測を行い、正解率と詳細な分類レポートを出力します。

5. 教師あり学習アルゴリズムの選択

問題の種類やデータの特性に応じて、適切な教師あり学習アルゴリズムを選択する必要があります。以下にいくつかの代表的なアルゴリズムとその特徴をまとめます。

  • 線形回帰: シンプルで解釈しやすいが、非線形な関係には対応できない。
  • ロジスティック回帰: 分類問題に適しており、確率的な予測が可能。
  • 決定木: 非線形な関係にも対応でき、可視化しやすい。ただし、過学習しやすい。
  • ランダムフォレスト: 複数の決定木を組み合わせることで、汎化性能が向上する。
  • サポートベクターマシン (SVM): 高次元のデータに対して有効で、高い精度を実現できる。
  • ニューラルネットワーク: 複雑なパターンを学習でき、画像認識や自然言語処理などの分野で高い性能を発揮する。ただし、計算コストが高い場合がある。

6. まとめと今後の展望

本記事では、教師あり学習の基本的な概念から具体的なプログラム例までを解説しました。教師あり学習は、様々な問題解決に役立つ強力なツールです。

今後の展望:

  • 深層学習(Deep Learning): ニューラルネットワークを用いた高度な機械学習手法であり、画像認識、自然言語処理などの分野で目覚ましい成果を上げています。
  • アンサンブル学習 (Ensemble Learning): 複数のモデルを組み合わせることで、より高い精度を実現する手法です。
  • 説明可能なAI (Explainable AI, XAI): モデルの予測根拠を人間が理解できるようにする技術であり、医療や金融などの分野で重要性が高まっています。

機械学習は日々進化しており、新しいアルゴリズムや技術が登場しています。本記事が、教師あり学習への第一歩となることを願います。