在列列表上使用 sklearn 转换器并保留输入列

问题描述 投票:0回答:3

使用 sklearn 转换器,我希望能够将转换应用于列列表,并让转换器使用转换后的值创建新列,而不是将它们应用于现有列。这可能吗?变压器还需要插入管道中。

我的目标是比较原始列和转换后的列。围绕变压器的包装类可以工作,但我想知道是否有更简单的方法?谢谢。

python scikit-learn
3个回答
3
投票

您可以使用

FeatureUnion
并将您的变压器与身份变压器连接起来,这将使您的列保持不变。

from sklearn.pipeline import FeatureUnion
from sklearn.preprocessing import FunctionTransformer
import numpy as np

union = FeatureUnion([("id", FunctionTransformer(lambda x: x)),
                      ("add_one", FunctionTransformer(lambda x: x + 1))])

X = np.array([[0, 1, 2], [3, 4, 5]])
union.fit_transform(X)

>>> array([[0, 1, 2, 1, 2, 3], [3, 4, 5, 4, 5, 6]])

目前sklearn中似乎没有IdentityTransformer类。我使用了

FunctionTransformer
和恒等函数,但我不知道是否有更聪明的方法来做到这一点。


1
投票

最简单的方法是使用带有参数的函数,该参数接受您想要转换的功能列表。从那里你有 2 个选择:

  1. 这是您要求的方法。由于该函数仅转换您请求的那些特征,因此您可以替换您想要在函数内转换的特征的值。

  2. 这是我推荐的。创建原始数据框的副本并将所有转换后的特征“粘贴”到其中。然后,您可以在不同的单元格中打印两个数据框(我假设您使用的是 jupyter 笔记本)来比较差异。

这将是要使用的功能:

    def transform_data(scaler, df, feats_to_transform):
        features = scaled_df[feats_to_transform]
        transformed_feats = scaler.fit_transform(features.values) # The transformers take only 2d arrays
                      ​
        return transformed_feats 

方法一:

df  = pd.read_csv('path/to/csv')
scaler = StandardScaler() # from sklearn.preprocessing import StandardScaler

feats_to_transform = ['feat1, feat2, feat3'] 
transformed_feats = transform_data(scaler, df, feats_to_transform)

df[feats_to_transform] = transformed_feats

方法二:

df  = pd.read_csv('path/to/csv')
scaled_df = df.copy(deep=True) # Using deep copy prevents alteration of original data
scaler = StandardScaler() # from sklearn.preprocessing import StandardScaler

feats_to_transform = ['feat1, feat2, feat3'] 
transformed_feats = transform_data(scaler, df, feats_to_transform)

scaled_df [feats_to_transform] = transformed_feats

# now compare in different cells
df.head()
scaled_df.head()

0
投票

我最初的方法是使用

FunctionTransformer(lambda x: x)
,但它并不理想,因为你无法将其放入文件中。根据文档
FunctionTransformer(None)
会导致你实际上可以腌制的东西。

© www.soinside.com 2019 - 2024. All rights reserved.