本書の概要
「ディープラーニングを始める前に」というサブタイトルが示すとおり、本書はAIの基礎技術を幅広くカバーした一冊です。教師あり学習・教師なし学習・推薦システム・論理プログラミング・ヒューリスティック探索・遺伝的アルゴリズム・NLP・音声認識・物体検出・強化学習・ニューラルネットワーク・畳み込みニューラルネットまで、15のテーマを Python と scikit-learn を中心とした実装コードとともに解説しています。
AI/ML に入門したいエンジニアが「まず全体を俯瞰する」のに向いた書籍です。
1章 人工知能の概要
AIとは「機械に思考させ知性を持たせる方法」と定義されます。本章では以下の基礎概念を整理しています。
| 概念 | 説明 |
|---|---|
| チューリングテスト | コンピュータが人間の行動をまねできるか問うテスト |
| 合理的なエージェント | 入手可能な情報に基づき最大利益をもたらす行動をとるエージェント |
| 一般問題解決器(GPS) | あらゆる問題を形式的に解くことを目指した最初の実用的AIプログラム |
| 知的エージェント | 機械学習・事前知識・推論規則により知性を持つエージェント |
AIの主な分派として以下が紹介されています。
- 機械学習とパターン認識:データからモデルを学習し未知データを予測
- 論理に基づくAI:数理論理学を用いてプログラムを実行
- 探索:膨大な可能性を調べて最適解を選ぶ
- ヒューリスティックス:最適解を保証しないが高速な近似手法
- 遺伝的プログラミング:プログラムを進化させて問題を解く
学習モデルの2種類
| モデル | 特徴 |
|---|---|
| 分析モデル | 数式で導出。人間の判断に依存し単純 |
| 学習モデル | 訓練で獲得。数千のパラメータを持ち複雑・高精度 |
2章 教師あり学習を用いた分類と回帰
教師あり学習はラベル付きデータで学習し、教師なし学習はラベルなしデータで潜在構造を学習します。
データ前処理
scikit-learn の preprocessing モジュールを使って以下の前処理を実施します。
from sklearn import preprocessing
# 二値化
data_binarized = preprocessing.Binarizer(threshold=2.1).transform(input_data)
# 正規化(L1/L2)
data_normalized_l1 = preprocessing.normalize(input_data, norm='l1')
data_normalized_l2 = preprocessing.normalize(input_data, norm='l2')
L1 vs L2 正規化:L1 は外れ値の影響を受けにくく、L2 は外れ値が重要な場合に有効です。
主な分類手法
| 手法 | 特徴 |
|---|---|
| ロジスティック回帰 | シグモイド曲線で確率を推定。シンプルで高速 |
| 単純ベイズ分類器(GaussianNB) | 特徴独立仮定のもとベイズの定理を利用 |
| サポートベクターマシン(SVM) | クラス間を分離する超平面を構築。高次元に強い |
評価指標として 適合率・再現率・F1値・混同行列 が紹介されており、交差検証で汎化性能を測定します。
回帰手法
| 手法 | 特徴 |
|---|---|
| 線形回帰 | 入出力が線形と仮定。高速 |
| 多項式回帰 | 非線形データに対応。PolynomialFeatures で変換 |
| サポートベクター回帰(SVR) | SVM の考え方を回帰に拡張 |
3章 アンサンブル学習を用いた予測分析
アンサンブル学習は複数のモデルを組み合わせてより良い結果を得る手法です。「専門家複数人に意見を聞いて最終判断する」という日常の意思決定に近い考え方です。
主要手法の比較
| 手法 | 特徴 |
|---|---|
| 決定木 | エントロピー最小化で分割。単純・解釈しやすい |
| ランダムフォレスト | 決定木の集合。ランダム部分集合で多様性を確保し過学習抑制 |
| ERT(ExtraTreesClassifier) | さらに閾値もランダム化。分散をさらに低減し境界が滑らか |
| AdaBoost | 難しいデータに集中的に学習。特徴量の重要度算出に利用 |
from sklearn.ensemble import ExtraTreesClassifier
params = {'n_estimators': 100, 'max_depth': 4, 'random_state': 0}
classifier = ExtraTreesClassifier(**params)
実践的なテクニック
-
クラス不均衡への対処:
class_weight='balanced'でデータ数の偏りを補正 -
グリッドサーチ:
GridSearchCVでハイパーパラメータの最適化を自動化 -
特徴量重要度:
feature_importances_で不要な特徴を排除しモデルを軽量化
4章 教師なし学習を用いたパターン検出
ラベルなしデータから構造を発見するクラスタリング手法を扱います。
主要クラスタリング手法
| 手法 | 特徴 |
|---|---|
| k-平均法(KMeans) | 事前にクラスタ数 k を指定。k-means++ で初期値を賢く選択 |
| Mean Shift | ノンパラメトリック。クラスタ数を自動推定 |
| 混合ガウスモデル(GMM) | 複数のガウス分布の組み合わせ。確率的に分類 |
| Affinity Propagation | クラスタ数不要。メッセージパッシングで exemplar を発見 |
シルエットスコアでクラスタリング品質を定量評価できます。値域は -1〜1 で、1 に近いほど良好なクラスタリングです。
from sklearn import metrics
from sklearn.cluster import KMeans
scores = []
for num_clusters in range(2, 10):
kmeans = KMeans(init='k-means++', n_clusters=num_clusters, n_init=10)
kmeans.fit(X)
score = metrics.silhouette_score(X, kmeans.labels_, metric='euclidean')
scores.append(score)
実応用例
- 株式市場のサブグループ検出(Affinity Propagation)
- 購買パターンによるマーケットセグメント分析(Mean Shift)
5章 推薦エンジンを作る
k-近傍法と協調フィルタを用いた映画推薦システムを実装します。
類似度スコアの比較
| スコア | 計算方法 | 特徴 |
|---|---|---|
| ユークリッドスコア | 距離の逆数 | 絶対的な差を重視 |
| ピアソンスコア | 相関係数 | 傾向の類似を重視。-1〜+1 |
推薦システムの流れ
- ユーザー間の類似度(ピアソンスコア)を計算
- 類似ユーザーを上位 k 人抽出(協調フィルタ)
- 類似ユーザーが評価した未視聴映画をスコア順に推薦
scikit-learn の Pipeline を活用することで、特徴選択→分類器の処理を一本化できます。
6章 論理プログラミング
Python の kanren ライブラリを使い、制約と規則から解を導く論理プログラミングを学びます。数独や家族関係推論などの問題解決に応用できます。
7章 ヒューリスティック探索
ヒューリスティック探索は最適解を保証しないが高速に解を見つける手法です。
-
simpleaiライブラリを用いた A* 探索の実装 - 8パズル問題やルーティング最適化に応用
A* アルゴリズムはヒューリスティック関数(ゴールまでの推定コスト)を組み合わせることで探索空間を効率的に絞り込みます。
8章 遺伝的アルゴリズム
生物の進化を模倣した最適化手法です。deap ライブラリを使い実装します。
選択 → 交叉 → 突然変異 → 評価 → 次世代
スケジューリングや組み合わせ最適化問題に適しています。
9章 人工知能を使ったゲーム
ゲームAIの実装として以下を扱います。
- ミニマックス法:ゲーム木の全探索
- アルファ・ベータ枝刈り:不要な探索を省略し高速化
-
easyaiライブラリを使ったチェスや囲碁系ゲームへの応用
10章 自然言語処理
nltk を使った自然言語処理の基礎を学びます。
| 技術 | 内容 |
|---|---|
| トークン化 | 文をトークン(単語)に分割 |
| ステミング | 語形変化を語幹に統一(例:playing → play) |
| 品詞タグ付け | 各単語の品詞を識別 |
| チャンキング | 品詞パターンで語のまとまりを抽出 |
| 感情分析 | テキストのポジティブ/ネガティブを判定 |
11章 連続データの確率的推論
隠れマルコフモデル(HMM) を用いた時系列データの推論を扱います。hmmlearn ライブラリを使用します。
- 状態遷移確率と出力確率の推定
- 音声・株価・天気など時系列分析への応用
12章 音声認識
音声処理のパイプラインを学びます。
- 音声の周波数領域変換(フーリエ変換)
- MFCC(メル周波数ケプストラム係数)による特徴抽出
- HMM や SVM を使った音声認識モデルの構築
hmmlearn と pystruct を組み合わせた実装が紹介されています。
13章 物体検出と追跡
OpenCV を使った画像処理・物体検出を扱います。
| 技術 | 内容 |
|---|---|
| Haar カスケード | 顔検出など高速な物体検出 |
| 光学フロー | フレーム間の動きを推定し物体追跡 |
| カメラキャリブレーション | 歪み補正と3D空間推定 |
14章 人工ニューラルネットワーク
ディープラーニング前夜として、従来のニューラルネットワークを学びます。
入力層 → 隠れ層(活性化関数)→ 出力層
-
neurolabを使ったネットワーク構築 - 誤差逆伝播法(バックプロパゲーション)による学習
- 過学習を防ぐ ドロップアウト の考え方
15章 強化学習
エージェントが試行錯誤を通じて最適な行動戦略(ポリシー)を学ぶ手法です。
| 概念 | 説明 |
|---|---|
| 報酬 | 行動の良し悪しを表す数値 |
| Q学習 | 状態-行動の価値関数を反復更新 |
| OpenAI Gym | 強化学習の環境を提供するライブラリ(gym) |
CartPole などのゲーム環境でエージェントを訓練する実装が紹介されています。
16章 畳み込みニューラルネットを用いたディープラーニング
本書の締めくくりとして CNN を扱います。
| レイヤー | 役割 |
|---|---|
| 畳み込み層(Conv) | 画像の局所的な特徴を抽出 |
| プーリング層 | 特徴マップを縮小し計算量削減 |
| 全結合層(FC) | 最終的なクラス分類を実施 |
-
TensorFlow+Kerasを使った実装 - CIFAR-10 などの画像分類タスクへの適用
全体を通した所感
良い点
- 幅の広さが圧倒的:分類・クラスタリング・推薦・NLP・音声・画像・強化学習まで1冊でカバー
- コードが豊富:scikit-learn を軸に実用的なサンプルコードが各章に充実
- 段階的な構成:基礎から応用へと自然に積み上がる構成
注意点
- 深さよりも広さ:各手法の直感的な理解は得られるが、数学的な理論の深掘りは少ない
-
ライブラリのバージョン:
pandas_datareaderやtensorflowなど一部パッケージは動作確認が必要 - 後半の密度が高い:13〜16章は前提知識がないと読み進めるのが難しい場面も
本書は「ディープラーニングを始める前に」という位置づけのため、CNN 等の説明は入門止まりです。実務でディープラーニングを深く学びたい場合は他書との併用を推奨します。
まとめ
本書は AI/ML の全体像を俯瞰したい方にとって、最初の一冊として非常に有効です。scikit-learn を中心とした実用的なコードと、チューリングテストから強化学習まで網羅した構成は、これから機械学習を体系的に学びたいエンジニアにとって入門書としての価値が高いと感じます。
一方で、各トピックを深く理解するための出発点として位置づけ、興味を持ったテーマをより専門的な書籍や論文で追う、という使い方が効果的でしょう。