Optimalizace hyperparametrů pomocí Hyperoptu

Dokončeno

Hyperopt je opensourcová knihovna Pythonu pro ladění hyperparametrů. Hyperopt se automaticky nainstaluje při vytváření clusteru s variantou ML databricks Runtime. Pokud ho chcete použít při trénování modelu, postupujte takto:

  1. Definujte funkci cíle pro trénování a vyhodnocení modelu.
  2. Definování prostoru hledání hyperparametrů.
  3. Určení vyhledávacího algoritmu.
  4. Spuštěním funkce Hyperopt fmin optimalizujte trénovací funkci.

Definování objektivní funkce

Hyperopt funguje iterativním voláním funkce (často označované jako cílová funkce), která vrací číselnou hodnotu a ladí parametry předané funkci tak, aby byla vrácená hodnota minimalizována; přístup běžně označovaný jako optimalizace. Prvním požadavkem je tedy zapouzdření logiky trénování a vyhodnocení modelu ve funkci, která:

  • Přijímá parametr obsahující seznam hodnot hyperparametrů.
  • Trénuje model pomocí zadaných hodnot hyperparametrů.
  • Vyhodnotí model na základě cílové metriky pro prediktivní výkon.
  • Vrátí číselnou hodnotu, která odráží metriku výkonu, aby zlepšení výkonu modelu snížilo návratovou hodnotu.

Například následující funkce trénuje model strojového učení pomocí algoritmu LogisticRegression z knihovny Spark MLlib.

def objective(params):
    from pyspark.ml.classification import LogisticRegression
    from pyspark.ml.evaluation import MulticlassClassificationEvaluator
    from hyperopt import STATUS_OK

    data_df = get_training_data() # This is just an example!
    splits = data_df.randomSplit([0.7, 0.3])
    training_df = splits[0]
    validation_df = splits[1]

    # Train a model using the provided hyperparameter values
    lr = LogisticRegression(labelCol="label", featuresCol="features",
                            maxIter=params['Iterations'],
                            regParam=params['Regularization'])
    model = lr.fit(training_df)

    # Evaluate the model
    predictions = model.transform(validation_df)
    eval = MulticlassClassificationEvaluator(labelCol="label",
                                             predictionCol="prediction",
                                             metricName="accuracy")
    accuracy = eval.evaluate(predictions)
    
    # Hyperopt *minimizes* the function, so return *negative* accuracy.
    return {'loss': -accuracy, 'status': STATUS_OK}

V tomto příkladu je parametr parametru slovník obsahující hodnoty pro dvě pojmenované hodnoty: Iterace a Regularization. Tyto hodnoty jsou přiřazeny k hyperparametrům maxIter a regParam algoritmu logistické regrese použitému k trénování modelu.

Funkce pak vyhodnocuje natrénovaný model, aby vypočítal metriku přesnosti , což je hodnota mezi 0,0 a 1,0 označující podíl předpovědí, které model provedl správně.

Funkce nakonec vrátí hodnotu, kterou by hyperopt měl minimalizovat, aby se model zlepšil. V tomto případě je cílová metrika přesností, pro kterou vyšší hodnota označuje lepší model; takže funkce vrátí zápornou hodnotu této hodnoty (tím vyšší je přesnost, tím nižší vrácená hodnota).

Definování vyhledávacího prostoru hyperparametrů

Pokaždé, když je volána cílová funkce, vyžaduje parametr obsahující hodnoty hyperparametrů, které se mají vyzkoušet. Pokud chcete vyzkoušet všechny možné kombinace hodnot, musíte definovat vyhledávací prostor pro Hyperopt, ze které chcete vybrat hodnoty pro každou zkušební verzi.

Hyperopt poskytuje výrazy, které můžete použít k definování rozsahu hodnot pro každý hyperparametr, včetně:

  • hp.choice(label, options): Vrátí jednu z options uvedených hodnot.
  • hp.randint(label, upper): Vrátí náhodné celé číslo v oblasti [0, horní].
  • hp.uniform(label, low, high): Vrátí stejnou hodnotu mezi low a high.
  • hp.normal(label, mu, sigma): Vrátí reálnou hodnotu, která je normálně distribuovaná střední a mu směrodatnou odchylkou sigma.

Tip

Úplný seznam výrazů najdete v dokumentaci k Hyperoptu.

Následující příklad kódu definuje vyhledávací prostor pro hyperparametry použité v předchozím příkladu:

from hyperopt import hp

search_space = {
    'Iterations': hp.randint('Iterations', 10),
    'Regularization': hp.uniform('Regularization', 0.0, 1.0)
}

Určení vyhledávacího algoritmu

Hyperopt používá vyhledávací algoritmus k výběru hodnot hyperparametrů z vyhledávacího prostoru a pokusu o optimalizaci účelové funkce. Existují dvě hlavní možnosti, jak Hyperopt vzorky přes vyhledávací prostor:

  • hyperopt.tpe.suggest: Strom parzenských estimátorů (TPE), bayesiánský přístup, který adaptivní výběr nových nastavení hyperparametrů na základě minulých výsledků.
  • hyperopt.rand.suggest: Náhodné vyhledávání, neadaptivní přístup, který náhodně vzorkuje přes vyhledávací prostor.

Následující ukázkový kód určuje algoritmus TPE.

from hyperopt import tpe

algo = tpe.suggest

Spuštění funkce Hyperopt fmin

Nakonec ke spuštění Hyperoptu můžete použít funkci fmin , která opakovaně volá funkci cíle pomocí kombinací hyperparametrů z vyhledávacího prostoru založeného na vyhledávacím algoritmu. Cílem funkce fmin je minimalizovat hodnotu vrácenou objektivní funkcí (a tím optimalizovat výkon modelu).

Následující příklad kódu používá funkci fmin k volání objektivní funkce definované dříve. Použije se vyhledávací prostor a algoritmus definovaný v předchozích příkladech a funkce se vyhodnotí až 100krát, než funkce fmin vrátí nejlepší kombinaci hodnot parametrů, která byla nalezena.

from hyperopt import fmin

argmin = fmin(
  fn=objective,
  space=search_space,
  algo=algo,
  max_evals=100)

print("Best param values: ", argmin)

Výstup z předchozího kódu vypadá podobně jako v následujícím příkladu.

Best param values:  {'Iterations': 6, 'Regularization': 0.5461699702338606}