LoginSignup
1
0

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

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

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

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

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

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

まとめ

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

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

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

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

  1. 特徴量の数の10倍というのは 10倍ルールバーニーおじさんのルール と呼ばれ、スタンフォード大学のBernard Widrow教授の論文 Generalization and Parameter Estimation in Feed Forward Nets: Some Experiments が元ネタのようです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0