総合演習Ⅱ
機械学習と深層学習
著者:姜 有宣・辛 徳
📖 目次
第1章 機械学習:分類・識別
パターン認識の基礎とscikit-learnによる実習
第2章 機械学習:回帰
線形回帰と勾配降下法の理解
第3章 深層学習:CNN Ⅰ
畳み込みニューラルネットワークの基礎
第4章 深層学習:CNN Ⅱ
CNNモデルの性能向上技法
第5章 深層学習:転移学習
事前学習モデルを活用した効率的学習
第6章 深層学習:顔検出
コンピュータビジョンによる顔認識技術
第7章 深層学習:Face Embedding
顔の特徴ベクトル抽出と類似度計算
第8章 深層学習:Kaggle Project
実践的なデータサイエンスプロジェクト
第1章 機械学習:分類・識別
📚 この章の学習目標
- 機械学習の基本概念と定義を理解する
- パターン認識の重要性と課題を学ぶ
- 分類アルゴリズムの種類と特徴を把握する
- scikit-learnを用いた実践的な分類問題を解決する
- 交差検証によるモデル評価手法を習得する
🚀 イントロダクション
✅ 例:象を冷蔵庫に入れる方法
- 冷蔵庫の扉を開ける
- 象を入れる
- 冷蔵庫の扉を閉める
この単純すぎる答えが示すように、複雑な問題を解決するには適切な手法とアプローチが必要です。機械学習も同様に、データから有意味なパターンを見つけ出すための体系的なアプローチが必要です。
🧠 機械学習の概要
💡 機械学習(ディープラーニングを含む)とは?
入力データが与えられたときに答えを推測してくれる最適な関数を見つけること。
異なるタイプの機械学習技法は、最適な関数を見つける技法が異なります。
学習プロセス
入力値 → F(x) → 予測値 ← 実際の値
- 入力値:データ
- F(x):学習モデル
- 予測値:結果
- 実際の値:検証
⚡ クイックヒント
核心的な質問:入力値と実際の値の関係を最もよく説明してくれるパターンは何でしょうか?
🔍 複雑なパターン認識の課題
⚠️ なぜ手書き数字認識は困難なのか?
同じ数字「5」であっても、人によって書き方が異なり、傾き、太さ、スタイルなど多様な変形が存在します。これらの複雑な特徴(feature)をif-else文のような単純な条件分岐で区別することは現実的ではありません。
💡 機械学習による解決アプローチ
- データ駆動型アプローチ:大量のデータから隠されたパターンを自動発見
- 統計的信頼性:数学的手法により予測エラーを最小化
- 自動パターン認識:人間が気づかない微細な特徴も学習可能
- 汎化性能:未知のデータに対しても高い精度で予測
📊 機械学習の定義と種類
💡 機械学習の正式な定義
機械学習とは、データを基にコンピュータがパターンを学習し、新しいデータに対して予測や判断を自動的に行う技術です。
人間がすべてのルールを明示的にプログラムしなくても、コンピューターが大量のデータを使って自動的に改善し、問題解決に役立つ方法を学ぶことができる仕組みです。
機械学習の主要な3つのタイプ
🎯 教師あり学習(Supervised Learning)
- ラベル付きデータを使用し、正しい答えを学習して予測を行います
- 例:写真の「猫」vs「犬」分類、メール「スパム」判定、医療診断など
🔍 教師なし学習(Unsupervised Learning)
- ラベルなしのデータを用いて、データの背後にあるパターンやグループを発見します
- 例:顧客セグメンテーション、異常検知、次元削減など
🎮 強化学習(Reinforcement Learning)
- エージェントが環境と相互作用し、報酬を最大化するために最適な行動を学習します
- 例:ゲームAI、自動運転、ロボット制御など
🎨 パターン認識とは
💡 パターン認識の定義
データや観測値の中から特定のパターンや構造を見つけ出し、分類や識別を行う技術です。
主な目的は、未知の入力に対して、これまで学習した情報から正しいクラスやカテゴリに分類することです。
パターン認識の4ステッププロセス
- データ収集(Data Collection)
- 前処理(Preprocessing)
- 特徴抽出(Feature Extraction)
- 分類・クラスタリング(Classification)
⚙️ アルゴリズム
🎯 分類(Classification)アルゴリズム
| アルゴリズム | 特徴 | 適用例 |
|---|---|---|
| k近傍法 (k-NN) | 近傍のk個のデータのクラス多数決で分類する直感的な手法 | 推薦システム |
| 決定木・ランダムフォレスト | データの特徴に基づいて木構造で分類する解釈しやすい手法 | 医療診断 |
| SVM | 最適な決定境界を見つけてデータを分類する高精度な手法 | テキスト分類 |
| ニューラルネットワーク | 複雑なパターンを学習可能な柔軟性の高い手法 | 画像認識 |
🔍 クラスタリングアルゴリズム
⚡ 分類 vs クラスタリング
分類は既知のラベルを持つデータから学習して新しいデータを予測しますが、クラスタリングはラベルなしデータをグループ化してパターンを発見します。
| アルゴリズム | 特徴 |
|---|---|
| k-means | データをk個のクラスタに分割し、各クラスタの重心を最適化 |
| 階層的クラスタリング | データを階層構造でグループ化する教師なし学習手法 |
| DBSCAN | 密度に基づくクラスタ形成。クラスタ数を事前に設定不要 |
🌍 応用分野
主要な応用領域
- 👁️ 画像認識:顔認識、自動運転車の物体検出、医用画像診断、監視カメラ映像解析
- 🎤 音声認識:音声アシスタント(Siri、Alexa)、音声翻訳、音楽ジャンル分類
- 💬 自然言語処理:機械翻訳、感情分析、チャットボット、文章要約
- 🔒 生体認証:指紋認証、虹彩認証、顔認証、声紋認証
- 🏥 医療診断:病理画像自動診断、遺伝子データ解析、心電図・脳波パターン解析
- 🤖 ロボティクス:環境認識、自律移動、物体操作
🔬 実習と課題
💡 scikit-learnによる分類実習
scikit-learn(サイキット・ラーン)は、Pythonで実装されたオープンソースの機械学習ライブラリです。
分類、回帰、クラスタリングなど多くのアルゴリズムを実装しており、機械学習モデル作成において必要不可欠なツールです。
🌸 Irisデータセットの分類
✅ Irisデータセット
Irisデータセットは機械学習の「Hello World」として知られ、典型的な教師あり学習の分類問題です。
3種類のアイリスの花(setosa、versicolor、virginica)を4つの特徴量から分類します。
Irisデータの特徴量(Features)
| 番号 | 特徴量 | 説明 | 単位 |
|---|---|---|---|
| 1 | Sepal Length | がく片の長さ | cm |
| 2 | Sepal Width | がく片の幅 | cm |
| 3 | Petal Length | 花びらの長さ | cm |
| 4 | Petal Width | 花びらの幅 | cm |
📥 必要なモジュールのインポート
import sklearn
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
📊 データセットの読み込みと確認
iris = load_iris()
keys = iris.keys()
print('iris dataset keys:', keys)
# 出力結果
iris dataset keys: dict_keys(['data', 'target', 'frame', 'target_names',
'DESCR', 'feature_names', 'filename', 'data_module'])
⚡ データセット構成要素の説明
- data: 特徴量データ(150×4の配列)
- target: ラベルデータ(0, 1, 2の分類値)
- target_names: ラベルの実際の名前(花の種類)
- feature_names: 特徴量の名前
- DESCR: データセットの詳細説明
print('feature_namesのtype:', type(iris.feature_names))
print('feature_namesのshape:', len(iris.feature_names))
print(iris.feature_names)
# 出力結果
feature_namesのtype: <class 'list'>
feature_namesのshape: 4
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
print('target_namesのtype:', type(iris.target_names))
print('target_namesのshape:', len(iris.target_names))
print(iris.target_names)
# 出力結果
target_namesのtype: <class 'numpy.ndarray'>
target_namesのshape: 3
['setosa' 'versicolor' 'virginica']
🤖 scikit-learnの学習フレームワーク
💡 学習フレームワーク
scikit-learnのEstimatorは、分類(Classifier)と回帰(Regressor)に分かれて設計されています:
- 学習:
fit()メソッド- 予測:
predict()メソッド
主要な分類器:
DecisionTreeClassifier:解釈しやすい決定木モデルRandomForestClassifier:複数の決定木を組み合わせたアンサンブルGradientBoostingClassifier:勾配ブースティング手法SVC:サポートベクターマシン
🎯 決定木による分類学習
train_data = iris.data
train_label = iris.target
# DecisionTreeClassifierのオブジェクト生成
dt_clf = DecisionTreeClassifier()
# 学習(Train)と予測(Predict)を実行
dt_clf.fit(train_data, train_label)
pred = dt_clf.predict(train_data)
print('Accuracy:', accuracy_score(train_label, pred))
# 出力結果
Accuracy: 1.0
⚠️ 重要な注意
上記の結果は100%の精度ですが、これは同じデータで学習とテストを行ったためです。実際のモデル性能を正しく評価するには、学習データとテストデータを分離する必要があります。
📊 学習データとテストデータの分離
X_train, X_test, y_train, y_test = train_test_split(
iris.data,
iris.target,
test_size=0.3, # 30%をテストデータに
random_state=29
)
# 新しい決定木モデルで学習・予測
dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
print('Test Accuracy: {0:.4f}'.format(accuracy_score(y_test, pred)))
# 出力結果
Test Accuracy: 0.9556
🔄 交差検証(Cross-Validation)
💡 交差検証とは?
交差検証では、データセットをk個に分割し、モデルの訓練と評価をk回行います。得られたk個の評価値の平均をとった値を最終的なモデルのスコアとして扱います。
✅ 5-Fold Cross Validationの例
K=5の場合、データを5つに分割し、以下を5回繰り返します:
- 4つのフォールドで学習(120サンプル)
- 1つのフォールドで検証(30サンプル)
最終的に5回の精度の平均を算出し、モデルの汎化性能とします。
🔍 k-Fold Cross Validationの実装
from sklearn.model_selection import KFold
import numpy as np
iris = load_iris()
features = iris.data
label = iris.target
dt_clf = DecisionTreeClassifier()
# KFoldオブジェクトの作成
kfold = KFold(n_splits=5) # 5つのフォールドに分割
cv_accuracy = []
print('iris dataset size:', features.shape[0])
# 150個のデータをK=5で分割 → 120(train):30(validation)
n_iter = 0
for train_index, test_index in kfold.split(features):
# データの分割
X_train, X_test = features[train_index], features[test_index]
y_train, y_test = label[train_index], label[test_index]
# 学習と予測
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
# 精度計算
n_iter += 1
accuracy = np.round(accuracy_score(y_test, pred), 4)
train_size = X_train.shape[0]
test_size = X_test.shape[0]
print(f'#{n_iter} Cross validation accuracy: {accuracy}, '
f'train data size: {train_size}, validation data size: {test_size}')
print(f'#{n_iter} validation set index: {test_index}')
cv_accuracy.append(accuracy)
print(f'\nAccuracy per cross-validation: {np.round(cv_accuracy, 2)}')
print(f'Average validation accuracy: {np.mean(cv_accuracy):.4f}')
# 出力結果例
#1 Cross validation accuracy: 1.0, train data size: 120, validation data size: 30
#1 validation set index: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29]
#2 Cross validation accuracy: 0.9667, train data size: 120, validation data size: 30
...
Accuracy per cross-validation: [1.0 0.97 0.97 0.96 0.97]
Average validation accuracy: 0.9740
🎯 実習課題
🎯 実習課題:Wineデータセットの分類
課題内容:
- Wineデータセットを用いて分類の性能評価を行ってください
- 5-fold交差検証を利用してその結果を示してください
- 3種類のワインの科学的特徴を分析してみましょう
参考URL:
https://scikit-learn.org/dev/modules/generated/sklearn.datasets.load_wine.html期待される成果物:
- データセットの基本情報確認
- 異なる分類アルゴリズムの性能比較
- 交差検証結果の可視化とレポート
- 特徴量の重要度分析
📚 第1章のまとめ
🎯 第1章のまとめ
- 機械学習は、データからパターンを学習し自動的に予測・判断を行う技術
- 教師あり学習、教師なし学習、強化学習の3つの主要タイプが存在
- 分類アルゴリズムには決定木、SVM、k-NN、ニューラルネットワークなどがある
- scikit-learnを使用することで簡単に機械学習モデルを構築・評価可能
- 交差検証により、モデルの汎化性能を適切に評価できる
📚 次のステップ
第1章で分類を学んだ次は、連続的な数値を予測する回帰手法を学びましょう。
→ 第2章 機械学習:回帰
