この用語をシェア
概要
教師なし学習(Unsupervised Learning)は、正解ラベルが付いていないデータから、隠れた構造やパターン、関係性を発見する機械学習の手法です。人間が気づかなかった洞察を得ることができ、データ探索、顧客セグメンテーション、特徴抽出、異常検知など様々な場面で活用されています。
詳細説明
主要なタスク
- クラスタリング:データを類似性に基づいてグループ化
- 次元削減:高次元データを低次元に圧縮
- 密度推定:データの分布を推定
- 異常検知:通常と異なるパターンの検出
- 関連ルール学習:アイテム間の関係性発見
- 特徴学習:データの有用な表現を自動獲得
教師あり学習との違い
特徴 | 教師なし学習 | 教師あり学習 |
---|---|---|
ラベル | 不要 | 必要 |
目的 | 構造発見 | 予測・分類 |
評価 | 内的基準 | 外的基準(精度) |
応用 | 探索的分析 | 予測タスク |
クラスタリング手法
分割型クラスタリング
- k-means:最も基本的なクラスタリング手法
- k個のクラスタ中心を反復的に更新
- 計算効率が良い
- 球状のクラスタを仮定
- k-medoids:外れ値に頑健な手法
- Fuzzy C-means:ソフトクラスタリング
階層型クラスタリング
- 凝集型:ボトムアップアプローチ
- 単連結法
- 完全連結法
- Ward法
- 分割型:トップダウンアプローチ
密度ベースクラスタリング
- DBSCAN:任意形状のクラスタを発見
- OPTICS:密度の階層構造を考慮
- Mean Shift:密度の峰を探索
次元削減手法
線形手法
- 主成分分析(PCA):分散最大化による次元削減
- データの主要な変動方向を抽出
- 情報損失を最小化
- ノイズ除去効果
- 独立成分分析(ICA):統計的独立性の最大化
- 因子分析:潜在因子の推定
- 線形判別分析(LDA):クラス分離の最大化
非線形手法
- t-SNE:高次元データの可視化に最適
- UMAP:t-SNEより高速で大規模データ対応
- 自己組織化マップ(SOM):トポロジーを保持
- オートエンコーダー:深層学習による次元削減
実装例
k-meansクラスタリング
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import numpy as np
# サンプルデータの生成
np.random.seed(42)
X1 = np.random.normal(0, 1, (100, 2))
X2 = np.random.normal(3, 1, (100, 2))
X3 = np.random.normal(-3, 1, (100, 2))
X = np.vstack([X1, X2, X3])
# データの標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# k-meansクラスタリング
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X_scaled)
# 結果の可視化
plt.figure(figsize=(10, 6))
colors = ['red', 'green', 'blue']
for i in range(3):
cluster_points = X_scaled[labels == i]
plt.scatter(cluster_points[:, 0], cluster_points[:, 1],
c=colors[i], label=f'クラスタ {i+1}', alpha=0.6)
# クラスタ中心の表示
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black',
marker='x', s=200, linewidths=3, label='中心')
plt.xlabel('特徴量1')
plt.ylabel('特徴量2')
plt.title('k-meansクラスタリング結果')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# エルボー法による最適クラスタ数の決定
inertias = []
K_range = range(1, 10)
for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X_scaled)
inertias.append(kmeans.inertia_)
plt.figure(figsize=(8, 5))
plt.plot(K_range, inertias, 'bo-')
plt.xlabel('クラスタ数 (k)')
plt.ylabel('慣性(Inertia)')
plt.title('エルボー法')
plt.grid(True, alpha=0.3)
plt.show()
PCAによる次元削減
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import pandas as pd
# データの読み込み
iris = load_iris()
X = iris.data
y = iris.target
# PCAの実行
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 結果の可視化
plt.figure(figsize=(10, 6))
colors = ['red', 'green', 'blue']
for i in range(3):
plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1],
c=colors[i], label=iris.target_names[i], alpha=0.7)
plt.xlabel(f'第1主成分 ({pca.explained_variance_ratio_[0]:.2%})')
plt.ylabel(f'第2主成分 ({pca.explained_variance_ratio_[1]:.2%})')
plt.title('PCAによるIrisデータセットの可視化')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# 各主成分の寄与率
plt.figure(figsize=(8, 5))
explained_variance = pca.explained_variance_ratio_
cumulative_variance = np.cumsum(explained_variance)
plt.bar(range(1, 3), explained_variance, alpha=0.7, label='個別寄与率')
plt.plot(range(1, 3), cumulative_variance, 'ro-', label='累積寄与率')
plt.xlabel('主成分番号')
plt.ylabel('説明分散比')
plt.title('主成分の寄与率')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
深層学習による教師なし学習
オートエンコーダー
- 基本オートエンコーダー:エンコーダーとデコーダー
- 変分オートエンコーダー(VAE):確率的な潜在表現
- デノイジングオートエンコーダー:ノイズ除去
- スパースオートエンコーダー:スパース表現学習
生成モデル
- GAN(敵対的生成ネットワーク):リアルなデータ生成
- 拡散モデル:ノイズからのデータ生成
- 正規化フロー:可逆変換による生成
応用分野
ビジネス応用
- 顧客セグメンテーション:マーケティング戦略の最適化
- 異常検知:不正取引、設備故障の検出
- 推薦システム:協調フィルタリング
- 市場バスケット分析:商品の関連性分析
科学・医療
- 遺伝子発現解析:細胞タイプの分類
- 創薬:化合物の類似性分析
- 画像解析:病変の自動検出
- 脳活動解析:パターンの発見
評価方法
内的評価指標
- シルエット係数:クラスタの分離度
- Davies-Bouldin指数:クラスタ間の分離
- Calinski-Harabasz指数:クラスタの凝集度
- 慣性(Inertia):クラスタ内の分散
外的評価指標(ラベルがある場合)
- 調整ランド指数(ARI):偶然の一致を考慮
- 正規化相互情報量(NMI):情報理論的指標
- 均質性・完全性・V尺度:クラスタの純度
課題と対策
主な課題
- クラスタ数の決定:最適なkの選択
- エルボー法
- シルエット分析
- ギャップ統計量
- 初期値依存性:結果の不安定性
- 複数回実行
- k-means++初期化
- スケールの影響:特徴量の単位差
- 標準化
- 正規化
最新動向
- 自己教師あり学習:ラベルなしデータから特徴表現を学習
- コントラスティブ学習:類似性と非類似性の学習
- グラフクラスタリング:ネットワーク構造の分析
- 深層クラスタリング:深層学習とクラスタリングの統合
- 説明可能なクラスタリング:結果の解釈性向上