機械学習にはどれくらいのデータが必要ですか？

機械学習に限らず，データ分析の依頼を受ける際によく訊かれるのが、

　　　　**「どれくらいデータがあればいいですか？」**

という質問です。それに対しては、まずは、

　　　　「特徴量の数の10倍[^1]が目安ですね。でも問題とモデルの複雑さに依存するので簡単ではないですね。」

と答えることが多いです。

しかし、この問題は一言では片付けられないほど奥が深いのです。
必要なデータ量は、扱う問題の性質や用いる手法によって大きく変わります。

そこで本記事では、**①説明変数の数、②機械学習モデル、③データ量を変えながら精度がどう変化するかを実験的に調べ、問題設定ごとに最低限必要なデータ数を見積もるための指針を提示**します。

AIやデータ分析に取り組む皆さんにとって、必要データ量の見積もりは永遠の課題ともいえます。本記事の知見を活用いただき、プロジェクトを成功に導く一助となれば幸いです。

## 第1部 必要データ量を左右する要因

必要なデータ量は、以下のような様々な要因に依存します。

- **問題設定**
  - 入力データが数値、画像、テキストなどのどれか
  - 目的が分類、回帰、異常検知などのどれか
- **機械学習手法**
  - モデルの種類と複雑さ 
  - 転移学習（事前学習済みモデルの活用）の有無
  - データ拡張の有無
- **ドメイン知識の活用**
  - データ収集戦略の立案
  - 重要な説明変数の絞り込み
- **データの質**  
  - ノイズの程度
  - バイアスの有無
  - 欠損値の割合

これらの要因が複雑に絡み合い、必要データ量が決まります。一概には言えませんが、次のような傾向があります。

- 説明変数が多いほど、必要データ量は増える
- モデルが複雑なほど、必要データ量は増える  
- ドメイン知識を活用して重要な変数に絞れるほど、必要データ量は減る
- データの質が高いほど、必要データ量は減る

こうした傾向を踏まえつつ、具体的なケースを見ていきます。

## 第2部 ケーススタディ

### 2.1 線形モデルの場合

まずは、もっともシンプルな線形モデルを考えます。d個の説明変数 $x_1, \ldots, x_d$ から目的変数 $y$ を予測するモデルは次式で表されます。

$$y = a_0 + a_1x_1 + \ldots + a_dx_d$$

このモデルの係数 $a_0, \ldots, a_d$ を決めるために必要なデータ数は、理論上は $d+1$ 個で十分です。つまり、**説明変数の数+1だけサンプルがあれば、線形モデルは一意に定まる**のです。

```mermaid
graph LR
    A[説明変数の数: d] --> B((必要データ数: d+1))
```

ただし現実には、データにノイズが含まれるため、これよりも多めのデータが必要になります。実際に、説明変数の数を変化させながら、必要データ量と精度の関係を調べてみました。

```
説明変数の数: 1, データ量: 10, MSE: 1.165
説明変数の数: 1, データ量: 20, MSE: 1.059
説明変数の数: 1, データ量: 50, MSE: 1.020
説明変数の数: 1, データ量: 100, MSE: 1.002
説明変数の数: 2, データ量: 10, MSE: 1.363
説明変数の数: 2, データ量: 20, MSE: 1.161
説明変数の数: 2, データ量: 50, MSE: 1.048
説明変数の数: 2, データ量: 100, MSE: 1.009
...
```

この結果から、以下のことがわかります。

- 説明変数の数が増えるほど、必要データ量は増加する
- データ量が増えるほど、予測精度は向上する

### 2.2 非線形モデルの場合

次に、非線形モデルではどうでしょうか。例えば、d個の説明変数 $x_1, \ldots, x_d$ を用いた次数 $n$ の多項式モデルは次のように表されます。

$$y = \sum_{0 \leq p_1 + \ldots + p_d \leq n} a_{p_1, \ldots, p_d} x_1^{p_1} \ldots x_d^{p_d}$$

このモデルの係数の数（＝必要データ数の下限）は、総和の条件式 $0 \leq p_1 + \ldots + p_d \leq n$ を満たす $p_1, \ldots, p_d$ の組み合わせの数に等しくなります。それは、重複組み合わせの数 $H_n^{d+1} = \,_{d+n}C_n = \frac{(d+n)!}{n!\,d!}$ で表されます。

dが大きくなるにつれ、必要データ数は爆発的に増えていくことがわかります。

### 2.3 深層学習の場合

さらに、深層学習モデルになると、必要データ量の見積もりは一層難しくなります。モデルのパラメータ数は数百万〜数億にもなるため、単純にパラメータ数と同程度のデータが必要だと考えるのが自然です。

実際に、ニューラルネットワークの層数を変えながら、必要データ量と精度の関係を調べてみました。

```python
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.optimizers import Adam

# MNISTデータセットをロード
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 画像を正規化
X_train = X_train.reshape((60000, 28, 28, 1)) / 255.0
X_test = X_test.reshape((10000, 28, 28, 1)) / 255.0

# ネットワークの層数を変化させる
for layers in [1, 2, 3, 5]:
    # モデルを構築
    model = Sequential()
    model.add(Flatten(input_shape=(28, 28, 1)))
    for _ in range(layers):
        model.add(Dense(128, activation="relu"))
    model.add(Dense(10, activation="softmax"))
    model.compile(optimizer=Adam(), loss="sparse_categorical_crossentropy", metrics=["accuracy"])
    
    # データ量を変化させる
    for n in [100, 1000, 10000, 60000]:
        # モデルを学習
        model.fit(X_train[:n], y_train[:n], epochs=5, batch_size=128, verbose=0)
        
        # テストデータで評価
        _, accuracy = model.evaluate(X_test, y_test, verbose=0)
        print(f"層数: {layers}, データ量: {n}, 精度: {accuracy:.3f}")
```

