diff --git a/sklearn/decomposition/online_lda.py b/sklearn/decomposition/online_lda.py
index 68900a3ea07646736a163346a54e0e8834da3690..7cfcb0ae4396c99b449c1f7c75858d86394c59a4 100644
--- a/sklearn/decomposition/online_lda.py
+++ b/sklearn/decomposition/online_lda.py
@@ -13,13 +13,13 @@ Link: http://matthewdhoffman.com/code/onlineldavb.tar
 
 import numpy as np
 import scipy.sparse as sp
-from scipy.misc import logsumexp
 from scipy.special import gammaln
 import warnings
 
 from ..base import BaseEstimator, TransformerMixin
 from ..utils import (check_random_state, check_array,
                      gen_batches, gen_even_slices, _get_n_jobs)
+from ..utils.fixes import logsumexp
 from ..utils.validation import check_non_negative
 from ..externals.joblib import Parallel, delayed
 from ..externals.six.moves import xrange
diff --git a/sklearn/ensemble/gradient_boosting.py b/sklearn/ensemble/gradient_boosting.py
index 779cf2d3b543cd72c5cdde6a730bfb8e402543e3..baa0d7b0aebbdb894d78b8a33b2223bb0afcface 100644
--- a/sklearn/ensemble/gradient_boosting.py
+++ b/sklearn/ensemble/gradient_boosting.py
@@ -27,7 +27,6 @@ from abc import ABCMeta
 from abc import abstractmethod
 
 from .base import BaseEnsemble
-from ..base import BaseEstimator
 from ..base import ClassifierMixin
 from ..base import RegressorMixin
 from ..externals import six
@@ -40,7 +39,6 @@ import numbers
 import numpy as np
 
 from scipy import stats
-from scipy.misc import logsumexp
 from scipy.sparse import csc_matrix
 from scipy.sparse import csr_matrix
 from scipy.sparse import issparse
@@ -57,6 +55,7 @@ from ..utils import check_X_y
 from ..utils import column_or_1d
 from ..utils import check_consistent_length
 from ..utils import deprecated
+from ..utils.fixes import logsumexp
 from ..utils.stats import _weighted_percentile
 from ..utils.validation import check_is_fitted
 from ..utils.multiclass import check_classification_targets
diff --git a/sklearn/ensemble/tests/test_forest.py b/sklearn/ensemble/tests/test_forest.py
index b964ed768d85e2e1570e39c44f9e415d6b859457..8f09d26df02e26cda93896d279af1ac3acfea35a 100644
--- a/sklearn/ensemble/tests/test_forest.py
+++ b/sklearn/ensemble/tests/test_forest.py
@@ -14,7 +14,6 @@ from itertools import combinations
 from itertools import product
 
 import numpy as np
-from scipy.misc import comb
 from scipy.sparse import csr_matrix
 from scipy.sparse import csc_matrix
 from scipy.sparse import coo_matrix
@@ -42,6 +41,7 @@ from sklearn.ensemble import RandomTreesEmbedding
 from sklearn.model_selection import GridSearchCV
 from sklearn.svm import LinearSVC
 from sklearn.utils.validation import check_random_state
+from sklearn.utils.fixes import comb
 
 from sklearn.tree.tree import SPARSE_SPLITTERS
 
diff --git a/sklearn/linear_model/logistic.py b/sklearn/linear_model/logistic.py
index c12b4943807b118272d25072c610d4fcdb31302a..281a4606155a9b4c54bb185c2a8e87c10ca3f0e8 100644
--- a/sklearn/linear_model/logistic.py
+++ b/sklearn/linear_model/logistic.py
@@ -15,7 +15,6 @@ import warnings
 
 import numpy as np
 from scipy import optimize, sparse
-from scipy.misc import logsumexp
 from scipy.special import expit
 
 from .base import LinearClassifierMixin, SparseCoefMixin, BaseEstimator
@@ -27,6 +26,7 @@ from ..utils import check_random_state
 from ..utils.extmath import (log_logistic, safe_sparse_dot, softmax,
                              squared_norm)
 from ..utils.extmath import row_norms
+from ..utils.fixes import logsumexp
 from ..utils.optimize import newton_cg
 from ..utils.validation import check_X_y
 from ..exceptions import NotFittedError
diff --git a/sklearn/linear_model/tests/test_sag.py b/sklearn/linear_model/tests/test_sag.py
index 3d1df5116ba10c840db65676f81c32216b1387c8..02a557d56ef7f6b316a87d390d47e66e21748d3f 100644
--- a/sklearn/linear_model/tests/test_sag.py
+++ b/sklearn/linear_model/tests/test_sag.py
@@ -6,7 +6,6 @@
 import math
 import numpy as np
 import scipy.sparse as sp
-from scipy.misc import logsumexp
 
 from sklearn.linear_model.sag import get_auto_step_size
 from sklearn.linear_model.sag_fast import _multinomial_grad_loss_all_samples
