この章では、機械学習の基本概念、3つの学習タイプ、主要なアルゴリズム、そして実践的なワークフローを学びます。専門用語を理解し、実装への準備を整えます。
学習目標
この章を完了すると、以下のスキルを習得できます:
- 機械学習の定義と3つの学習タイプ(教師あり・教師なし・強化学習)を説明できる
- 20の重要なML用語を適切に使用できる
- 4つの主要フレームワーク(scikit-learn、PyTorch、TensorFlow、XGBoost)の特徴と使い分けを理解している
- 機械学習ワークフロー全7ステップを詳細に説明できる
- 特徴量の種類と変換方法を理解し、実装できる
2.1 機械学習の定義と分類
2.1.1 機械学習とは
機械学習(Machine Learning: ML)は、データから自動的にパターンを学習し、予測や判断を行うコンピュータプログラムの総称です。
古典的定義(Arthur Samuel, 1959):
"明示的にプログラムすることなく、コンピュータに学習する能力を与える研究分野"
形式的定義(Tom Mitchell, 1997):
"タスクTにおいて、経験Eから学習し、性能指標Pで測定した性能が向上するプログラム"
具体例で理解する:
- タスクT:スパムメールの判定
- 経験E:過去のメール(スパム/非スパムのラベル付き)
- 性能P:判定精度(正答率)
システムが過去のメールデータから学習し、新しいメールをスパムか否か判定する精度が向上すれば、それは「機械学習している」と言えます。
AI、ML、DLの関係
Artificial Intelligence] --> B[機械学習 ML
Machine Learning] B --> C[深層学習 DL
Deep Learning] A1[知的な振る舞いを
示すシステム全般] -.-> A B1[データから
パターンを学習] -.-> B C1[ニューラルネットワーク
を使った学習] -.-> C style A fill:#e3f2fd style B fill:#fff3e0 style C fill:#f3e5f5
包含関係:
- AI(人工知能):最も広い概念。チェスプログラム、チャットボット、自動運転など、知的な振る舞いを示すシステム全般
- ML(機械学習):AIの一手法。データから自動的に学習する技術
- DL(深層学習):MLの一種。多層ニューラルネットワークを使った学習手法
2.1.2 機械学習の3つの学習タイプ
機械学習は、データの種類と学習方法によって3つに大別されます。
1. 教師あり学習(Supervised Learning)
定義: ラベル付きデータ(入力と正解のペア)から学習する手法
仕組み:
入力データ(特徴量) + 正解ラベル → モデル訓練 → 予測
具体例:
- スパム判定:メール本文(入力)→ スパム/非スパム(正解)
- 価格予測:住宅の特徴(広さ、築年数、立地)→ 価格
- 画像分類:猫の画像 → "猫"というラベル
- 音声認識:音声データ → テキスト
主要アルゴリズム:
- 線形回帰(Linear Regression):連続値の予測
- ロジスティック回帰(Logistic Regression):2値分類
- 決定木(Decision Tree):条件分岐による分類
- サポートベクターマシン(SVM):最適な境界線を学習
- ニューラルネットワーク(Neural Network):複雑なパターン学習
2. 教師なし学習(Unsupervised Learning)
定義: ラベルなしデータから、隠れたパターンや構造を発見する手法
仕組み:
入力データのみ(正解なし) → モデル → パターン発見
具体例:
- 顧客セグメンテーション:購買履歴から顧客をグループ分け
- 異常検知:通常と異なるパターンを検出(不正取引、機器故障)
- 次元削減:高次元データを2-3次元に圧縮して可視化
- 推薦システム:類似商品の発見
主要アルゴリズム:
- K-means:データをK個のクラスタに分割
- 階層クラスタリング:樹形図でグループ構造を表現
- 主成分分析(PCA):データの主要な方向を抽出
- 自己組織化マップ(SOM):データの分布を可視化
3. 強化学習(Reinforcement Learning)
定義: 試行錯誤を通じて、報酬を最大化する行動を学習する手法
仕組み:
エージェント → 行動 → 環境 → 報酬・状態フィードバック → 学習
主要概念:
- エージェント:学習する主体(例:ゲームAI、ロボット)
- 環境:エージェントが行動する場(例:ゲーム盤面、実世界)
- 行動:エージェントが選択する操作
- 報酬:行動の良し悪しを示す数値(+で良い、-で悪い)
- 方策:状態から行動への写像(「この状況ではこう行動する」)
具体例:
- ゲームAI:AlphaGo(囲碁)、Dota 2、Atariゲーム
- ロボット制御:二足歩行、物体把持、ドローン飛行
- 自動運転:車線維持、障害物回避
- 推薦システム:ユーザー反応から最適な推薦を学習
3つの学習タイプの比較
| 学習タイプ | データ | 目的 | 適用例 | 難易度 |
|---|---|---|---|---|
| 教師あり学習 | ラベル付き | 予測・分類 | スパム判定、価格予測、画像認識 | 中 |
| 教師なし学習 | ラベルなし | パターン発見 | 顧客分析、異常検知、データ圧縮 | 高 |
| 強化学習 | 報酬シグナル | 行動最適化 | ゲームAI、ロボット、自動運転 | 最高 |
学習タイプの選択フローチャート
ある?} B -->|Yes| C{出力は何?} B -->|No| D{目的は?} C -->|連続値
例:価格| E[回帰
Linear Regression] C -->|カテゴリ
例:スパム/非スパム| F[分類
Logistic Regression
Decision Tree] D -->|グループ分け| G[クラスタリング
K-means] D -->|次元削減| H[次元削減
PCA] D -->|異常検知| I[異常検知
Isolation Forest] J{試行錯誤で
最適化?} -->|Yes| K[強化学習
Q-learning
DQN] style E fill:#e8f5e9 style F fill:#e8f5e9 style G fill:#fff3e0 style H fill:#fff3e0 style I fill:#fff3e0 style K fill:#f3e5f5
2.2 機械学習の重要用語集(20語)
機械学習を学ぶ上で必須となる専門用語を、カテゴリ別に整理しました。各用語は日本語・英語・定義・具体例の4点セットで理解しましょう。
基礎用語(8語)
| 用語(日本語) | 用語(英語) | 定義と具体例 |
|---|---|---|
| 1. 特徴量 | Feature | モデルへの入力となるデータの属性や性質。住宅価格予測なら「広さ、築年数、駅距離」など。特徴量の質がモデル性能を大きく左右します。適切な特徴量を設計することを「特徴量エンジニアリング」と呼びます。 |
| 2. ラベル | Label | 教師あり学習における正解データ。スパム判定なら「スパム」「非スパム」のラベル、住宅価格予測なら「価格」の数値。ラベル付きデータの収集はコストがかかるため、データ数が限られることが多いです。 |
| 3. 訓練データ | Training Data | モデルの学習に使うデータセット。全データの70-80%を訓練に使うのが一般的。訓練データが多いほど、モデルは複雑なパターンを学習できますが、過学習のリスクも増えます。 |
| 4. テストデータ | Test Data | 学習済みモデルの性能を評価するための未学習データ。全データの20-30%を使用。重要:テストデータは学習に一切使わず、最終評価のみに使います。テストデータで高性能なら汎化性能が高いと判断できます。 |
| 5. モデル | Model | 入力から出力への写像を表現する数式やプログラム。線形回帰なら $y = wx + b$ という数式、ニューラルネットワークなら多層の計算グラフ。訓練により、モデルのパラメータ(重みw、バイアスb)が最適化されます。 |
| 6. 予測 | Prediction | 学習済みモデルが新しい入力データに対して出力する値。回帰なら連続値(例:価格3,500万円)、分類ならクラス(例:スパム)。予測精度を向上させることが機械学習の主目的です。 |
| 7. 損失関数 | Loss Function | 予測値と正解との差(誤差)を数値化する関数。回帰では平均二乗誤差(MSE)、分類では交差エントロピーがよく使われます。学習の目的は損失関数を最小化することです。損失が小さいほど予測精度が高いことを意味します。 |
| 8. 過学習 | Overfitting | 訓練データに過度に適合し、未知データへの予測性能が低下する現象。訓練精度は高いがテスト精度が低い場合に発生。対策:データ数を増やす、モデルを単純化、正則化、交差検証など。機械学習で最も注意すべき問題の一つです。 |
手法用語(7語)
| 用語(日本語) | 用語(英語) | 定義と具体例 |
|---|---|---|
| 9. 回帰 | Regression | 連続値を予測するタスク。住宅価格、株価、気温などの数値予測。代表的手法:線形回帰、リッジ回帰、ランダムフォレスト。出力が「3,500万円」「25.3℃」のように具体的な数値になります。 |
| 10. 分類 | Classification | カテゴリ(クラス)を予測するタスク。スパム判定、病気診断、画像認識など。2値分類(Yes/No)と多クラス分類(猫/犬/鳥)があります。出力は「スパム」「良性」「猫」などのラベルです。 |
| 11. クラスタリング | Clustering | 正解ラベルなしでデータをグループ分けする教師なし学習。顧客セグメンテーション、文書分類、画像圧縮などに使用。K-meansでは事前にグループ数Kを指定し、データを自動的にK個に分割します。 |
| 12. 交差検証 | Cross-Validation | データをK個に分割し、1つをテスト、残りを訓練に使う操作をK回繰り返す手法。K-fold交差検証(K=5や10が一般的)により、モデルの汎化性能を正確に評価できます。データが少ない場合に特に有効です。 |
| 13. ハイパーパラメータ | Hyperparameter | 学習前に人間が設定する調整項目。学習率、木の深さ、ニューロン数など。モデルのパラメータ(重みw、バイアスb)とは異なり、訓練では更新されません。Grid SearchやRandom Searchで最適値を探索します。 |
| 14. 正則化 | Regularization | 過学習を防ぐためにモデルの複雑さにペナルティを課す手法。L1正則化(Lasso)はパラメータをゼロに近づけ、L2正則化(Ridge)は小さな値に抑制します。正則化により汎化性能が向上します。 |
| 15. アンサンブル | Ensemble | 複数のモデルの予測を組み合わせて精度を向上させる手法。バギング(Random Forest)、ブースティング(XGBoost)、スタッキングなど。「三人寄れば文殊の知恵」の原理で、単一モデルより高精度になることが多いです。 |
評価用語(5語)
| 用語(日本語) | 用語(英語) | 定義と具体例 |
|---|---|---|
| 16. 精度 | Accuracy | 全予測のうち正解した割合。計算式:$\text{Accuracy} = \frac{\text{正解数}}{\text{全データ数}}$。100個中85個正解なら精度85%。シンプルだが、データが偏っている場合(スパム1% vs 非スパム99%)は誤解を招く指標です。 |
| 17. 再現率 | Recall | 実際の正例のうち、正しく検出できた割合。計算式:$\text{Recall} = \frac{\text{真陽性}}{\text{真陽性 + 偽陰性}}$。病気診断で「病気の人を見逃さない」ことが重要な場合に重視。再現率が高いほど見逃しが少ないです。 |
| 18. 適合率 | Precision | モデルが正と予測したもののうち、実際に正だった割合。計算式:$\text{Precision} = \frac{\text{真陽性}}{\text{真陽性 + 偽陽性}}$。スパム判定で「非スパムをスパムと誤判定しない」ことが重要な場合に重視。適合率が高いほど誤検知が少ないです。 |
| 19. F1スコア | F1 Score | 適合率と再現率の調和平均。計算式:$\text{F1} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$。両方のバランスを取る指標で、どちらか一方だけが高くても良いスコアになりません。データが不均衡な場合に精度より有用です。 |
| 20. AUC-ROC | AUC-ROC | ROC曲線(横軸:偽陽性率、縦軸:真陽性率)の下側面積。0.5は完全ランダム、1.0は完全分類を意味します。閾値に依存しない評価指標で、分類器の総合的な性能を示します。AUC=0.9以上なら優秀なモデルと評価されます。 |
2.3 主要フレームワーク比較
機械学習の実装には、目的に応じたフレームワークの選択が重要です。ここでは4つの主要フレームワークを詳しく比較します。
2.3.1 scikit-learn(サイキットラーン)
特徴: Pythonで最も広く使われる汎用機械学習ライブラリ
強み:
- 初学者向け:統一されたAPIで使いやすい(fit、predict、scoreの3メソッドが基本)
- 古典的ML手法が充実:回帰、分類、クラスタリング、次元削減など
- ドキュメント充実:公式ドキュメントが詳細でサンプルコード豊富
- 前処理機能:スケーリング、エンコーディング、特徴選択など
弱み:
- 深層学習には非対応(ニューラルネットワークは浅いもののみ)
- 大規模データ(数百GB以上)では遅い
- GPU利用不可
適用場面:
- 表形式データ(CSV、Excelなど)の分析
- 小〜中規模データ(数万〜数百万サンプル)
- プロトタイピング、ベースライン作成
- 教育・学習目的
2.3.2 PyTorch(パイトーチ)
特徴: Meta(旧Facebook)開発の深層学習フレームワーク
強み:
- 研究向け:柔軟性が高く、新しいアーキテクチャを実装しやすい
- Pythonic:Pythonらしい書き方ができ、デバッグが容易
- 動的計算グラフ:実行時にグラフを構築するため直感的
- 研究コミュニティ:最新論文の実装が豊富(GitHub)
弱み:
- 本番環境へのデプロイがやや複雑
- モデルの最適化・圧縮はTensorFlowより少ない
適用場面:
- 深層学習の研究開発
- カスタムモデルの実装(新しいアーキテクチャ)
- 画像認識、自然言語処理、音声認識
- 学術論文の再現実装
2.3.3 TensorFlow / Keras(テンソルフロー / ケラス)
特徴: Google開発の本番環境向け深層学習フレームワーク(Kerasは高水準API)
強み:
- 本番環境向け:TensorFlow Servingで簡単にデプロイ
- スケーラビリティ:分散学習、マルチGPU対応が充実
- Keras統合:高水準APIで簡潔にモデル構築可能
- エコシステム:TensorFlow Lite(モバイル)、TensorFlow.js(Web)など
弱み:
- 学習曲線がやや急(初学者には難しい部分も)
- デバッグがPyTorchより難しい(静的計算グラフ)
適用場面:
- 本番環境へのデプロイが前提のプロジェクト
- 大規模システム(クラウド、分散学習)
- モバイルアプリへのML組み込み
- 企業での実用化
2.3.4 XGBoost / LightGBM(エックスジーブースト / ライトジービーエム)
特徴: 勾配ブースティングに特化した高速ライブラリ
強み:
- 表形式データで最高性能:Kaggleコンペで圧倒的シェア
- 高速:大規模データでも短時間で学習
- 特徴量重要度:どの特徴量が重要か自動評価
- 欠損値対応:欠損値を自動で扱える
弱み:
- 画像・テキストデータには不向き(CNNやRNNが必要)
- ハイパーパラメータ調整が複雑
適用場面:
- 表形式データ(CSV、データベース)の分類・回帰
- Kaggleなどのデータ分析コンペ
- ビジネスデータ分析(売上予測、顧客離反予測)
- 構造化データで高精度が求められる場面
フレームワーク比較表
| フレームワーク | 得意分野 | 学習難易度 | 速度 | 本番環境 | GPU対応 |
|---|---|---|---|---|---|
| scikit-learn | 古典的ML、表形式データ | 易 | 中 | △ | × |
| PyTorch | 深層学習、研究開発 | 中 | 高(GPU) | ○ | ◎ |
| TensorFlow/Keras | 本番環境、大規模システム | 中〜高 | 高(GPU) | ◎ | ◎ |
| XGBoost/LightGBM | 表形式データ、コンペ | 中 | 高(CPU) | ○ | △ |
フレームワーク選択フローチャート
CSV/Excel} A --> C{画像・テキスト・音声} B --> D{データサイズ} D -->|小〜中
10万行以下| E[scikit-learn
初学者向け] D -->|大
10万行以上| F[XGBoost/LightGBM
高精度・高速] C --> G{目的は?} G -->|研究・実験| H[PyTorch
柔軟性重視] G -->|本番デプロイ| I[TensorFlow/Keras
スケーラビリティ重視] style E fill:#e8f5e9 style F fill:#e8f5e9 style H fill:#f3e5f5 style I fill:#fff3e0
2.4 機械学習エコシステム
機械学習プロジェクトは、データ収集から本番運用まで複数のステップで構成されます。全体像を理解することが重要です。
DB/API/ファイル] --> B[データ収集
Scraping/ETL] B --> C[データストレージ
Data Lake/DWH] C --> D[前処理
クリーニング/正規化] D --> E[特徴量エンジニアリング
変換/選択/生成] E --> F[モデル訓練
学習/調整] F --> G[評価
精度検証] G --> H{性能OK?} H -->|No| I[ハイパーパラメータ調整
特徴量追加] I --> F H -->|Yes| J[デプロイ
本番環境] J --> K[モニタリング
性能監視] K --> L[フィードバック
データ追加] L --> B style A fill:#e3f2fd style F fill:#fff3e0 style J fill:#e8f5e9 style K fill:#ffebee
各コンポーネントの役割:
- データソース:データベース、API、センサー、ファイル、Webスクレイピングなど
- データストレージ:Data Lake(生データ保存)、Data Warehouse(整形済みデータ)
- 前処理:欠損値処理、外れ値除去、データクリーニング
- 特徴量エンジニアリング:MLモデルに適した形式への変換
- モデル訓練:アルゴリズム選択、学習、ハイパーパラメータ調整
- 評価:交差検証、テストデータでの精度確認
- デプロイ:本番環境へのモデル配置(API化、組み込み)
- モニタリング:予測精度の監視、モデルの劣化検知
- フィードバック:新データの収集、モデルの再訓練
2.5 機械学習ワークフロー詳細(7ステップ)
実際の機械学習プロジェクトは、以下の7ステップで進行します。各ステップの詳細、時間見積もり、注意点を理解しましょう。
Step 0:問題定式化(最も重要、見落とされがち)
目的: 解くべき問題をML的に定義する
実施内容:
- 問題タイプの特定:回帰?分類?クラスタリング?
- 成功指標(KPI)の定義:精度80%以上、F1スコア0.9など
- データ可用性の確認:必要なデータは入手可能か?
- 制約条件の整理:予算、期限、計算リソース
時間見積もり: 1-2週間(ステークホルダーとの議論含む)
よくある失敗:
- 問題定式化をスキップして、いきなりコーディング開始
- ビジネス目標とML目標の不一致
- 達成不可能な精度目標の設定
具体例:
ビジネス課題: 顧客離反を減らしたい
ML問題定式化:
- タスク:2値分類(離反する/しない)
- 入力:顧客属性(年齢、契約期間、購買履歴)
- 出力:離反確率
- 成功指標:再現率(Recall)80%以上(離反者を見逃さない)
- データ:過去2年間の顧客データ10万件
Step 1:データ収集
目的: 学習に必要なデータを集める
データソース:
- 社内データ:データベース、ログ、CRM
- 公開データ:Kaggle、UCI ML Repository、政府統計
- API:Twitter API、Google Maps API
- Webスクレイピング:BeautifulSoup、Scrapy
- アノテーション:人手によるラベル付け
必要データ量の目安:
- 最低限:100サンプル(プロトタイプ)
- 推奨:1,000〜10,000サンプル(古典的ML)
- 理想:10,000〜1,000,000サンプル(深層学習)
時間見積もり: 1-4週間
注意点:
- データの品質(ノイズ、欠損値)を確認
- クラスの偏り(スパム1% vs 非スパム99%など)に注意
- プライバシー、ライセンスの確認
Step 2:探索的データ分析(EDA: Exploratory Data Analysis)
目的: データの特性を理解し、問題点を発見する
実施内容:
- 統計量の確認:平均、中央値、分散、最大・最小値
- 分布の可視化:ヒストグラム、箱ひげ図
- 相関分析:変数間の関係性(相関係数、散布図)
- 欠損値の確認:どの列にどれだけ欠損があるか
- 外れ値の検出:異常に大きい/小さい値
時間見積もり: 数日-1週間
ツール: pandas、matplotlib、seaborn、pandas-profiling
Step 3:前処理・データクリーニング
目的: データをMLモデルが扱える形式に変換する
実施内容:
1. 欠損値処理
- 削除:欠損が少ない場合(5%未満)
- 補完:平均値、中央値、最頻値で埋める
- 予測:他の特徴量から欠損値を予測
2. 外れ値処理
- 除去:明らかなエラーデータ
- キャッピング:上限・下限を設定
- 変換:対数変換で影響を軽減
3. スケーリング(正規化・標準化)
- 標準化(Standardization):平均0、標準偏差1に変換
$z = \frac{x - \mu}{\sigma}$ - 正規化(Normalization):0-1の範囲に変換
$x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}}$
4. カテゴリ変数のエンコーディング
- Label Encoding:カテゴリを数値に変換(赤→0、青→1、緑→2)
- One-Hot Encoding:カテゴリをバイナリベクトルに変換
時間見積もり: 数日-1週間
注意点:
- 訓練データとテストデータで同じ前処理を適用
- スケーリングの統計量(平均、標準偏差)は訓練データから計算
Step 4:特徴量エンジニアリング
目的: モデルの予測精度を向上させる特徴量を作成する
手法:
- 既存特徴量の変換:対数変換、平方根、多項式
- 交互作用項:特徴量の積(広さ × 駅距離)
- 集約統計量:グループごとの平均、合計、カウント
- 時系列特徴量:ラグ特徴量、移動平均、季節性
- ドメイン知識の活用:業界特有の指標
時間見積もり: 数日-2週間
具体例:
住宅価格予測で、「広さ」と「築年数」から新しい特徴量を作成:
広さ_per_築年数 = 広さ / (築年数 + 1)駅近フラグ = 1 if 駅距離 < 500m else 0
Step 5:モデル選択と訓練
目的: 適切なアルゴリズムを選び、学習させる
戦略:
- ベースラインモデル:最もシンプルなモデル(線形回帰、ロジスティック回帰)
- 複数モデルの比較:決定木、ランダムフォレスト、XGBoost、SVM
- 最良モデルの選択:交差検証で性能評価
時間見積もり: 数時間-数日
ツール: scikit-learn、XGBoost、LightGBM
Step 6:評価とハイパーパラメータチューニング
目的: モデルの性能を最大化する
評価手法:
- ホールドアウト法:訓練80%、テスト20%に分割
- K-fold交差検証:データをK個に分割し、K回評価
チューニング手法:
- Grid Search:すべての組み合わせを試す(時間かかる)
- Random Search:ランダムにサンプリング(効率的)
- ベイズ最適化:効率的に最適値を探索
時間見積もり: 数日-1週間
Step 7:モデル解釈と検証
目的: モデルが正しく動作しているか確認する
実施内容:
- 特徴量重要度:どの特徴量が重要か
- 予測誤差の分析:どのデータで間違えているか
- SHAP値:個別予測の説明
- ビジネス検証:実際に使えるか確認
時間見積もり: 数日-1週間
ワークフロー全体の時間見積もり
プロジェクト全体: 2-3ヶ月(小〜中規模)、6-12ヶ月(大規模)
2.6 特徴量の深掘り
特徴量(Feature)は、機械学習モデルへの入力となるデータの属性です。適切な特徴量を設計することで、モデルの精度が劇的に向上します。
2.6.1 特徴量の種類
1. 数値特徴量(Numerical Features)
連続値: 無限に細かく分割できる数値
- 年齢:25.5歳、30.2歳
- 価格:1,234,567円
- 温度:23.7℃
- 距離:5.3km
離散値: 整数値
- 購入回数:0, 1, 2, 3回
- 部屋数:1LDK, 2LDK, 3LDK
- 在庫数:0, 5, 10個
2. カテゴリ特徴量(Categorical Features)
名義(Nominal): 順序関係がない
- 色:赤、青、緑
- 性別:男性、女性
- 地域:東京、大阪、福岡
- 商品カテゴリ:家電、衣料、食品
順序(Ordinal): 順序関係がある
- 教育レベル:小卒 < 中卒 < 高卒 < 大卒
- 評価:低 < 中 < 高
- サイズ:S < M < L < XL
3. テキスト特徴量(Text Features)
変換手法:
- Bag of Words(BoW):単語の出現回数
- TF-IDF:単語の重要度を数値化
- Word Embeddings:単語をベクトル化(Word2Vec、GloVe)
4. 時系列特徴量(Time Series Features)
派生特徴量:
- ラグ特徴量:過去の値(1日前、7日前)
- 移動平均:過去N日間の平均
- 季節性:月、曜日、祝日フラグ
- トレンド:増加・減少傾向
5. 画像特徴量(Image Features)
変換手法:
- ピクセル値:RGB値を直接使用
- エッジ検出:輪郭の抽出
- CNN特徴量:深層学習で自動抽出
2.6.2 カテゴリ変数の数値化(コード例)
"""
カテゴリ変数を数値に変換する2つの手法
目的: 機械学習モデルはカテゴリを直接扱えないため、数値化が必要
対象: 初学者
実行時間: 約3秒
"""
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 1. サンプルデータの準備
df = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red', 'blue'],
'size': ['S', 'M', 'L', 'M', 'S'],
'price': [100, 150, 200, 120, 90]
})
print("元のデータ:")
print(df)
print("\n" + "="*50 + "\n")
# 2. Label Encoding(ラベルエンコーディング)
# 各カテゴリを整数に変換(赤→0, 青→1, 緑→2)
le = LabelEncoder()
df['color_label'] = le.fit_transform(df['color'])
print("Label Encoding後:")
print(df[['color', 'color_label']])
print("\n注意: 数値に順序関係が生まれる(blue=1 > red=0)が、実際には順序はない")
print("\n" + "="*50 + "\n")
# 3. One-Hot Encoding(ワンホットエンコーディング)
# 各カテゴリを独立したバイナリ列に変換
df_onehot = pd.get_dummies(df, columns=['size'], prefix='size')
print("One-Hot Encoding後:")
print(df_onehot)
print("\nsize_S, size_M, size_Lの3列が作成され、該当する列だけ1、他は0")
# 期待される出力:
# 元のデータ:
# color size price
# 0 red S 100
# 1 blue M 150
# 2 green L 200
# 3 red M 120
# 4 blue S 90
#
# Label Encoding後:
# color color_label
# 0 red 2
# 1 blue 0
# 2 green 1
# 3 red 2
# 4 blue 0
#
# One-Hot Encoding後:
# color price color_label size_L size_M size_S
# 0 red 100 2 0 0 1
# 1 blue 150 0 0 1 0
# 2 green 200 1 1 0 0
# 3 red 120 2 0 1 0
# 4 blue 90 0 0 0 1
2.6.3 数値特徴量のスケーリング(コード例)
"""
数値特徴量のスケーリング(標準化・正規化)
目的: 異なるスケールの特徴量を統一し、モデル学習を安定化
対象: 初学者
実行時間: 約3秒
"""
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 1. サンプルデータ(住宅データ)
data = np.array([
[50, 10, 500], # 広さ(m²), 築年数, 駅距離(m)
[60, 15, 300],
[70, 5, 800],
[80, 20, 200],
[90, 8, 600]
])
print("元のデータ:")
print(" 広さ(m²) 築年数 駅距離(m)")
print(data)
print("\n注意: スケールが全く異なる(広さ:50-90, 築年数:5-20, 距離:200-800)")
print("\n" + "="*50 + "\n")
# 2. 標準化(Standardization)
# 平均0、標準偏差1に変換
scaler_std = StandardScaler()
data_std = scaler_std.fit_transform(data)
print("標準化後(平均0、標準偏差1):")
print(data_std)
print("\n各列の平均:", data_std.mean(axis=0))
print("各列の標準偏差:", data_std.std(axis=0))
print("\n" + "="*50 + "\n")
# 3. 正規化(Normalization)
# 0-1の範囲に変換
scaler_norm = MinMaxScaler()
data_norm = scaler_norm.fit_transform(data)
print("正規化後(0-1の範囲):")
print(data_norm)
print("\n各列の最小値:", data_norm.min(axis=0))
print("各列の最大値:", data_norm.max(axis=0))
# 期待される出力:
# 元のデータ:
# 広さ(m²) 築年数 駅距離(m)
# [[ 50 10 500]
# [ 60 15 300]
# [ 70 5 800]
# [ 80 20 200]
# [ 90 8 600]]
#
# 標準化後(平均0、標準偏差1):
# [[-1.41 -0.39 0.00]
# [-0.71 0.78 -1.00]
# [ 0.00 -1.17 1.50]
# [ 0.71 1.56 -1.50]
# [ 1.41 -0.78 0.50]]
#
# 正規化後(0-1の範囲):
# [[0.00 0.33 0.50]
# [0.25 0.67 0.17]
# [0.50 0.00 1.00]
# [0.75 1.00 0.00]
# [1.00 0.20 0.67]]
2.6.4 特徴量の選択と重要度(コード例)
"""
特徴量の選択と重要度の評価
目的: どの特徴量が予測に重要かを判断し、不要な特徴量を削除
対象: 初〜中級者
実行時間: 約5秒
"""
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestRegressor
import matplotlib.pyplot as plt
# 1. サンプルデータの読み込み(糖尿病データセット)
diabetes = load_diabetes()
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
y = diabetes.target
print("データセット情報:")
print(f"サンプル数: {X.shape[0]}, 特徴量数: {X.shape[1]}")
print(f"特徴量: {list(X.columns)}")
print("\n" + "="*50 + "\n")
# 2. ランダムフォレストで特徴量重要度を計算
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X, y)
# 3. 特徴量重要度の取得
importances = pd.DataFrame({
'feature': X.columns,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False)
print("特徴量重要度ランキング:")
print(importances)
print("\n" + "="*50 + "\n")
# 4. 相関係数の計算
correlations = X.corrwith(pd.Series(y)).abs().sort_values(ascending=False)
print("目的変数との相関係数(絶対値):")
print(correlations)
# 期待される出力:
# データセット情報:
# サンプル数: 442, 特徴量数: 10
# 特徴量: ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
#
# 特徴量重要度ランキング:
# feature importance
# 2 bmi 0.289345
# 8 s5 0.201928
# 4 s1 0.127654
# ...
#
# 目的変数との相関係数(絶対値):
# bmi 0.586450
# s5 0.565883
# bp 0.441484
# ...
2.6.5 特徴量エンジニアリングの実例(コード例)
"""
特徴量エンジニアリング: 新しい特徴量の作成
目的: 既存の特徴量から、より予測力の高い派生特徴量を作成
対象: 中級者
実行時間: 約3秒
"""
import pandas as pd
import numpy as np
# 1. サンプルデータ(住宅価格予測)
df = pd.DataFrame({
'広さ': [50, 60, 70, 80, 90],
'築年数': [10, 15, 5, 20, 8],
'駅距離': [500, 300, 800, 200, 600],
'部屋数': [2, 3, 3, 4, 2],
'価格': [3000, 3500, 4200, 4500, 3800] # 万円
})
print("元の特徴量:")
print(df)
print("\n" + "="*50 + "\n")
# 2. 派生特徴量の作成
# (1) 交互作用項: 広さと築年数の積
df['広さ×築年数'] = df['広さ'] * df['築年数']
# (2) 比率: 広さあたりの価格
df['価格per広さ'] = df['価格'] / df['広さ']
# (3) 多項式: 築年数の二乗(経年劣化は非線形)
df['築年数²'] = df['築年数'] ** 2
# (4) カテゴリ化: 駅距離を「近い/遠い」に変換
df['駅近フラグ'] = (df['駅距離'] < 400).astype(int)
# (5) ドメイン知識: 部屋数あたりの広さ
df['広さper部屋'] = df['広さ'] / df['部屋数']
# (6) 対数変換: 駅距離の対数(遠距離の影響を軽減)
df['log_駅距離'] = np.log1p(df['駅距離'])
print("特徴量エンジニアリング後:")
print(df)
print("\n" + "="*50 + "\n")
print("新しい特徴量の統計:")
print(df[['広さ×築年数', '価格per広さ', '駅近フラグ', '広さper部屋']].describe())
# 期待される出力:
# 元の特徴量:
# 広さ 築年数 駅距離 部屋数 価格
# 0 50 10 500 2 3000
# 1 60 15 300 3 3500
# 2 70 5 800 3 4200
# 3 80 20 200 4 4500
# 4 90 8 600 2 3800
#
# 特徴量エンジニアリング後:
# 広さ 築年数 駅距離 部屋数 価格 広さ×築年数 価格per広さ 築年数² 駅近フラグ 広さper部屋 log_駅距離
# 0 50 10 500 2 3000 500 60.0 100 0 25.0 6.215
# 1 60 15 300 3 3500 900 58.3 225 1 20.0 5.704
# 2 70 5 800 3 4200 350 60.0 25 0 23.3 6.685
# 3 80 20 200 4 4500 1600 56.2 400 1 20.0 5.298
# 4 90 8 600 2 3800 720 42.2 64 0 45.0 6.397
本章のまとめ
この章では、機械学習の基礎知識を体系的に学びました。以下の内容を習得しました:
習得した知識とスキル
- 機械学習の定義:データから自動的にパターンを学習する技術
- 3つの学習タイプ:教師あり学習、教師なし学習、強化学習の違いと適用場面
- 20の重要用語:特徴量、ラベル、モデル、損失関数、過学習など
- 4つの主要フレームワーク:scikit-learn、PyTorch、TensorFlow、XGBoostの使い分け
- 機械学習エコシステム:データ収集から本番運用までの全体像
- 7ステップワークフロー:問題定式化、データ収集、EDA、前処理、特徴量エンジニアリング、訓練、評価
- 特徴量の種類と変換:数値、カテゴリ、テキスト、時系列、画像特徴量
次章への橋渡し
第2章では、機械学習の理論と概念を学びました。次の第3章では、実際にPythonコードを書いて、6つの機械学習モデルを実装します。環境構築から始まり、データ前処理、モデル訓練、評価まで、手を動かして体験します。
第3章で学ぶこと:
- Python環境の構築(Anaconda / venv / Google Colab)
- 6つのモデルの完全実装(線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、SVM、KNN)
- ハイパーパラメータチューニング(Grid Search、Random Search)
- Titanicデータセットで実践プロジェクト
演習問題
問題1(難易度:easy)
教師あり学習と教師なし学習の違いを、具体例とともに説明してください。
ヒント
「正解ラベル」の有無に注目してください。教師あり学習では入力と正解のペアが必要ですが、教師なし学習では正解なしでパターンを発見します。
解答例
教師あり学習(Supervised Learning)
定義: ラベル付きデータ(入力と正解のペア)から学習する手法
具体例:
- スパム判定:メール本文(入力)→ スパム/非スパム(正解ラベル)
- 住宅価格予測:広さ、築年数(入力)→ 価格(正解ラベル)
- 画像認識:猫の画像(入力)→ "猫"というラベル(正解)
教師なし学習(Unsupervised Learning)
定義: ラベルなしデータから、隠れたパターンや構造を発見する手法
具体例:
- 顧客セグメンテーション:購買履歴から顧客を自動的にグループ分け(正解なし)
- 異常検知:通常と異なるパターンを検出(正常/異常のラベルなし)
- 推薦システム:類似商品の発見(正解なし、類似性のみ)
主な違い
| 項目 | 教師あり学習 | 教師なし学習 |
|---|---|---|
| データ | ラベル付き | ラベルなし |
| 目的 | 予測・分類 | パターン発見 |
| 評価 | 精度、F1スコアなど | シルエット係数など |
問題2(難易度:easy)
過学習とは何か、なぜ問題なのか説明してください。また、過学習を防ぐ方法を3つ挙げてください。
ヒント
訓練データとテストデータでの性能差に注目してください。訓練精度は高いのに、テスト精度が低い場合は過学習の可能性があります。
解答例
過学習(Overfitting)とは
定義: モデルが訓練データに過度に適合し、未知のデータへの予測性能が低下する現象
症状:
- 訓練データでの精度:95%(高い)
- テストデータでの精度:70%(低い)
原因:
- モデルが複雑すぎる(パラメータ数が多い)
- 訓練データが少ない
- ノイズや外れ値まで学習してしまう
なぜ問題なのか:
- 実世界での予測精度が低い(本番環境で使えない)
- 訓練データのパターンを「暗記」しているだけで、一般化できていない
- 新しいデータに対応できない
過学習を防ぐ方法
- データ数を増やす:訓練データを増やすことで、モデルが一般的なパターンを学習
- 正則化(Regularization):L1正則化(Lasso)、L2正則化(Ridge)でパラメータに制約
- 交差検証(Cross-Validation):K-fold交差検証で汎化性能を正確に評価
- モデルを単純化:決定木の深さを制限、ニューラルネットワークの層数を減らす
- ドロップアウト:ニューラルネットワークで一部のノードをランダムに無効化
- Early Stopping:検証誤差が増加し始めたら学習を停止
問題3(難易度:medium)
あるECサイトで顧客の購買予測をしたい。以下の2つの問題設定について、それぞれ回帰問題か分類問題かを判断し、理由とともに答えてください。
- (A) 顧客が次月に購入する金額を予測したい
- (B) 顧客が1ヶ月以内に購入するか否かを予測したい
ヒント
出力が連続値(数値)なら回帰、カテゴリ(Yes/No、高/中/低など)なら分類です。
解答例
(A) 顧客が次月に購入する金額を予測したい
答え:回帰問題(Regression)
理由:
- 出力が連続値(0円、3,500円、15,000円など)
- 具体的な数値を予測する
- 評価指標:MAE(平均絶対誤差)、RMSE(二乗平均平方根誤差)
適用モデル:
- 線形回帰(Linear Regression)
- ランダムフォレスト回帰(Random Forest Regressor)
- XGBoost回帰
(B) 顧客が1ヶ月以内に購入するか否かを予測したい
答え:分類問題(Classification)
理由:
- 出力がカテゴリ(購入する/しない、Yes/No)
- 2値分類(Binary Classification)
- 評価指標:精度(Accuracy)、F1スコア、AUC-ROC
適用モデル:
- ロジスティック回帰(Logistic Regression)
- ランダムフォレスト分類(Random Forest Classifier)
- XGBoost分類
ビジネス的観点
- (A)の回帰:マーケティング予算の配分、在庫計画に有用
- (B)の分類:ターゲット顧客の絞り込み、クーポン配布に有用
問題4(難易度:medium)
特徴量エンジニアリングで、カテゴリ変数「都道府県」をどのように数値化すべきか、2つの方法を説明してください。それぞれの長所・短所も述べてください。
ヒント
カテゴリ変数を数値化する代表的な手法は、Label EncodingとOne-Hot Encodingです。順序関係の有無に注目してください。
解答例
方法1:Label Encoding(ラベルエンコーディング)
手法: 各都道府県に一意の整数を割り当てる
東京 → 0
大阪 → 1
福岡 → 2
北海道 → 3
...
長所:
- メモリ効率が良い(1列で済む)
- 実装が簡単
- データサイズが増えない
短所:
- 誤った順序関係が生まれる:大阪(1) > 東京(0)のような意味のない大小関係
- 線形モデルでは不適切(都道府県に順序はない)
- 決定木系モデル(ランダムフォレスト、XGBoost)では使用可能
方法2:One-Hot Encoding(ワンホットエンコーディング)
手法: 各都道府県を独立したバイナリ列に変換
東京 → [1, 0, 0, 0, ...](東京列が1、他は0)
大阪 → [0, 1, 0, 0, ...](大阪列が1、他は0)
福岡 → [0, 0, 1, 0, ...](福岡列が1、他は0)
北海道 → [0, 0, 0, 1, ...](北海道列が1、他は0)
長所:
- 順序関係を作らない:各都道府県が独立した特徴量として扱われる
- 線形モデルでも正しく学習できる
- 解釈性が高い(「東京の効果」が明確)
短所:
- 特徴量数が増加(47都道府県なら47列)
- メモリ消費が大きい
- カテゴリ数が多い場合(数千以上)は次元の呪い
使い分けガイド
| 条件 | 推奨手法 |
|---|---|
| カテゴリ数が少ない(<100) | One-Hot Encoding |
| カテゴリ数が多い(>100) | Label Encoding + 決定木系モデル |
| 線形モデル使用 | One-Hot Encoding必須 |
| 決定木系モデル使用 | どちらでも可(Label Encodingが効率的) |
都道府県の場合の推奨
推奨:One-Hot Encoding
- カテゴリ数が47個で適度
- 順序関係がない(東京 > 大阪は意味不明)
- 解釈性が高い(地域別の効果を分析可能)
参考文献
- Mitchell, T. M. (1997). Machine Learning. McGraw-Hill. ISBN: 0070428077
- Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer. ISBN: 0387310738
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press. https://www.deeplearningbook.org/
- scikit-learn Documentation. (2024). https://scikit-learn.org/stable/
- 加藤公一 (2018). 『仕事ではじめる機械学習』オライリー・ジャパン. ISBN: 4873118255
- Sebastian Raschka (2019). Python Machine Learning (3rd ed.). Packt Publishing. ISBN: 1789955750
- Aurélien Géron (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow (2nd ed.). O'Reilly Media. ISBN: 1492032646