Machine Learning with Tree-Based Models in Python
Elie Kawerk
Data Scientist
Model strojového učení:
parametry: naučené z dat
hyperparametry: nenaučené z dat, nastavené před trénováním
max_depth, min_samples_leaf, kritérium rozdělení ...Problém: hledání optimální sady hyperparametrů pro algoritmus učení.
Řešení: nalezení optimálních hyperparametrů vedoucích k optimálnímu modelu.
Optimální model: dosahuje optimálního skóre.
Skóre: v sklearn výchozí hodnoty jsou přesnost (klasifikace) a $R^2$ (regrese).
Křížová validace se používá k odhadu generalizačního výkonu.
V sklearn nejsou výchozí hyperparametry modelu optimální pro všechny úlohy.
Hyperparametry by měly být laděny pro dosažení nejlepšího výkonu modelu.
Prohledávání mřížky
Náhodné prohledávání
Bayesovská optimalizace
Genetické algoritmy
....
Ručně definujte mřížku diskrétních hodnot hyperparametrů.
Zvolte metriku pro hodnocení výkonu modelu.
Vyčerpávajícím způsobem prohledejte mřížku.
Pro každou sadu hyperparametrů vyhodnoťte CV skóre modelu.
Optimální hyperparametry jsou ty modelu s nejlepším CV skóre.
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
Machine Learning with Tree-Based Models in Python