在scikit-learn中选择功能的子集进行培训

时间:2019-06-06 17:38:16

标签: python scikit-learn

让我们假设我有一个包含5个特征的数据集,并且我想使用特征1、2和5进行训练(跳过特征3和4)。我不想更改数据集,因为我希望在预测期间将相同的5个特征馈入模型。我只希望预处理管道的第一步删除功能3和4。

此外,我希望能够在训练结束时对管道对象进行腌制/ joblib,而无需腌制对象,这取决于要加载和运行的任何其他对象或代码。因此,我不想使用FunctionTransformer,因为我将不得不编写一个自定义函数(传递给此转换器),然后对其进行腌制并将其与腌制的模型对象一起运送。

在scikit-learn中有什么好方法吗?

2 个答案:

答案 0 :(得分:0)

您可以创建自己的变压器对象,该对象为您执行列选择。将其提取到管道中时,会将要提取的列作为参数传递。在您的管道中,其余的步骤将使它腌制。

为了包括此自定义转换器,您的类需要从两个基本sklearn类继承:TransformerMixinBaseEstimator。只要您自己定义TransformerMixinfit_transform,从fit继承就可以得到transform方法。从BaseEstimator继承提供get_paramsset_params。由于fit方法除了返回对象本身外不需要做任何事情,因此您真正需要做的就是定义transform方法。

在此示例中,您可以传入要提取的列名称列表,并假设数据(X)是pandas DataFrame。

from sklearn.base import BaseEstimator, TransformerMixin


class FeatureSelector(BaseEstimator, TransformerMixin):

    def __init__(self, feature_names):
        self._feature_names = feature_names 

    def fit(self, X, y = None):
        return self 

    def transform(self, X, y = None):
        return X[self._feature_names]

现在您已经有了转换器,可以将其包含在管道中,可以根据需要对其进行腌制。

关于您不使用FunctionTransformer的要求,我假设您看到了示例here,其中它们全局定义了all_but_first_column。使用上面定义的FeatureSelector类,您可以始终将all_but_first_column之类的东西作为另一个方法移到该类中。

答案 1 :(得分:0)

为了将来参考,有一种解决方法可以通过使用包 feature_selection.ColumnSelector 中的 mlxtend 来执行此任务。它采用要选择的列的索引,如下所示:

from mlxtend.feature_selection import ColumnSelector

...

pipeline = Pipeline(steps=[
    ('selector', ColumnSelector([1,2,3])),
    ('kmeans', KMeans()), 
])

...

有关详细信息,请参阅 docs