.. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_model_selection_plot_grid_search_digits.py: ============================================================ Parameter estimation using grid search with cross-validation ============================================================ This examples shows how a classifier is optimized by cross-validation, which is done using the :class:`sklearn.model_selection.GridSearchCV` object on a development set that comprises only half of the available labeled data. The performance of the selected hyper-parameters and trained model is then measured on a dedicated evaluation set that was not used during the model selection step. More details on tools available for model selection can be found in the sections on :ref:`cross_validation` and :ref:`grid_search`. .. rst-class:: sphx-glr-script-out Out: .. code-block:: none # Tuning hyper-parameters for precision Best parameters set found on development set: {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'} Grid scores on development set: 0.986 (+/-0.016) for {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'} 0.959 (+/-0.028) for {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'} 0.988 (+/-0.017) for {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'} 0.982 (+/-0.026) for {'C': 10, 'gamma': 0.0001, 'kernel': 'rbf'} 0.988 (+/-0.017) for {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'} 0.983 (+/-0.026) for {'C': 100, 'gamma': 0.0001, 'kernel': 'rbf'} 0.988 (+/-0.017) for {'C': 1000, 'gamma': 0.001, 'kernel': 'rbf'} 0.983 (+/-0.026) for {'C': 1000, 'gamma': 0.0001, 'kernel': 'rbf'} 0.974 (+/-0.012) for {'C': 1, 'kernel': 'linear'} 0.974 (+/-0.012) for {'C': 10, 'kernel': 'linear'} 0.974 (+/-0.012) for {'C': 100, 'kernel': 'linear'} 0.974 (+/-0.012) for {'C': 1000, 'kernel': 'linear'} Detailed classification report: The model is trained on the full development set. The scores are computed on the full evaluation set. precision recall f1-score support 0 1.00 1.00 1.00 89 1 0.97 1.00 0.98 90 2 0.99 0.98 0.98 92 3 1.00 0.99 0.99 93 4 1.00 1.00 1.00 76 5 0.99 0.98 0.99 108 6 0.99 1.00 0.99 89 7 0.99 1.00 0.99 78 8 1.00 0.98 0.99 92 9 0.99 0.99 0.99 92 accuracy 0.99 899 macro avg 0.99 0.99 0.99 899 weighted avg 0.99 0.99 0.99 899 # Tuning hyper-parameters for recall Best parameters set found on development set: {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'} Grid scores on development set: 0.986 (+/-0.019) for {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'} 0.957 (+/-0.028) for {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'} 0.987 (+/-0.019) for {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'} 0.981 (+/-0.028) for {'C': 10, 'gamma': 0.0001, 'kernel': 'rbf'} 0.987 (+/-0.019) for {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'} 0.982 (+/-0.026) for {'C': 100, 'gamma': 0.0001, 'kernel': 'rbf'} 0.987 (+/-0.019) for {'C': 1000, 'gamma': 0.001, 'kernel': 'rbf'} 0.982 (+/-0.026) for {'C': 1000, 'gamma': 0.0001, 'kernel': 'rbf'} 0.971 (+/-0.010) for {'C': 1, 'kernel': 'linear'} 0.971 (+/-0.010) for {'C': 10, 'kernel': 'linear'} 0.971 (+/-0.010) for {'C': 100, 'kernel': 'linear'} 0.971 (+/-0.010) for {'C': 1000, 'kernel': 'linear'} Detailed classification report: The model is trained on the full development set. The scores are computed on the full evaluation set. precision recall f1-score support 0 1.00 1.00 1.00 89 1 0.97 1.00 0.98 90 2 0.99 0.98 0.98 92 3 1.00 0.99 0.99 93 4 1.00 1.00 1.00 76 5 0.99 0.98 0.99 108 6 0.99 1.00 0.99 89 7 0.99 1.00 0.99 78 8 1.00 0.98 0.99 92 9 0.99 0.99 0.99 92 accuracy 0.99 899 macro avg 0.99 0.99 0.99 899 weighted avg 0.99 0.99 0.99 899 | .. code-block:: default from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV from sklearn.metrics import classification_report from sklearn.svm import SVC print(__doc__) # Loading the Digits dataset digits = datasets.load_digits() # To apply an classifier on this data, we need to flatten the image, to # turn the data in a (samples, feature) matrix: n_samples = len(digits.images) X = digits.images.reshape((n_samples, -1)) y = digits.target # Split the dataset in two equal parts X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.5, random_state=0) # Set the parameters by cross-validation tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4], 'C': [1, 10, 100, 1000]}, {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}] scores = ['precision', 'recall'] for score in scores: print("# Tuning hyper-parameters for %s" % score) print() clf = GridSearchCV( SVC(), tuned_parameters, scoring='%s_macro' % score ) clf.fit(X_train, y_train) print("Best parameters set found on development set:") print() print(clf.best_params_) print() print("Grid scores on development set:") print() means = clf.cv_results_['mean_test_score'] stds = clf.cv_results_['std_test_score'] for mean, std, params in zip(means, stds, clf.cv_results_['params']): print("%0.3f (+/-%0.03f) for %r" % (mean, std * 2, params)) print() print("Detailed classification report:") print() print("The model is trained on the full development set.") print("The scores are computed on the full evaluation set.") print() y_true, y_pred = y_test, clf.predict(X_test) print(classification_report(y_true, y_pred)) print() # Note the problem is too easy: the hyperparameter plateau is too flat and the # output model is the same for precision and recall with ties in quality. .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 4.411 seconds) .. _sphx_glr_download_auto_examples_model_selection_plot_grid_search_digits.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: binder-badge .. image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/scikit-learn/scikit-learn/0.23.X?urlpath=lab/tree/notebooks/auto_examples/model_selection/plot_grid_search_digits.ipynb :width: 150 px .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_grid_search_digits.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_grid_search_digits.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_