学習データ集合#
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近傍 / ペア / 参照点
ラベル付け軸:値の割り当て方 — 生の目的値(回帰) / 二値分類 / 多段階ランキング / ペア比較
文献パターンとの対応#
組み込みのTrainingSet#
クラス |
パラメータ |
説明 |
|---|---|---|
|
なし |
アーカイブ全体を生の目的値とともに使います。 |
|
|
|
|
なし |
アーカイブ全体を生の制約値とともに使います |
|
|
|
|
|
による二値分類ラベル |
|
|
ソート後、上位 |
|
|
ソート後、 |
|
|
2点をペアにし、比較の勝敗をラベル付けします |
|
|
アーカイブ上の点が参照点を支配するかどうかの二値ラベル。 |
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_setargument。Surrogate:
TrainingDataの受け渡し先です。PairwiseComparisonSetはComparisonSurrogate系と組み合わせる必要があります。Comparator:
TopKBipartitionSet/LevelBasedSet/PairwiseComparisonSet/ReferencePointComparisonSetで使うソートと比較。