Optimalizace hyperparametrů pomocí Hyperoptu
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:
- Definujte funkci cíle pro trénování a vyhodnocení modelu.
- Definování prostoru hledání hyperparametrů.
- Určení vyhledávacího algoritmu.
- 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 zoptions
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 mezilow
ahigh
.hp.normal(label, mu, sigma)
: Vrátí reálnou hodnotu, která je normálně distribuovaná střední amu
směrodatnou odchylkousigma
.
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}