class_docstr: SelectByShuffling() selects features by determining the drop in machine learning
  model performance when each feature's values are randomly shuffled.
  
  If the variables are important, a random permutation of their values will
  decrease dramatically the machine learning model performance. Contrarily, the
  permutation of the values should have little to no effect on the model performance
  metric we are assessing if the feature is not predictive.
  
  The SelectByShuffling() first trains a machine learning model utilising all
  features. Next, it shuffles the values of 1 feature, obtains a prediction with the
  pre-trained model, and determines the performance drop (if any). If the drop in
  performance is bigger than a threshold then the feature is retained, otherwise
  removed. It continues until all features have been shuffled and examined.
  
  The user can determine the model for which performance drop after feature shuffling
  should be assessed. The user also determines the threshold in performance under
  which a feature will be removed, and the performance metric to evaluate.
  
  Model training and performance calculation are done with cross-validation.
  
  More details in the :ref:`User Guide <feature_shuffling>`.
  
  Parameters
  ----------
  {estimator}
  
  {variables}
  
  {scoring}
  
  {threshold}
  
  {cv}
  
  random_state: int, default=None
      Controls the randomness when shuffling features.
  
  {confirm_variables}
  
  Attributes
  ----------
  {initial_model_performance_}
  
  performance_drifts_:
      Dictionary with the performance drift per shuffled feature.
  
  {features_to_drop_}
  
  {variables_}
  
  {feature_names_in_}
  
  {n_features_in_}
  
  Methods
  -------
  {fit}
  
  {fit_transform}
  
  {get_support}
  
  {transform}
  
  Notes
  -----
  This transformer is a similar concept to the `permutation_importance` from
  Scikit-learn. The function in Scikit-learn is used to evaluate feature importance
  instead of to select features.
  
  See Also
  --------
  sklearn.inspection.permutation_importance
class_docstr_tok: ["SelectByShuffling","(",")","selects","features","by","determining","the","drop","in","machine","learning","model","performance","when","each","feature","'s","values","are","randomly","shuffled",".","If","the","variables","are","important",",","a","random","permutation","of","their","values","will","decrease","dramatically","the","machine","learning","model","performance",".","Contrarily",",","the","permutation","of","the","values","should","have","little","to","no","effect","on","the","model","performance","metric","we","are","assessing","if","the","feature","is","not","predictive",".","The","SelectByShuffling","(",")","first","trains","a","machine","learning","model","utilising","all","features",".","Next",",","it","shuffles","the","values","of","1","feature",",","obtains","a","prediction","with","the","pre-trained","model",",","and","determines","the","performance","drop","(","if","any",")",".","If","the","drop","in","performance","is","bigger","than","a","threshold","then","the","feature","is","retained",",","otherwise","removed",".","It","continues","until","all","features","have","been","shuffled","and","examined",".","The","user","can","determine","the","model","for","which","performance","drop","after","feature","shuffling","should","be","assessed",".","The","user","also","determines","the","threshold","in","performance","under","which","a","feature","will","be","removed",",","and","the","performance","metric","to","evaluate",".","Model","training","and","performance","calculation","are","done","with","cross-validation",".","More","details","in","the",":","ref",":","`","User","Guide","<","feature_shuffling",">","`",".","Parameters","--","--","--","--","--","{","estimator","}","{","variables","}","{","scoring","}","{","threshold","}","{","cv","}","random_state",":","int",",","default=None","Controls","the","randomness","when","shuffling","features",".","{","confirm_variables","}","Attributes","--","--","--","--","--","{","initial_model_performance_","}","performance_drifts_",":","Dictionary","with","the","performance","drift","per","shuffled","feature",".","{","features_to_drop_","}","{","variables_","}","{","feature_names_in_","}","{","n_features_in_","}","Methods","--","--","--","-","{","fit","}","{","fit_transform","}","{","get_support","}","{","transform","}","Notes","--","--","-","This","transformer","is","a","similar","concept","to","the","`","permutation_importance","`","from","Scikit-learn",".","The","function","in","Scikit-learn","is","used","to","evaluate","feature","importance","instead","of","to","select","features",".","See","Also","--","--","--","--","sklearn.inspection.permutation_importance"]
code: def _more_tags(self):
      tags_dict = _return_tags()
      tags_dict["variables"] = "numerical"
      tags_dict["requires_y"] = True
      # add additional test that fails
      tags_dict["_xfail_checks"][
          "check_estimators_nan_inf"
      ] = "transformer allows NA"
      tags_dict["_xfail_checks"][
          "check_parameters_default_constructible"
      ] = "transformer has 1 mandatory parameter"
  
      msg = "transformers need more than 1 feature to work"
      tags_dict["_xfail_checks"]["check_fit2d_1feature"] = msg
  
      return tags_dict
  
imports: from typing import List, Union
  import numpy
  import pandas
  from sklearn.base import is_classifier
  from sklearn.metrics import get_scorer
  from sklearn.model_selection import check_cv, cross_validate
  from sklearn.utils.validation import check_random_state
  from feature_engine._docstrings.fit_attributes import _feature_names_in_docstring, _n_features_in_docstring
  from feature_engine._docstrings.methods import _fit_transform_docstring
  from feature_engine._docstrings.substitute import Substitution
  from feature_engine._variable_handling.init_parameter_checks import _check_init_parameter_variables
  from feature_engine._variable_handling.variable_type_selection import _find_or_check_numerical_variables
  from feature_engine.dataframe_checks import check_X_y
  from feature_engine.selection._docstring import _cv_docstring, _estimator_docstring, _features_to_drop_docstring, _fit_docstring, _get_support_docstring, _initial_model_performance_docstring, _scoring_docstring, _threshold_docstring, _transform_docstring, _variables_attribute_docstring, _variables_numerical_docstring
  from feature_engine.selection.base_selector import BaseSelector
  from feature_engine.tags import _return_tags
label_desc: Use image node_id 3 for calling the SelectByShuffling obj's underlying member method code with example usage: obj._more_tags() and returns: tags_dict