Maskininlärning med trädbaserade modeller i Python
Elie Kawerk
Data Scientist
Maskininlärningsmodell:
parametrar: lärs in från data
hyperparametrar: lärs inte in från data, anges före träning
max_depth, min_samples_leaf, delningskriterium ...Problem: sök efter en optimal uppsättning hyperparametrar för en inlärningsalgoritm.
Lösning: hitta en optimal uppsättning hyperparametrar som ger en optimal modell.
Optimal modell: ger ett optimalt poängvärde.
Poängvärde: i sklearn används som standard accuracy (klassificering) och $R^2$ (regression).
Korsvalidering används för att uppskatta generaliseringsförmågan.
I sklearn är en modells standardhyperparametrar inte optimala för alla problem.
Hyperparametrar bör justeras för att uppnå bästa möjliga modellprestanda.
Grid Search
Random Search
Bayesian Optimization
Genetic Algorithms
....
Definiera manuellt ett rutnät med diskreta hyperparametervärden.
Ange ett mått för att utvärdera modellprestanda.
Sök igenom hela rutnätet.
Utvärdera CV-poängen för varje uppsättning hyperparametrar.
De optimala hyperparametrarna är de som ger bäst CV-poäng.
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
Maskininlärning med trädbaserade modeller i Python