@@ -14,6 +13,7 @@ from sklearn.linear_model import LogisticRegression, Ridge
 from sklearn.linear_model.base import make_dataset
 from sklearn.linear_model.logistic import _multinomial_loss_grad
 
+from sklearn.utils.fixes import logsumexp
 from sklearn.utils.extmath import row_norms
 from sklearn.utils.testing import assert_almost_equal
 from sklearn.utils.testing import assert_array_almost_equal
diff --git a/sklearn/metrics/cluster/supervised.py b/sklearn/metrics/cluster/supervised.py
index 9115b93abefbab8b58879a9e749482b9d18ab778..f1f033bf6fe0b16a171917f71ea04bf596c09d6e 100644
--- a/sklearn/metrics/cluster/supervised.py
+++ b/sklearn/metrics/cluster/supervised.py
@@ -18,11 +18,11 @@ from __future__ import division
 from math import log
 
 import numpy as np
-from scipy.misc import comb
 from scipy import sparse as sp
 
 from .expected_mutual_info_fast import expected_mutual_information
 from ...utils.validation import check_array
+from ...utils.fixes import comb
 
 
 def comb2(n):
diff --git a/sklearn/mixture/base.py b/sklearn/mixture/base.py
index 3c8c701e62e30103a90a39569e573518d587b235..478131a945ef18a2d8801f9240c94d3c14fa2de9 100644
--- a/sklearn/mixture/base.py
+++ b/sklearn/mixture/base.py
@@ -11,7 +11,6 @@ from abc import ABCMeta, abstractmethod
 from time import time
 
 import numpy as np
-from scipy.misc import logsumexp
 
 from .. import cluster
 from ..base import BaseEstimator
@@ -19,6 +18,7 @@ from ..base import DensityMixin
 from ..externals import six
 from ..exceptions import ConvergenceWarning
 from ..utils import check_array, check_random_state
+from ..utils.fixes import logsumexp
 
 
 def _check_shape(param, param_shape, name):
diff --git a/sklearn/mixture/dpgmm.py b/sklearn/mixture/dpgmm.py
index 8e2137b44f58066aacf253b494e99386d35c78cf..3d1858c513b2a645b8c2127b328195ad13ffcb4f 100644
--- a/sklearn/mixture/dpgmm.py
+++ b/sklearn/mixture/dpgmm.py
@@ -21,11 +21,11 @@ import numpy as np
 from scipy.special import digamma as _digamma, gammaln as _gammaln
 from scipy import linalg
 from scipy.linalg import pinvh
-from scipy.misc import logsumexp
 from scipy.spatial.distance import cdist
 
 from ..externals.six.moves import xrange
 from ..utils import check_random_state, check_array, deprecated
+from ..utils.fixes import logsumexp
 from ..utils.extmath import squared_norm, stable_cumsum
 from ..utils.validation import check_is_fitted
 from .. import cluster
diff --git a/sklearn/mixture/gmm.py b/sklearn/mixture/gmm.py
index 3fd659ece818447b007d64c61a4409641c0134ab..79ff8d169dcd83af4e1e9a4490415ae9ace08e4b 100644
--- a/sklearn/mixture/gmm.py
+++ b/sklearn/mixture/gmm.py
@@ -19,10 +19,10 @@ from time import time
 
 import numpy as np
 from scipy import linalg
-from scipy.misc import logsumexp
 
 from ..base import BaseEstimator
 from ..utils import check_random_state, check_array, deprecated
+from ..utils.fixes import logsumexp
 from ..utils.validation import check_is_fitted
 from .. import cluster
 
diff --git a/sklearn/model_selection/_split.py b/sklearn/model_selection/_split.py
index 7d9c8f9aad9547d261ac25b127e3e75d0231861c..d4cd2537e524035343f011990e35e0ecc648a232 100644
--- a/sklearn/model_selection/_split.py
+++ b/sklearn/model_selection/_split.py
@@ -22,14 +22,13 @@ from abc import ABCMeta, abstractmethod
 
 import numpy as np
 
-from scipy.misc import comb
 from ..utils import indexable, check_random_state, safe_indexing
 from ..utils.validation import _num_samples, column_or_1d
 from ..utils.validation import check_array
 from ..utils.multiclass import type_of_target
 from ..externals.six import with_metaclass
 from ..externals.six.moves import zip
