教師あり学習と教師なし学習:Pythonでの実装例
教師あり学習と教師なし学習は、機械学習における二つの主要なアプローチです。それぞれ異なる種類のデータと問題設定に対応しており、解決したい課題に応じて適切な手法を選択することが重要です。
教師あり学習 (Supervised Learning)
教師あり学習は、正解ラベルが付与されたデータを用いてモデルを訓練する手法です。入力データとそれに対応する出力(正解)のペアを学習し、未知の入力データに対する出力を予測できるようにします。例えるなら、教師が正解を教えながら生徒に問題を解かせるようなイメージです。
回帰 (Regression)
回帰は、連続的な数値を予測するタスクです。例えば、住宅の価格予測、株価の変動予測、気温の予測などが含まれます。
Pythonでの実装例:線形回帰 (Linear Regression)
線形回帰は、最も基本的な回帰アルゴリズムの一つで、入力変数と出力変数の間に線形関係があると仮定します。
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
# サンプルデータの生成
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1) # y = 4 + 3x + noise
# データを訓練用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 線形回帰モデルのインスタンス化と訓練
model = LinearRegression()
model.fit(X_train, y_train)
# テストデータでの予測
y_pred = model.predict(X_test)
# モデルの評価 (平均二乗誤差)
mse = mean_squared_error(y_test, y_pred)
print(f"平均二乗誤差 (MSE): {mse}")
# 予測結果の確認
print("実際の値:", y_test[:5].flatten())
print("予測値:", y_pred[:5].flatten())
この例では、`sklearn.linear_model`の`LinearRegression`を使用しています。まず、線形関係を持つサンプルデータを生成し、それを訓練データとテストデータに分割します。その後、訓練データでモデルを学習させ、テストデータで予測を行い、平均二乗誤差 (MSE) でモデルの性能を評価します。MSEが小さいほど、モデルの予測精度が高いことを示します。
分類 (Classification)
分類は、データを事前に定義されたカテゴリ(クラス)のいずれかに割り当てるタスクです。例えば、スパムメールの検出、画像認識(犬か猫か)、病気の診断などが含まれます。
Pythonでの実装例:ロジスティック回帰 (Logistic Regression)
ロジスティック回帰は、二値分類問題によく用いられるアルゴリズムです。確率を出力し、それを元にクラスを決定します。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import numpy as np
# サンプルデータの生成 (単純な二次元データ)
np.random.seed(0)
X = np.random.rand(100, 2) * 10
y = (X[:, 0] + X[:, 1] > 10).astype(int) # 線形分離可能なデータ
# データを訓練用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 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(f"正解率 (Accuracy): {accuracy}")
print("n分類レポート:n", classification_report(y_test, y_pred))
# 予測結果の確認
print("実際のクラス:", y_test[:5])
print("予測クラス:", y_pred[:5])
この例では、`sklearn.linear_model`の`LogisticRegression`を使用しています。同様にデータを分割し、モデルを訓練します。評価指標としては、正解率 (Accuracy) や、適合率 (Precision)、再現率 (Recall)、F1スコアなどを含む分類レポートが用いられます。
教師なし学習 (Unsupervised Learning)
教師なし学習は、正解ラベルが付与されていないデータを用いて、データに潜むパターンや構造を発見する手法です。データそのものの特徴を理解したり、データを整理したりするのに役立ちます。例えるなら、教師なしで、生徒が自分でデータの中から規則性を見つけ出すようなイメージです。
クラスタリング (Clustering)
クラスタリングは、類似したデータポイントをグループ(クラスター)にまとめる手法です。顧客のセグメンテーション、文書のトピック分類、異常検知などに利用されます。
Pythonでの実装例:K-meansクラスタリング
K-meansは、指定したクラスター数 (K) にデータを分割する代表的なクラスタリングアルゴリズムです。
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
# サンプルデータの生成 (3つのクラスター)
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)
# K-meansモデルのインスタンス化と訓練 (K=3)
kmeans = KMeans(n_clusters=3, random_state=0, n_init=10) # n_initを追加して警告を回避
kmeans.fit(X)
# 各データポイントのクラスターラベル
labels = kmeans.labels_
# クラスター中心の座標
centers = kmeans.cluster_centers_
# 結果の可視化
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.title("K-means Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
print("各データポイントのクラスターラベル:", labels[:10])
print("クラスター中心の座標:n", centers)
この例では、`sklearn.cluster`の`KMeans`を使用します。`make_blobs`で生成したデータを、指定したクラスター数 (この場合は3) で分割します。`kmeans.labels_`で各データポイントが属するクラスターが、`kmeans.cluster_centers_`で各クラスターの中心座標が得られます。結果を可視化することで、データがどのようにグループ化されたかを確認できます。
次元削減 (Dimensionality Reduction)
次元削減は、データの特徴量の数を減らしながら、データの持つ情報をできるだけ失わないようにする手法です。データの可視化、ノイズの除去、計算コストの削減などに役立ちます。
Pythonでの実装例:主成分分析 (Principal Component Analysis – PCA)
PCAは、データの分散が最大になるような新しい特徴量(主成分)を見つけ出す次元削減手法です。
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np
import matplotlib.pyplot as plt
# サンプルデータの生成 (高次元)
np.random.seed(0)
X = np.random.rand(100, 10) * 5 # 10次元のデータ
# データの標準化 (PCAの前処理として重要)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# PCAモデルのインスタンス化 (2次元に削減)
pca = PCA(n_components=2)
# PCAの適用
X_pca = pca.fit_transform(X_scaled)
# 結果の可視化 (2次元になったデータ)
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1])
plt.title("PCA (2 Dimensions)")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.grid(True)
plt.show()
print("元のデータの形状:", X.shape)
print("PCA適用後のデータの形状:", X_pca.shape)
print("説明された分散の割合:", pca.explained_variance_ratio_)
print("累積説明分散:", np.sum(pca.explained_variance_ratio_))
この例では、`sklearn.decomposition`の`PCA`を使用します。まず、データのスケールを揃えるために`StandardScaler`で標準化を行います。その後、`n_components`で削減したい次元数を指定してPCAを適用します。`pca.explained_variance_ratio_`は、各主成分が元のデータの分散のどれだけを説明しているかを示し、削減によって失われた情報量を把握するのに役立ちます。
その他の教師なし学習
教師なし学習には、上記以外にも以下のような手法があります。
- アソシエーション分析 (Association Analysis): データの項目間の関連性を発見する (例: バスケット分析)。
- 異常検知 (Anomaly Detection): データセットの中で、他のデータとは大きく異なる「異常」なデータポイントを見つける。
まとめ
教師あり学習は、明確な目標(予測や分類)があり、正解データが利用可能な場合に強力な手法です。一方、教師なし学習は、データの構造や隠れたパターンを理解したい場合、あるいは教師データが不足している場合に有効です。どちらの手法も、機械学習プロジェクトにおいて重要な役割を果たし、Pythonの`scikit-learn`ライブラリなどの豊富なツールによって容易に実装できます。問題の性質を理解し、適切なアルゴリズムを選択することが、成功への鍵となります。
