让我们假设我有一个包含5个特征的数据集,并且我想使用特征1、2和5进行训练(跳过特征3和4)。我不想更改数据集,因为我希望在预测期间将相同的5个特征馈入模型。我只希望预处理管道的第一步删除功能3和4。
此外,我希望能够在训练结束时对管道对象进行腌制/ joblib,而无需腌制对象,这取决于要加载和运行的任何其他对象或代码。因此,我不想使用FunctionTransformer
,因为我将不得不编写一个自定义函数(传递给此转换器),然后对其进行腌制并将其与腌制的模型对象一起运送。
在scikit-learn中有什么好方法吗?
答案 0 :(得分:0)
您可以创建自己的变压器对象,该对象为您执行列选择。将其提取到管道中时,会将要提取的列作为参数传递。在您的管道中,其余的步骤将使它腌制。
为了包括此自定义转换器,您的类需要从两个基本sklearn类继承:TransformerMixin
和BaseEstimator
。只要您自己定义TransformerMixin
和fit_transform
,从fit
继承就可以得到transform
方法。从BaseEstimator
继承提供get_params
和set_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。