Uczenie maszynowe z modelami drzewiastymi w Pythonie
Elie Kawerk
Data Scientist
Model uczenia maszynowego:
parametry: uczone na podstawie danych
hiperparametry: nie są uczone z danych, ustawiane przed trenowaniem
max_depth, min_samples_leaf, kryterium podziału ...Problem: wyszukanie optymalnego zestawu hiperparametrów dla algorytmu uczącego.
Rozwiązanie: znalezienie zestawu optymalnych hiperparametrów dającego optymalny model.
Optymalny model: osiąga optymalny wynik.
Wynik: w sklearn domyślnie dokładność (klasyfikacja) i $R^2$ (regresja).
Do oceny zdolności generalizacji stosuje się walidację krzyżową.
W sklearn domyślne hiperparametry modelu nie są optymalne dla wszystkich problemów.
Hiperparametry należy dostroić, aby uzyskać najlepszą wydajność modelu.
Przeszukiwanie siatki
Przeszukiwanie losowe
Optymalizacja bayesowska
Algorytmy genetyczne
....
Ręczne zdefiniowanie siatki dyskretnych wartości hiperparametrów.
Wybór metryki oceny wydajności modelu.
Wyczerpujące przeszukanie siatki.
Dla każdego zestawu hiperparametrów obliczenie wyniku CV modelu.
Optymalne hiperparametry to te, dla których model osiąga najlepszy wynik CV.
max_depth = {2,3,4},min_samples_leaf = {0.05, 0.1}# Import DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# Set seed to 1 for reproducibility
SEED = 1
# Instantiate a DecisionTreeClassifier 'dt'
dt = DecisionTreeClassifier(random_state=SEED)
# Print out 'dt's hyperparameters
print(dt.get_params())
{'class_weight': None,
'criterion': 'gini',
'max_depth': None,
'max_features': None,
'max_leaf_nodes': None,
'min_impurity_decrease': 0.0,
'min_impurity_split': None,
'min_samples_leaf': 1,
'min_samples_split': 2,
'min_weight_fraction_leaf': 0.0,
'presort': False,
'random_state': 1,
'splitter': 'best'}
# Import GridSearchCV from sklearn.model_selection import GridSearchCV# Define the grid of hyperparameters 'params_dt' params_dt = { 'max_depth': [3, 4,5, 6], 'min_samples_leaf': [0.04, 0.06, 0.08], 'max_features': [0.2, 0.4,0.6, 0.8] }# Instantiate a 10-fold CV grid search object 'grid_dt' grid_dt = GridSearchCV(estimator=dt, param_grid=params_dt, scoring='accuracy', cv=10, n_jobs=-1)# Fit 'grid_dt' to the training data grid_dt.fit(X_train, y_train)
# Extract best hyperparameters from 'grid_dt'
best_hyperparams = grid_dt.best_params_
print('Best hyerparameters:\n', best_hyperparams)
Best hyerparameters:
{'max_depth': 3, 'max_features': 0.4, 'min_samples_leaf': 0.06}
# Extract best CV score from 'grid_dt'
best_CV_score = grid_dt.best_score_
print('Best CV accuracy'.format(best_CV_score))
Best CV accuracy: 0.938
# Extract best model from 'grid_dt' best_model = grid_dt.best_estimator_# Evaluate test set accuracy test_acc = best_model.score(X_test,y_test) # Print test set accuracy print("Test set accuracy of best model: {:.3f}".format(test_acc))
Test set accuracy of best model: 0.947
Uczenie maszynowe z modelami drzewiastymi w Pythonie