You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scikit-learn是否有内置特征删除Transformer类?

问题:scikit-learn是否提供内置的特征丢弃Transformer?

我有一个包含大量特征的数据集,希望直接丢弃部分特征,并将该操作作为scikit-learn pipeline的第一步。这需要一个符合scikit-learn Transformer接口、实现fit和transform方法的对象。我自己写了一个Downsampler类来实现,但在Notebook里插入这段代码比较繁琐,想知道scikit-learn是否有具备相同功能的内置类?

自定义的Downsampler代码如下:

class Downsampler:
    """Downsamples input data according to the sklearn transform interface."""

    def __init__(self, keep):
        """
        keep should index the features *not* to be dropped. For instance, if only the middle two
        of four features are of interest, keep should be [1, 2] or [False, True, True, False].
        """
        self.keep_ = keep

    def fit(X, y=None):
        """Does nothing; provided for interface consistency."""
        return self

    def transform(self, X, y=None):
        """Transform a data matrix of shape (n_samples, n_features) by dropping unwanted features."""
        return np.copy(X[:, self.keep_])

类似的使用场景包括:将1秒分辨率的时间序列降采样到1分钟;忽略已知与预测目标无关的特征。


回答

scikit-learn没有完全和你写的Downsampler一一对应的内置类,但有两个更灵活的替代方案,不用自己写完整的Transformer类:

1. 使用FunctionTransformer(适配numpy数组/矩阵)

这个类可以直接把自定义的特征选择逻辑包装成符合Transformer接口的对象,代码更简洁:

from sklearn.preprocessing import FunctionTransformer
import numpy as np

# 示例:保留索引为1、2的特征
selector = FunctionTransformer(lambda X: X[:, [1, 2]], validate=True)

# 如果用布尔掩码,比如[False, True, True, False]
mask = [False, True, True, False]
selector = FunctionTransformer(lambda X: X[:, mask], validate=True)

这个selector可以直接加入到Pipeline中使用,和你自己写的Downsampler功能完全一致。

2. 使用ColumnTransformer(适配pandas DataFrame)

如果你的数据是pandas DataFrame,想用列名来选择保留的特征,ColumnTransformer更直观:

from sklearn.compose import ColumnTransformer

# 保留指定列,其余列直接丢弃
selector = ColumnTransformer(
    transformers=[('keep', 'passthrough', ['column_name1', 'column_name2'])],
    remainder='drop'
)

至于你提到的时间序列降采样场景,scikit-learn没有专门的内置Transformer,但可以用FunctionTransformer包装pandas的resample方法实现:

import pandas as pd
from sklearn.preprocessing import FunctionTransformer

# 降采样到1分钟,以均值聚合(可根据需求替换为sum、max等)
ts_downsampler = FunctionTransformer(
    lambda df: df.resample('1min').mean(),
    validate=False
)

内容的提问来源于stack exchange,提问作者Frank Seidl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:30:14