Dostrajanie hiperparametrów lasu losowego
Podobnie jak w przypadku innych modeli, chcemy zoptymalizować wydajność przez dostrojenie hiperparametrów. Lasy losowe mają wiele hiperparametrów, ale najważniejszym jest często liczba cech losowanych przy każdym podziale – w RandomForestRegressor z biblioteki sklearn odpowiada za to parametr max_features. W modelach takich jak lasy losowe, które mają wbudowany element losowości, warto też ustawić random_state, aby wyniki były powtarzalne.
Zazwyczaj do przeszukiwania hiperparametrów można użyć metody GridSearchCV() ze sklearn, jednak w przypadku finansowych szeregów czasowych nie chcemy stosować walidacji krzyżowej – mogłoby to doprowadzić do mieszania danych. Zależy nam na tym, żeby modele były trenowane na starszych danych i oceniane na nowszych. Dlatego użyjemy ParameterGrid ze sklearn, aby wygenerować kombinacje hiperparametrów do przeszukania.
To ćwiczenie jest częścią kursu
Uczenie maszynowe w finansach z Pythonem
Instrukcje do ćwiczenia
- Ustaw hiperparametr
n_estimatorsjako listę z jedną wartością (200) w słownikugrid. - Ustaw hiperparametr
max_featuresjako listę zawierającą wartości 4 i 8 w słownikugrid. - Dopasuj model regresji lasu losowego (
rfr, już utworzony) dotrain_featuresitrain_targetsdla każdej kombinacji hiperparametrówgw pętli. - Oblicz R\(^2\), używając
rfr.score()natest_features, i dołącz wynik do listytest_scores.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
from sklearn.model_selection import ParameterGrid
# Create a dictionary of hyperparameters to search
grid = {____, 'max_depth': [3], 'max_features': ____, 'random_state': [42]}
test_scores = []
# Loop through the parameter grid, set the hyperparameters, and save the scores
for g in ParameterGrid(grid):
rfr.set_params(**g) # ** is "unpacking" the dictionary
rfr.fit(____, ____)
test_scores.append(rfr.score(____, ____))
# Find best hyperparameters from the test score and print
best_idx = np.argmax(test_scores)
print(test_scores[best_idx], ParameterGrid(grid)[best_idx])