Machine Learning avec des modèles à base d'arbres en Python
Elie Kawerk
Data Scientist
Modèle de Machine Learning :
paramètres : appris à partir des données
hyperparamètres : non appris, définis avant l'entraînement
max_depth, min_samples_leaf, critère de division…Problème : trouver un ensemble d'hyperparamètres optimaux pour un algorithme d'apprentissage.
Solution : repérer l'ensemble d'hyperparamètres qui donne un modèle optimal.
Modèle optimal : produit un score optimal.
Score : par défaut dans sklearn, exactitude (classification) et $R^2$ (régression).
La validation croisée sert à estimer la performance de généralisation.
In sklearn, a model's default hyperparameters are not optimal for all problems.
Hyperparameters should be tuned to obtain the best model performance.
Recherche par grille
Recherche aléatoire
Optimisation bayésienne
Algorithmes génétiques
…
Définir manuellement une grille de valeurs discrètes d'hyperparamètres.
Choisir une mesure pour évaluer la performance.
Parcourir la grille de façon exhaustive.
Pour chaque ensemble, évaluer le score de VC de chaque modèle.
Les hyperparamètres optimaux sont ceux du modèle au meilleur score de VC.
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 avec des modèles à base d'arbres en Python