-from ..utils.fixes import signature
+from ..utils.fixes import signature, comb
 from ..base import _pprint
 
 __all__ = ['BaseCrossValidator',
diff --git a/sklearn/model_selection/tests/test_split.py b/sklearn/model_selection/tests/test_split.py
index ad77ecd7b8242c5c3342b9227c4a97a13b52bff9..93f0dff1891d1c5098335ccbc4125dcf265b25c7 100644
--- a/sklearn/model_selection/tests/test_split.py
+++ b/sklearn/model_selection/tests/test_split.py
@@ -5,7 +5,6 @@ import warnings
 import numpy as np
 from scipy.sparse import coo_matrix, csc_matrix, csr_matrix
 from scipy import stats
-from scipy.misc import comb
 from itertools import combinations
 from itertools import combinations_with_replacement
 
@@ -57,6 +56,8 @@ from sklearn.datasets import make_classification
 from sklearn.externals import six
 from sklearn.externals.six.moves import zip
 
+from sklearn.utils.fixes import comb
+
 from sklearn.svm import SVC
 
 X = np.ones(10)
diff --git a/sklearn/naive_bayes.py b/sklearn/naive_bayes.py
index 5c81dc7041124a92eb427559f383852669b7dedb..fbff00fb672f781d41058ef29ae1645991e3f3ed 100644
--- a/sklearn/naive_bayes.py
+++ b/sklearn/naive_bayes.py
@@ -19,7 +19,6 @@ are supervised learning methods based on applying Bayes' theorem with strong
 from abc import ABCMeta, abstractmethod
 
 import numpy as np
-from scipy.misc import logsumexp
 from scipy.sparse import issparse
 
 from .base import BaseEstimator, ClassifierMixin
@@ -28,6 +27,7 @@ from .preprocessing import LabelBinarizer
 from .preprocessing import label_binarize
 from .utils import check_X_y, check_array, check_consistent_length
 from .utils.extmath import safe_sparse_dot
+from .utils.fixes import logsumexp
 from .utils.multiclass import _check_partial_fit_first_call
 from .utils.validation import check_is_fitted
 from .externals import six
diff --git a/sklearn/utils/extmath.py b/sklearn/utils/extmath.py
index 0e0a211882efed98bc9220bba68b8f62f7cf46ee..687ddd4e4a06c2c8ed74b64c17fa15128281c872 100644
--- a/sklearn/utils/extmath.py
+++ b/sklearn/utils/extmath.py
@@ -17,10 +17,10 @@ import warnings
 import numpy as np
 from scipy import linalg
 from scipy.sparse import issparse, csr_matrix
-from scipy.misc import logsumexp as scipy_logsumexp
 
 from . import check_random_state, deprecated
 from .fixes import np_version
+from .fixes import logsumexp as scipy_logsumexp
 from ._logistic_sigmoid import _log_logistic_sigmoid
 from ..externals.six.moves import xrange
 from .sparsefuncs_fast import csr_row_norms
diff --git a/sklearn/utils/fixes.py b/sklearn/utils/fixes.py
index bfa5c917b0030fce591ce392ac374055bdc4a54a..0e96057f929ffa90501e7efabf4a54ff3135f41c 100644
--- a/sklearn/utils/fixes.py
+++ b/sklearn/utils/fixes.py
@@ -11,8 +11,6 @@ at which the fixe is no longer needed.
 # License: BSD 3 clause
 
 import warnings
-import sys
-import functools
 import os
 import errno
 
@@ -36,6 +34,7 @@ def _parse_version(version_string):
             version.append(x)
     return tuple(version)
 
+
 euler_gamma = getattr(np, 'euler_gamma',
                       0.577215664901532860606512090082402431)
 
@@ -142,11 +141,17 @@ if sp_version < (0, 15):
     # Backport fix for scikit-learn/scikit-learn#2986 / scipy/scipy#4142
     from ._scipy_sparse_lsqr_backport import lsqr as sparse_lsqr
 else:
-    from scipy.sparse.linalg import lsqr as sparse_lsqr
+    from scipy.sparse.linalg import lsqr as sparse_lsqr  # noqa
+
+
+try:  # SciPy >= 0.19
+    from scipy.special import comb, logsumexp
+except ImportError:
+    from scipy.misc import comb, logsumexp  # noqa
 
 
 def parallel_helper(obj, methodname, *args, **kwargs):
-    """Helper to workaround Python 2 limitations of pickling instance methods"""
+    """Workaround for Python 2 limitations of pickling instance methods"""
     return getattr(obj, methodname)(*args, **kwargs)
 
 
diff --git a/sklearn/utils/tests/test_random.py b/sklearn/utils/tests/test_random.py
index 199c2310fbb7ab24966589a9632e3b681e0d27b6..159635c569d53314c923f2d48e2289f77604a2a8 100644
--- a/sklearn/utils/tests/test_random.py
+++ b/sklearn/utils/tests/test_random.py
@@ -2,10 +2,10 @@ from __future__ import division
 
 import numpy as np
 import scipy.sparse as sp
-from scipy.misc import comb as combinations
 from numpy.testing import assert_array_almost_equal
 from sklearn.utils.random import sample_without_replacement
 from sklearn.utils.random import random_choice_csc
+from sklearn.utils.fixes import comb
 
 from sklearn.utils.testing import (
     assert_raises,
@@ -88,7 +88,7 @@ def check_sample_int_distribution(sample_without_replacement):
         # Counting the number of combinations is not as good as counting the
         # the number of permutations. However, it works with sampling algorithm
         # that does not provide a random permutation of the subset of integer.
-        n_expected = combinations(n_population, n_samples, exact=True)
+        n_expected = comb(n_population, n_samples, exact=True)
 
         output = {}
         for i in range(n_trials):