Source code for ecnet.tasks.feature_selection
r"""Feature selection functions"""
from typing import List, Tuple
from sklearn.ensemble import RandomForestRegressor
from ..datasets.structs import QSPRDataset
[docs]
def select_rfr(
dataset: QSPRDataset, total_importance: float = 0.95, **kwargs
) -> Tuple[List[int], List[float]]:
"""
Reduce descriptor dimensionality by random-forest feature importance.
Parameters
----------
dataset : QSPRDataset
Input dataset.
total_importance : float
Cumulative importance fraction to retain.
**kwargs
Forwarded to ``sklearn.ensemble.RandomForestRegressor``.
Returns
-------
tuple[list[int], list[float]]
Selected feature indices and their importances.
"""
X = dataset.desc_vals
y = [dv[0] for dv in dataset.target_vals]
regr = RandomForestRegressor(**kwargs)
regr.fit(X, y)
importances = sorted(
[(regr.feature_importances_[i], i) for i in range(len(dataset.desc_vals[0]))],
key=lambda x: x[0],
reverse=True,
)
tot_imp = 0.0
for idx, i in enumerate(importances):
tot_imp += i[0]
idx_cutoff = idx
if tot_imp >= total_importance:
break
desc_imp = [i[0] for i in importances][:idx_cutoff]
desc_idx = [i[1] for i in importances][:idx_cutoff]
return (desc_idx, desc_imp)