使用 sklearn 转换器,我希望能够将转换应用于列列表,并让转换器使用转换后的值创建新列,而不是将它们应用于现有列。这可能吗?变压器还需要插入管道中。
我的目标是比较原始列和转换后的列。围绕变压器的包装类可以工作,但我想知道是否有更简单的方法?谢谢。
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
和恒等函数,但我不知道是否有更聪明的方法来做到这一点。
最简单的方法是使用带有参数的函数,该参数接受您想要转换的功能列表。从那里你有 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()
我最初的方法是使用
FunctionTransformer(lambda x: x)
,但它并不理想,因为你无法将其放入文件中。根据文档 FunctionTransformer(None)
会导致你实际上可以腌制的东西。