2424from ..base import MetaEstimatorMixin
2525from ._split import check_cv
2626from ._validation import _fit_and_score
27+ from ..exceptions import NotFittedError
2728from ..externals .joblib import Parallel , delayed
2829from ..externals import six
2930from ..utils import check_random_state
@@ -414,6 +415,15 @@ def score(self, X, y=None):
414415 % self .best_estimator_ )
415416 return self .scorer_ (self .best_estimator_ , X , y )
416417
418+ def _check_is_fitted (self , method_name ):
419+ if not self .refit :
420+ raise NotFittedError (('This GridSearchCV instance was initialized '
421+ 'with refit=False. %s is '
422+ 'available only after refitting on the best '
423+ 'parameters. ' ) % method_name )
424+ else :
425+ check_is_fitted (self , 'best_estimator_' )
426+
417427 @if_delegate_has_method (delegate = 'estimator' )
418428 def predict (self , X ):
419429 """Call predict on the estimator with the best found parameters.
@@ -428,6 +438,7 @@ def predict(self, X):
428438 underlying estimator.
429439
430440 """
441+ self ._check_is_fitted ('predict' )
431442 return self .best_estimator_ .predict (X )
432443
433444 @if_delegate_has_method (delegate = 'estimator' )
@@ -444,6 +455,7 @@ def predict_proba(self, X):
444455 underlying estimator.
445456
446457 """
458+ self ._check_is_fitted ('predict_proba' )
447459 return self .best_estimator_ .predict_proba (X )
448460
449461 @if_delegate_has_method (delegate = 'estimator' )
@@ -460,6 +472,7 @@ def predict_log_proba(self, X):
460472 underlying estimator.
461473
462474 """
475+ self ._check_is_fitted ('predict_log_proba' )
463476 return self .best_estimator_ .predict_log_proba (X )
464477
465478 @if_delegate_has_method (delegate = 'estimator' )
@@ -476,6 +489,7 @@ def decision_function(self, X):
476489 underlying estimator.
477490
478491 """
492+ self ._check_is_fitted ('decision_function' )
479493 return self .best_estimator_ .decision_function (X )
480494
481495 @if_delegate_has_method (delegate = 'estimator' )
@@ -492,11 +506,12 @@ def transform(self, X):
492506 underlying estimator.
493507
494508 """
509+ self ._check_is_fitted ('transform' )
495510 return self .best_estimator_ .transform (X )
496511
497512 @if_delegate_has_method (delegate = 'estimator' )
498513 def inverse_transform (self , Xt ):
499- """Call inverse_transform on the estimator with the best found parameters .
514+ """Call inverse_transform on the estimator with the best found params .
500515
501516 Only available if the underlying estimator implements
502517 ``inverse_transform`` and ``refit=True``.
@@ -508,6 +523,7 @@ def inverse_transform(self, Xt):
508523 underlying estimator.
509524
510525 """
526+ self ._check_is_fitted ('inverse_transform' )
511527 return self .best_estimator_ .transform (Xt )
512528
513529 def _fit (self , X , y , labels , parameter_iterable ):
0 commit comments