Búsqueda aleatoria

Supongamos que tenemos solo dos hiperparámetros que pueden tomar valores entre 0 y 100. La combinación ideal para los datos siendo analizados puede ser "hiperparámetro1 = 37, hiperparámetro2 = 85" (por ejemplo), es decir, el punto (37, 85) del plano formado por todas las combinaciones posibles. La primera estrategia a seguir es una búsqueda aleatoria: generamos combinaciones aleatorias para los dos hiperparámetros buscando aquella que genere un mejor resultado. Probémosla con el dataset Iris de seaborn:

iris = sns.load_dataset("iris")

y = iris.pop("species")
X = iris
del(iris)

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 16)

...y el clasificador RandomForestClassifier, probando combinaciones de los argumentos max_depth y max_min_samples. Para ello vamos a generar números enteros aleatorios entre 1 y 10 para el primer argumento mencionado y entre 2 y 20 para el segundo, almacenando los mejores valores encontrados en variables creadas con este objetivo:

from sklearn.ensemble import RandomForestClassifier

best_max_depth = -1
best_min_samples_split = -1
best_score = -1

Ahora repetimos un cierto número de veces el proceso de generación aleatoria de valores para los dos parámetros mencionados, creación del modelo, entrenamiento y estimación del "score" (la exactitud o accuracy, por defecto):

import random

for i in range(100):
    max_depth = random.randint(1, 10)
    min_samples_split = random.randint(2, 20)
    model = RandomForestClassifier(n_estimators = 100, random_state = 0,
        max_depth = max_depth, min_samples_split = min_samples_split)
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)
    if score > best_score:
        best_score = score
        best_max_depth = max_depth
        best_min_samples_split = min_samples_split
        print("Best score: {} (max_depth = {}, min_samples_split = {})".format(score, max_depth, min_samples_split))

Best score: 0.868421052631579 (max_depth = 9, min_samples_split = 17)
Best score: 0.8947368421052632 (max_depth = 10, min_samples_split = 2)
Best score: 0.9473684210526315 (max_depth = 1, min_samples_split = 16)

Durante este proceso se han encontrado tres combinaciones que mejoraban el mejor score hasta ese momento. Finalmente, la mejor ha sido la correspondiente a max_depth = 1 y min_samples_split = 16.