学習データ集合#

Layer 3: Extend Components

GlobalSurrogateManager/LocalSurrogateManager/PairwiseSurrogateManagerは、交換可能なコンポーネントであるTrainingSetに学習データの構築を委譲します。training_set引数で渡します。

TrainingSetの役割#

TrainingSetが実装する必要があるメソッドはbuild(archive, population, ctx, candidate_x=None) -> TrainingDataの1つだけです。candidate_xは、LocalSurrogateManagerが候補ごとのk-NN検索中心として渡す引数です。GlobalSurrogateManagerはNoneを渡して呼び出します。

TrainingDataは、train_x(通常は形状(n_train, dim)で、PairwiseComparisonSetだけが(n_train, 2*dim)を使います)と、回帰では(n_train, n_obj)、分類またはランキングでは(n_train,)となるtrain_yを保持するデータクラスです。

組み込みの8クラスは、直交する2つの軸に沿って整理されています。

  • データソース軸:学習データの取得元 — アーカイブ / 個体群 / k近傍 / ペア / 参照点

  • ラベル付け軸:値の割り当て方 — 生の目的値(回帰) / 二値分類 / 多段階ランキング / ペア比較

文献パターンとの対応#

パターン

出典

対応クラス

P1 CA-LLSO

[20]

LevelBasedSet

P2 CPS-MOEA

[21]

TopKBipartitionSet

P3 Pairwise SAEA

[22]

PairwiseComparisonSet

P4 SAPSO pbest

(一般)

ReferencePointComparisonSet

P5 CSEA / 事前選択

(一般)

KNNObjectiveSet, ArchiveObjectiveSet

P6 制約BO

[17, 23]

ConstraintObjectiveSet, KNNConstraintObjectiveSet

組み込みのTrainingSet#

クラス

パラメータ

説明

ArchiveObjectiveSet

なし

アーカイブ全体を生の目的値とともに使います。GlobalSurrogateManagerの既定値です。

KNNObjectiveSet

n_neighbors=50

candidate_xに最も近いアーカイブ上のk点。LocalSurrogateManagerの既定値。

ConstraintObjectiveSet

なし

アーカイブ全体を生の制約値とともに使います g。

KNNConstraintObjectiveSet

n_neighbors=50

ConstraintObjectiveSetのk-NN版

FeasibilityClassificationSet

source="archive"

による二値分類ラベル cv <= eps_cv。

TopKBipartitionSet

source="archive", top_ratio=0.5

ソート後、上位floor(n * top_ratio)件にlabel=1、残りにlabel=0を付けます。

LevelBasedSet

source="population", n_levels=5

ソート後、n_levels個の等分されたグループに複数レベルのラベルを割り当てます。

PairwiseComparisonSet

source="archive", n_pairs=None, rng=None

2点をペアにし、比較の勝敗をラベル付けします

ReferencePointComparisonSet

ref_source="population_best"

アーカイブ上の点が参照点を支配するかどうかの二値ラベル。

ConstraintObjectiveSet/KNNConstraintObjectiveSetは、問題に制約がない場合(archive.gの列数が0)にValueErrorを送出します。

FeasibilityClassificationSetの実行可能性判定に使うeps_cvはctx.problem.eps_cvから取得し、ctx=Noneの場合は1e-6にフォールバックします。

source引数を持つクラス(FeasibilityClassificationSet/TopKBipartitionSet/LevelBasedSet/PairwiseComparisonSet)は、source="population"を指定したときにpopulation=Noneであれば、いずれもValueErrorを送出します。

PairwiseComparisonSetは、各ペア(a, b)についてtrain_x = [x_a, x_b]を連結し、形状(n_pairs, 2*dim)の配列を構築します。comparator.compare(f_a, cv_a, f_b, cv_b) <= 0(aがbに勝つか同点)の場合は1、それ以外は0とラベル付けします。n_pairs=Noneの場合は、すべてのペアn*(n-1)/2個を使います。

警告

PairwiseComparisonSetのtrain_xは(n_pairs, 2*dim)という特殊な形状であり、RBFSurrogateのような標準的な回帰サロゲートとは形状が非互換です。 ComparisonSurrogate系のペア比較専用サロゲートと組み合わせる必要があります。

PairwiseComparisonSetと異なり、ReferencePointComparisonSetのtrain_xは(n_archive, dim)だけなので、GlobalSurrogateManager/LocalSurrogateManagerと互換性があります。

独自TrainingSetの実装方法#

独自の学習データ抽出方式が必要な場合は、TrainingSetをサブクラス化し、build()だけを実装します。次の例は、直近に追加されたk件だけを学習データとして使う実装です。

from saealib import TrainingSet, TrainingData


class RecentKSet(TrainingSet):
    """Uses only the most recently added k entries as training data."""

    def __init__(self, k: int = 20):
        self.k = k

    def build(self, archive, population, ctx, candidate_x=None):
        x = archive.get_array("x")[-self.k :]
        y = archive.get_array("f")[-self.k :]
        return TrainingData(train_x=x, train_y=y)

関連コンポーネント#

  • SurrogateManager: managers と a training_set argument。

  • Surrogate:TrainingDataの受け渡し先です。PairwiseComparisonSetはComparisonSurrogate系と組み合わせる必要があります。

  • Comparator:TopKBipartitionSet/LevelBasedSet/PairwiseComparisonSet/ReferencePointComparisonSetで使うソートと比較。

参照#