機械学習に限らず,データ分析の依頼を受ける際によく訊かれるのが、
「どれくらいデータがあればいいですか?」
という質問です。それに対しては、まずは、
「特徴量の数の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だけサンプルがあれば、線形モデルは一意に定まるのです。
ただし現実には、データにノイズが含まれるため、これよりも多めのデータが必要になります。実際に、説明変数の数を変化させながら、必要データ量と精度の関係を調べてみました。
説明変数の数: 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 深層学習の場合
さらに、深層学習モデルになると、必要データ量の見積もりは一層難しくなります。モデルのパラメータ数は数百万〜数億にもなるため、単純にパラメータ数と同程度のデータが必要だと考えるのが自然です。
実際に、ニューラルネットワークの層数を変えながら、必要データ量と精度の関係を調べてみました。
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$ だけに絞ってデータを集めればよいことになります。こうすれば、必要データ量を最小限に抑えられるはずです。
ドメイン知識を活用して適切な特徴量を設計したり、データ収集戦略を練ることで、少ないデータでも高精度なモデルを構築できる可能性があります。機械学習とドメイン知識を組み合わせることが、必要データ量の削減につながるのです。
3.2 データ収集戦略
どのようなデータを収集すべきかを、事前知識に基づいて決定することも重要です。ランダムにデータを集めるのではなく、以下のような戦略的なアプローチが有効です。
- 重要な特徴量の値をカバーするようにデータを収集する
- クラスやラベルのバランスを考慮してデータを収集する
- 実験計画法を用いて、効率的にデータを収集する
限られたリソースの中で、できるだけ情報量の多いデータを集めることが、必要データ量の削減につながります。
3.3 データ量不足への対策テクニック
データ量が不足している場合でも、諦める必要はありません。以下のようなテクニックを活用することで、限られたデータから最大限の情報を引き出すことができます。
手法名 | 概要 |
---|---|
データ拡張 | 回転、反転、ノイズ付加などでデータを水増し |
転移学習 | 事前学習済みモデルをファインチューニング |
アクティブラーニング | 機械学習と人間の相互作用で効率的収集 |
3.4 2024年現在のトレンド
近年、少量のデータから効率的に学習するための手法が注目を集めています。
Few-shot Learning
Few-shot Learningは、1〜5個程度の少量のサンプルから新しいクラスを学習する手法です。以下のような特徴があります。
- メタ学習を用いて、少量のデータから効率的に学習する方法を学ぶ
- サポートセットとクエリセットを用意し、サポートセットから学習した知識でクエリセットを分類する
まだ研究段階の技術ですが、少量データからの学習を可能にする有望なアプローチとして期待されています。
Self-supervised Learning
Self-supervised Learningは、ラベル付けされていない大量のデータから、教師なし学習で汎用的な特徴表現を学習する手法です。以下のような特徴があります。
- データに含まれる何らかの構造(色の似ている領域は近くに位置するなど)を手がかりに、特徴を学習する
- 特徴表現の学習とタスクの学習を分離することで、少量のラベル付きデータでも高精度なモデルを構築できる
事前学習済みモデルの性能を上回る結果も報告されており、今後の発展が期待されています。
まとめ
必要データ量を見積もることは簡単ではありません。説明変数の数やモデルの複雑さに応じて変わりますし、ドメイン知識の活用具合にも依存します。
しかし、本記事で紹介したような考え方を理解し、適切な戦略を立てることで、効率的にデータを収集し、少量のデータから最大限の情報を引き出すことができます。
- 説明変数の数を減らし、モデルをシンプルに保つ
- ドメイン知識を活用して、データ収集を効率化する
- データ拡張、転移学習、アクティブラーニングなどの手法を活用する
- 新しい技術動向にも注目し、柔軟に取り入れる
データ量が少ないからといって、諦める必要はありません。
知恵を絞ることで、制約の中でもベストな結果を追求することが可能です。
免責 本記事の内容は個人的見解であり、所属組織の公式見解ではありません。
-
特徴量の数の10倍というのは 10倍ルール や バーニーおじさんのルール と呼ばれ、スタンフォード大学のBernard Widrow教授の論文 Generalization and Parameter Estimation in Feed Forward Nets: Some Experiments が元ネタのようです。 ↩