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.