Aprendizado de máquina com modelos baseados em árvores em Python
Elie Kawerk
Data Scientist
Modelo de machine learning:
parâmetros: aprendidos dos dados
hiperparâmetros: não aprendidos; definidos antes do treino
max_depth, min_samples_leaf, critério de divisão...Problema: buscar um conjunto de hiperparâmetros ótimos para um algoritmo.
Solução: achar o conjunto que gera o modelo ótimo.
Modelo ótimo: entrega o melhor score.
Score: no sklearn, padrão é accuracy (classificação) e $R^2$ (regressão).
Usamos validação cruzada para estimar a generalização.
No sklearn, hiperparâmetros padrão não servem para todo problema.
Devem ser ajustados para obter a melhor performance.
Grid Search
Random Search
Otimização Bayesiana
Algoritmos Genéticos
...
Defina manualmente uma grade de valores discretos.
Escolha uma métrica de avaliação.
Busque exaustivamente na grade.
Para cada conjunto, avalie o score de CV.
Os hiperparâmetros ótimos são os do modelo com melhor score de 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
Aprendizado de máquina com modelos baseados em árvores em Python