見出し画像

胴元の優位性とリスク

Numeraiのようなプラットフォームでは、多くのプレイヤーから予想を提出させ、その中から最良の予測値を選ぶ仕組みがあります。しかし、このロジックの背後には何があるのでしょうか?ここでは弱学習機とアンサンブルの観点から解釈します。

弱学習機とアンサンブル

強いプレイヤーはいわゆる「シグナル」を含んだ予想値を提出します。それに対し、弱いプレイヤーはシグナルがほとんど含まれていない「ノイズ」を提出します。

ポイントとなるのは、強いプレイヤーが提出する予想値がほとんどノイズを含まない場合です。そのような場合、プレイヤーは予想値を胴元に渡す代わりに、自分で運用するでしょう。したがって、予測対象は単独のプレイヤーにとってはシグナルを含むものの、ノイズが多すぎて自分で運用するには難しいものでなければなりません。

ここで、強いプレイヤーと弱いプレイヤーの数をそれぞれ $n$ と $n**k$ としましょう。つまり、ノイズの方が多いのです。これらをアンサンブルすると、参加者の数が多ければ多いほど胴元は正答率を上げることができます。

import numpy as np
import matplotlib.pyplot as plt

def signal_learner():
    return 1 + np.random.randint(0, 2)

def noise_learner():
    return np.random.randint(0, 2)

def ensemble_model_with_size(n):
    signal_results = [signal_learner() for _ in range(n)]
    noise_results = [noise_learner() for _ in range(n**2)]
    all_results = signal_results + noise_results
    return 1 if all_results.count(1) > all_results.count(0) else 0

def simulate_accuracy_with_size(max_n, num_samples):
    accuracies = []
    sizes = range(1, max_n + 1)
    for n in sizes:
        correct_count = 0
        for _ in range(num_samples):
            correct_count += ensemble_model_with_size(n)
        accuracies.append(correct_count / num_samples)
    return sizes, accuracies


# Define the ensemble model with variable noise size (power of n)
def ensemble_model_with_power(n, k):
    signal_results = [signal_learner() for _ in range(n)]
    noise_results = [noise_learner() for _ in range(int(n**k))]  # Convert to integer
    all_results = signal_results + noise_results
    return 1 if all_results.count(1) > all_results.count(0) else 0


def simulate_accuracy_with_power(max_n, num_samples, k_values):
    results = {}
    sizes = range(1, max_n + 1)
    for k in k_values:
        accuracies = []
        for n in sizes:
            correct_count = 0
            for _ in range(num_samples):
                correct_count += ensemble_model_with_power(n, k)
            accuracies.append(correct_count / num_samples)
        results[k] = accuracies
    return sizes, results

# Power values to consider
k_values = [0.5, 1, 1.5, 2, 2.5, 3]

# Simulation settings
max_n = 10
num_samples = 1000


# Run the simulation with the corrected code
sizes, results = simulate_accuracy_with_power(max_n, num_samples, k_values)

# Plot the results
plt.figure(figsize=(12, 8))
for k, accuracies in results.items():
    plt.plot(sizes, accuracies, linewidth=2, label=f'k={k}')
plt.xlabel('Number of Signal Learners (n)')
plt.ylabel('Accuracy')
plt.title('Ensemble Model Accuracy with n Signal Learners and n^k Noise Learners')
plt.legend()
plt.show()
参加者の数と同時にアンサンブルで正解率は向上する

この図からもわかるように、参加者の数と同時にアンサンブルによる正解率は向上します。

独立性に関するリスク

アンサンブルの成功には独立性が重要なポイントです。プレイヤーたちは株価などのノイズを含んだ同じデータから機械学習などで予測値を提出します。しかし、原理的には同じノイズからしか関数を生成できないため、独立でない関数の和を平均化しているだけになります。このため、うまく機能しない可能性があります。

まとめ

弱学習機とアンサンブルの組み合わせにより、予測の精度を向上させることが可能です。しかし、その際の独立性の確保は重要な課題となります。特に、ノイズの影響を正しく管理し、弱学習機間の相関を最小限に抑える戦略が求められるでしょう。



この記事が気に入ったらサポートをしてみませんか?