gpt4 book ai didi

python - 将 get_feature_names 添加到 ColumnTransformer 管道

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:48 24 4
gpt4 key购买 nike

我正在尝试创建一个 sklearn.compose.ColumnTransformer 管道来转换分类和连续输入数据:

import pandas as pd

from sklearn.base import TransformerMixin, BaseEstimator
from sklearn.preprocessing import OneHotEncoder, FunctionTransformer
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer, make_column_transformer
from sklearn.impute import SimpleImputer

df = pd.DataFrame(
{
'a': [1, 'a', 1, np.nan, 'b'],
'b': [1, 2, 3, 4, 5],
'c': list('abcde'),
'd': list('aaabb'),
'e': [0, 1, 1, 0, 1],
}
)

for col in df.select_dtypes('object'):
df[col] = df[col].astype(str)

categorical_columns = list('acd')
continuous_columns = list('be')

categorical_transformer = OneHotEncoder(sparse=False, handle_unknown='ignore')
continuous_transformer = 'passthrough'

column_transformer = ColumnTransformer(
[
('categorical', categorical_transformer, categorical_columns),
('continuous', continuous_transformer, continuous_columns),
]
,
sparse_threshold=0.,
n_jobs=-1
)

X = column_transformer.fit_transform(df)

我想访问由这个转换管道创建的特征名称,所以我试试这个:

column_transformer.get_feature_names()

引发:

NotImplementedError: get_feature_names is not yet supported when using a 'passthrough' transformer.

因为我在技术上没有对 be 列做任何事情,所以我在技术上可以在 one-hot 之后将它们附加到 X编码所有其他功能,但有什么方法可以使用 scikit 基类之一(例如 TransformerMixinBaseEstimatorFunctionTransformer)来添加到此管道,以便我可以获取连续的特征名称以非常管道友好的方式

可能是这样的:

class PassthroughTransformer(FunctionTransformer, BaseEstimator):
def fit(self):
return self
def transform(self, X)
self.X = X
return X
def get_feature_names(self):
return self.X.values.tolist()

continuous_transformer = PassthroughTransformer()

column_transformer = ColumnTransformer(
[
('categorical', categorical_transformer, categorical_columns),
('continuous', continuous_transformer, continuous_columns),
]
,
sparse_threshold=0.,
n_jobs=-1
)

X = column_transformer.fit_transform(df)

但这引发了这个异常:

TypeError: Cannot clone object '<__main__.PassthroughTransformer object at 0x1132ddf60>' (type <class '__main__.PassthroughTransformer'>): it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods.

最佳答案

这里有多个问题:

  1. Cannot clone object 错误是由于并行处理:

    默认情况下,scikit-learn 克隆(使用 pickle)提供的转换器和估算器,当它在管道和类似的(FeatureUnion、ColumnTransformer 等)或交叉中工作时-验证(cross_val_scoreGridSearchCV 等)。

    现在,您已在 ColumnTransformer 中指定了 n_jobs=-1,这在代码中引入了多处理。 Python 的内置酸洗不适用于多处理。因此错误。

    选项:

    1. 设置 n_jobs = 1 不使用多处理。仍然需要根据第2点和第3点更正代码。

    2. 如果您想使用多处理,那么最简单的解决方案是在单独的文件(模块)中定义自定义类并将其导入到您的主文件中。像这样:

    在名为 custom_transformers.py 的同一文件夹中创建一个新文件,内容为:

    from sklearn.base import TransformerMixin, BaseEstimator

    # Changed the base classes here, see Point 3
    class PassthroughTransformer(BaseEstimator, TransformerMixin):

    # I corrected the `fit()` method here, it should take X, y as input
    def fit(self, X, y=None):
    return self

    def transform(self, X):
    self.X = X
    return X

    # I have corrected the output here, See point 2
    def get_feature_names(self):
    return self.X.columns.tolist()

    现在在您的主文件中,执行此操作:

    from custom_transformers import PassthroughTransformer

    有关详细信息,请参阅以下问题:

  2. 您返回 self.X.values.tolist():-

    这里的X是一个Pandas DataFrame,所以X.values.tolist()会返回你指定列的实际数据,不是列名。所以即使你解决了第一个错误,你也会在这个错误中出错。将其更正为:

    return self.X.columns.tolist()
  3. (次要)类继承:

    您将 PassthroughTransformer 定义为:

    PassthroughTransformer(FunctionTransformer, BaseEstimator)

    FunctionTransformer 已经继承自 BaseEstimator 所以我认为没有必要继承自 BaseEstimator。您可以通过以下方式更改它:

    class PassthroughTransformer(FunctionTransformer):

    OR
    # Standard way
    class PassthroughTransformer(BaseEstimator, TransformerMixin):

希望这对您有所帮助。

关于python - 将 get_feature_names 添加到 ColumnTransformer 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com