<a id="skfolio-pre-selection-selectnondominated"></a>

# skfolio.pre_selection.SelectNonDominated

<a id="skfolio.pre_selection.SelectNonDominated"></a>

### *class* skfolio.pre_selection.SelectNonDominated(min_n_assets=None, threshold=-0.5, fitness_measures=None)

Transformer for selecting non dominated assets.

Pre-selection based on the Assets Preselection Process 2 [[1]](#ra08cd64e7a9c-1).

Good single asset (for example with high return and low risk) is likely to
contribute to the final optimized portfolio. Each asset is considered as a portfolio
and these assets are ranked using the non-domination sorting method. The selection
is based on the ranks assigned to each asset based on their fitness until the number
of selected assets reaches the user-defined number.

Considering only the fitness of individual asset is insufficient because a pair of
negatively correlated assets has the potential to reduce the risk. Therefore,
negatively correlated pairs of assets are also considered.

* **Parameters:**
  **min_n_assets** *int, optional*
  : The minimum number of assets to select. If `min_n_assets` is reached before the
    end of the current non-dominated front, we return the remaining assets of this
    front. This is because all assets in the same front have the same rank.
    The default (`None`) is to select the first front.

  **threshold** *float, default=0.0*
  : Asset pairs with a correlation below this threshold are included in the
    non-domination sorting. The default value is `0.0`.

  **fitness_measures** *list[Measure], optional*
  : A list of [measure](https://skfolio.org/api.html.md#measures-ref) used to compute the portfolio fitness.
    The fitness is used to compare portfolios in terms of domination, compute the
    Pareto fronts and run the portfolio selection using non-dominated sorting.
    The default (`None`) is to use the list [PerfMeasure.MEAN, RiskMeasure.VARIANCE]
* **Attributes:**
  **to_keep_** *ndarray of shape (n_assets, )*
  : Boolean array indicating which assets are remaining.

  **n_features_in_** *int*
  : Number of assets seen during `fit`.

  **feature_names_in_** *ndarray of shape (`n_features_in_`,)*
  : Names of features seen during `fit`. Defined only when `X`
    has feature names that are all strings.

### Methods

| [`fit`](#skfolio.pre_selection.SelectNonDominated.fit)(X[, y])                             | Run the Non Dominated transformer and get the appropriate assets.   |
|------------------------------------------------------------------------------------------|---------------------------------------------------------------------|
| [`fit_transform`](#skfolio.pre_selection.SelectNonDominated.fit_transform)(X[, y])                   | Fit to data, then transform it.                                     |
| [`get_feature_names_out`](#skfolio.pre_selection.SelectNonDominated.get_feature_names_out)([input_features]) | Mask feature names according to selected features.                  |
| [`get_metadata_routing`](#skfolio.pre_selection.SelectNonDominated.get_metadata_routing)()                  | Get metadata routing of this object.                                |
| [`get_params`](#skfolio.pre_selection.SelectNonDominated.get_params)([deep])                      | Get parameters for this estimator.                                  |
| [`get_support`](#skfolio.pre_selection.SelectNonDominated.get_support)([indices])                  | Get a mask, or integer index, of the features selected.             |
| [`inverse_transform`](#skfolio.pre_selection.SelectNonDominated.inverse_transform)(X)                    | Reverse the transformation operation.                               |
| [`set_output`](#skfolio.pre_selection.SelectNonDominated.set_output)(\*[, transform])             | Set output container.                                               |
| [`set_params`](#skfolio.pre_selection.SelectNonDominated.set_params)(\*\*params)                  | Set the parameters of this estimator.                               |
| [`transform`](#skfolio.pre_selection.SelectNonDominated.transform)(X)                            | Reduce X to the selected features.                                  |

### References

* <a id='ra08cd64e7a9c-1'>**[1]**</a> “Large-Scale Portfolio Optimization Using Multi-objective Evolutionary Algorithms and Preselection Methods”, B.Y. Qu and Q.Zhou (2017).

<a id="skfolio.pre_selection.SelectNonDominated.fit"></a>

#### fit(X, y=None)

Run the Non Dominated transformer and get the appropriate assets.

* **Parameters:**
  **X** *array-like of shape (n_observations, n_assets)*
  : Price returns of the assets.

  **y** *Ignored*
  : Not used, present for API consistency by convention.
* **Returns:**
  **self** *SelectNonDominated*
  : Fitted estimator.

<a id="skfolio.pre_selection.SelectNonDominated.fit_transform"></a>

#### fit_transform(X, y=None, \*\*fit_params)

Fit to data, then transform it.

Fits transformer to `X` and `y` with optional parameters `fit_params`
and returns a transformed version of `X`.

* **Parameters:**
  **X** *array-like of shape (n_samples, n_features)*
  : Input samples.

  **y** *array-like of shape (n_samples,) or (n_samples, n_outputs),                 default=None*
  : Target values (None for unsupervised transformations).

  **\*\*fit_params** *dict*
  : Additional fit parameters.
    Pass only if the estimator accepts additional params in its `fit` method.
* **Returns:**
  **X_new** *ndarray array of shape (n_samples, n_features_new)*
  : Transformed array.

<a id="skfolio.pre_selection.SelectNonDominated.get_feature_names_out"></a>

#### get_feature_names_out(input_features=None)

Mask feature names according to selected features.

* **Parameters:**
  **input_features** *array-like of str or None, default=None*
  : Input features.
    - If `input_features` is `None`, then `feature_names_in_` is
      used as feature names in. If `feature_names_in_` is not defined,
      then the following input feature names are generated:
      `["x0", "x1", ..., "x(n_features_in_ - 1)"]`.
    - If `input_features` is an array-like, then `input_features` must
      match `feature_names_in_` if `feature_names_in_` is defined.
* **Returns:**
  **feature_names_out** *ndarray of str objects*
  : Transformed feature names.

<a id="skfolio.pre_selection.SelectNonDominated.get_metadata_routing"></a>

#### get_metadata_routing()

Get metadata routing of this object.

Please check [User Guide](https://skfolio.org/user_guide/metadata_routing.html.md#metadata-routing) on how the routing
mechanism works.

* **Returns:**
  **routing** *MetadataRequest*
  : A `MetadataRequest` encapsulating
    routing information.

<a id="skfolio.pre_selection.SelectNonDominated.get_params"></a>

#### get_params(deep=True)

Get parameters for this estimator.

* **Parameters:**
  **deep** *bool, default=True*
  : If True, will return the parameters for this estimator and
    contained subobjects that are estimators.
* **Returns:**
  **params** *dict*
  : Parameter names mapped to their values.

<a id="skfolio.pre_selection.SelectNonDominated.get_support"></a>

#### get_support(indices=False)

Get a mask, or integer index, of the features selected.

* **Parameters:**
  **indices** *bool, default=False*
  : If True, the return value will be an array of integers, rather
    than a boolean mask.
* **Returns:**
  **support** *array*
  : An index that selects the retained features from a feature vector.
    If `indices` is False, this is a boolean array of shape
    [# input features], in which an element is True iff its
    corresponding feature is selected for retention. If `indices` is
    True, this is an integer array of shape [# output features] whose
    values are indices into the input feature vector.

<a id="skfolio.pre_selection.SelectNonDominated.inverse_transform"></a>

#### inverse_transform(X)

Reverse the transformation operation.

* **Parameters:**
  **X** *array of shape [n_samples, n_selected_features]*
  : The input samples.
* **Returns:**
  **X_original** *array of shape [n_samples, n_original_features]*
  : `X` with columns of zeros inserted where features would have
    been removed by [`transform`](#skfolio.pre_selection.SelectNonDominated.transform).

<a id="skfolio.pre_selection.SelectNonDominated.set_output"></a>

#### set_output(\*, transform=None)

Set output container.

Refer to the user guide for more details
and sphx_glr_auto_examples_miscellaneous_plot_set_output.py for an
example on how to use the API.

* **Parameters:**
  **transform** *{“default”, “pandas”, “polars”}, default=None*
  : Configure output of `transform` and `fit_transform`.
    - `"default"`: Default output format of a transformer
    - `"pandas"`: DataFrame output
    - `"polars"`: Polars output
    - `None`: Transform configuration is unchanged
    <br/>
    #### Versionadded
    Added in version 1.4: `"polars"` option was added.
* **Returns:**
  **self** *estimator instance*
  : Estimator instance.

<a id="skfolio.pre_selection.SelectNonDominated.set_params"></a>

#### set_params(\*\*params)

Set the parameters of this estimator.

The method works on simple estimators as well as on nested objects
(such as `Pipeline`). The latter have
parameters of the form `<component>__<parameter>` so that it’s
possible to update each component of a nested object.

* **Parameters:**
  **\*\*params** *dict*
  : Estimator parameters.
* **Returns:**
  **self** *estimator instance*
  : Estimator instance.

<a id="skfolio.pre_selection.SelectNonDominated.transform"></a>

#### transform(X)

Reduce X to the selected features.

* **Parameters:**
  **X** *array of shape [n_samples, n_features]*
  : The input samples.
* **Returns:**
  **X_r** *array of shape [n_samples, n_selected_features]*
  : The input samples with only the selected features.