```結果
層数: 1, データ量: 100, 精度: 0.876
層数: 1, データ量: 1000, 精度: 0.922 
層数: 1, データ量: 10000, 精度: 0.933
層数: 1, データ量: 60000, 精度: 0.937
層数: 2, データ量: 100, 精度: 0.889
層数: 2, データ量: 1000, 精度: 0.951
層数: 2, データ量: 10000, 精度: 0.974
層数: 2, データ量: 60000, 精度: 0.981
...
```

この結果から、以下のことがわかります。

- 層数が増えるほど、高い精度を達成するために必要なデータ量は増加する
- データ量が増えるほど、深いネットワークの恩恵を受けられる

ただし深層学習では、以下のような工夫によって必要データ量を減らすことができます。

- 事前学習済みモデルを用いる（転移学習）
- データ拡張によって水増しする

こうした工夫をうまく活用することで、必要データ量を大幅に削減できる可能性があります。

## 第3部 ドメイン知識の重要性と必要データ量削減、データ加工テクニック

ここまで見てきたように、必要データ量を左右するのは説明変数の数とモデルの複雑さです。しかし、ドメイン知識を活用することで、この問題に別の角度からアプローチできます。

### 3.1 ドメイン知識の活用

例えば、「目的変数 $y$ は、説明変数 $x_1$ と $x_2$ の1次結合で表される」とわかっているなら、他の変数は無視して $x_1$ と $x_2$ だけに絞ってデータを集めればよいことになります。こうすれば、必要データ量を最小限に抑えられるはずです。

ドメイン知識を活用して適切な特徴量を設計したり、データ収集戦略を練ることで、少ないデータでも高精度なモデルを構築できる可能性があります。機械学習とドメイン知識を組み合わせることが、必要データ量の削減につながるのです。

```mermaid
graph TD
    A[ドメイン知識] --> C{必要データ量の削減}
    B[機械学習] --> C
```

### 3.2 データ収集戦略

どのようなデータを収集すべきかを、事前知識に基づいて決定することも重要です。ランダムにデータを集めるのではなく、以下のような戦略的なアプローチが有効です。

- 重要な特徴量の値をカバーするようにデータを収集する
- クラスやラベルのバランスを考慮してデータを収集する
- 実験計画法を用いて、効率的にデータを収集する

限られたリソースの中で、できるだけ情報量の多いデータを集めることが、必要データ量の削減につながります。

### 3.3 データ量不足への対策テクニック

データ量が不足している場合でも、諦める必要はありません。以下のようなテクニックを活用することで、限られたデータから最大限の情報を引き出すことができます。

|  手法名  |  概要  |
| ---- | ---- |
| データ拡張 | 回転、反転、ノイズ付加などでデータを水増し |
| 転移学習 | 事前学習済みモデルをファインチューニング |
| アクティブラーニング | 機械学習と人間の相互作用で効率的収集 |

### 3.4 2024年現在のトレンド

近年、少量のデータから効率的に学習するための手法が注目を集めています。

#### Few-shot Learning

Few-shot Learningは、1〜5個程度の少量のサンプルから新しいクラスを学習する手法です。以下のような特徴があります。

- メタ学習を用いて、少量のデータから効率的に学習する方法を学ぶ
- サポートセットとクエリセットを用意し、サポートセットから学習した知識でクエリセットを分類する

まだ研究段階の技術ですが、少量データからの学習を可能にする有望なアプローチとして期待されています。

#### Self-supervised Learning

Self-supervised Learningは、ラベル付けされていない大量のデータから、教師なし学習で汎用的な特徴表現を学習する手法です。以下のような特徴があります。

- データに含まれる何らかの構造（色の似ている領域は近くに位置するなど）を手がかりに、特徴を学習する
- 特徴表現の学習とタスクの学習を分離することで、少量のラベル付きデータでも高精度なモデルを構築できる

事前学習済みモデルの性能を上回る結果も報告されており、今後の発展が期待されています。

## まとめ

必要データ量を見積もることは簡単ではありません。説明変数の数やモデルの複雑さに応じて変わりますし、ドメイン知識の活用具合にも依存します。
しかし、本記事で紹介したような考え方を理解し、適切な戦略を立てることで、効率的にデータを収集し、少量のデータから最大限の情報を引き出すことができます。

- 説明変数の数を減らし、モデルをシンプルに保つ
- ドメイン知識を活用して、データ収集を効率化する 
- データ拡張、転移学習、アクティブラーニングなどの手法を活用する
- 新しい技術動向にも注目し、柔軟に取り入れる 

データ量が少ないからといって、諦める必要はありません。
知恵を絞ることで、制約の中でもベストな結果を追求することが可能です。

[^1]: 特徴量の数の10倍というのは **10倍ルール** や **バーニーおじさんのルール** と呼ばれ、スタンフォード大学のBernard Widrow教授の論文 [Generalization and Parameter Estimation in Feed Forward Nets: Some Experiments](https://papers.nips.cc/paper/275-generalization-and-parameter-estimation-in-feedforward-nets-some-experiments.pdf) が元ネタのようです。

**免責** 本記事の内容は個人的見解であり、所属組織の公式見解ではありません。