diff --git a/sklearn/feature_selection/base.py b/sklearn/feature_selection/base.py index 3067d6ef31bc1..a9239e7fc9a8c 100644 --- a/sklearn/feature_selection/base.py +++ b/sklearn/feature_selection/base.py @@ -72,7 +72,11 @@ def transform(self, X): X_r : array of shape [n_samples, n_selected_features] The input samples with only the selected features. """ - X = check_array(X, accept_sparse='csr') + return self._transform(X) + + def _transform(self, X, force_all_finite=True): + X = check_array(X, force_all_finite=force_all_finite, + accept_sparse='csr') mask = self.get_support() if not mask.any(): warn("No features were selected: either the data is" diff --git a/sklearn/feature_selection/from_model.py b/sklearn/feature_selection/from_model.py index 657259f39ea17..42618a19e3b54 100644 --- a/sklearn/feature_selection/from_model.py +++ b/sklearn/feature_selection/from_model.py @@ -143,6 +143,9 @@ def _get_support_mask(self): threshold = _calculate_threshold(estimator, scores, self.threshold) return scores >= threshold + def transform(self, X): + return self._transform(X, False) + def fit(self, X, y=None, **fit_params): """Fit the SelectFromModel meta-transformer. diff --git a/sklearn/feature_selection/tests/test_from_model.py b/sklearn/feature_selection/tests/test_from_model.py index 6efec43dce37b..d0fde777b13c8 100644 --- a/sklearn/feature_selection/tests/test_from_model.py +++ b/sklearn/feature_selection/tests/test_from_model.py @@ -1,5 +1,6 @@ import numpy as np +from sklearn.impute import SimpleImputer from sklearn.utils.testing import assert_true from sklearn.utils.testing import assert_false from sklearn.utils.testing import assert_equal @@ -198,3 +199,17 @@ def test_threshold_without_refitting(): # Set a higher threshold to filter out more features. model.threshold = "1.0 * mean" assert_greater(X_transform.shape[1], model.transform(data).shape[1]) + + +def test_transform_accepts_infinite_data(): + # Test that transform doesn't check for np.inf and np.nan values. + est = SimpleImputer(strategy='mean', missing_values='NaN') + model = SelectFromModel(estimator=est) + data[2, :] = np.nan + model.fit(data, y) + + X_len = len(model.get_support()) + X = np.arange(X_len).reshape(1, X_len) + X.fill(np.inf) + + model.transform(X)