用于相交列列表的一致 ColumnTransformer

2024-01-07

我想用sklearn.compose.ColumnTransformer对于相交的列列表,一致(不是并行的,因此,第二个变换器应该仅在第一个变换器之后执行):

log_transformer = p.FunctionTransformer(lambda x: np.log(x))
df = pd.DataFrame({'a': [1,2, np.NaN, 4], 'b': [1,np.NaN, 3, 4], 'c': [1 ,2, 3, 4]})
compose.ColumnTransformer(n_jobs=1,
                         transformers=[
                             ('num', impute.SimpleImputer() , ['a', 'b']),
                             ('log', log_transformer, ['b', 'c']),
                             ('scale', p.StandardScaler(), ['a', 'b', 'c'])
                         ]).fit_transform(df)

所以,我想用SimpleImputer for 'a', 'b', then log for 'b', 'c', 进而StandardScaler for 'a', 'b', 'c'.

But:

  1. 我得到数组(4, 7) shape.
  2. 我仍然得到Nan in a and b列。

那么,我该如何使用ColumnTransformer对于不同的列,采用以下方式Pipeline?

UPD:

pipe_1 = pipeline.Pipeline(steps=[
    ('imp', impute.SimpleImputer(strategy='constant', fill_value=42)),
])

pipe_2 = pipeline.Pipeline(steps=[
    ('imp', impute.SimpleImputer(strategy='constant', fill_value=24)),
])

pipe_3 = pipeline.Pipeline(steps=[
    ('scl', p.StandardScaler()),
])

# in the real situation I don't know exactly what cols these arrays contain, so they are not static: 
cols_1 = ['a']
cols_2 = ['b']
cols_3 = ['a', 'b', 'c']

proc = compose.ColumnTransformer(remainder='passthrough', transformers=[
    ('1', pipe_1, cols_1),
    ('2', pipe_2, cols_2),
    ('3', pipe_3, cols_3),
])
proc.fit_transform(df).T

Output:

array([[ 1.        ,  2.        , 42.        ,  4.        ],
       [ 1.        , 24.        ,  3.        ,  4.        ],
       [-1.06904497, -0.26726124,         nan,  1.33630621],
       [-1.33630621,         nan,  0.26726124,  1.06904497],
       [-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079]])

我明白为什么我有重复的列,nans而不是缩放值,但是当列不是静态时,如何以正确的方式解决这个问题?

UPD2:

当列更改顺序时可能会出现问题。所以,我想用FunctionTransformer对于列选择:

def select_col(X, cols=None):
    return X[cols]

ct1 = compose.make_column_transformer(
    (p.OneHotEncoder(), p.FunctionTransformer(select_col, kw_args=dict(cols=['a', 'b']))),
    remainder='passthrough'
)

ct1.fit(df)

但得到这个输出:

ValueError:没有有效的列规范。仅允许标量、所有整数或所有字符串的列表或切片、或布尔掩码

我该如何修复它?


预期用途ColumnTransformer不同的变压器是并行应用的,而不是顺序应用的。为了实现您想要的结果,我想到了三种方法:

第一种方法:

pipe_a = Pipeline(steps=[('imp', SimpleImputer()),
                         ('scale', StandardScaler())])
pipe_b = Pipeline(steps=[('imp', SimpleImputer()),
                         ('log', log_transformer),
                         ('scale', StandardScaler())])
pipe_c = Pipeline(steps=[('log', log_transformer),
                         ('scale', StandardScaler())])
proc = ColumnTransformer(transformers=[
    ('a', pipe_a, ['a']),
    ('b', pipe_b, ['b']),
    ('c', pipe_c, ['c'])]
)

第二种方法:
This 要求sklearn>1.2以及引入的 pandas-out 功能。没有它,ColumnTransformers 会重新排列列并忘记名称,这样后面的列就会失败或应用到错误的列。对于早期版本,您可以根据您的特定用例进行调整。

imp_tfm = ColumnTransformer(
    transformers=[('num', impute.SimpleImputer() , ['a', 'b'])],
    remainder='passthrough'
    )
log_tfm = ColumnTransformer(
    transformers=[('log', log_transformer, ['b', 'c'])],
    remainder='passthrough'
    )
scl_tfm = ColumnTransformer(
    transformers=[('scale', StandardScaler(), ['a', 'b', 'c'])
    )
proc = Pipeline(steps=[
    ('imp', imp_tfm),
    ('log', log_tfm),
    ('scale', scl_tfm)]
).set_output("pandas")

Third,可能有一种方法可以使用Pipeline切片功能以拥有一个“主”管道,您可以为每个功能削减该管道...这主要像第一种方法一样工作,在较大管道的情况下可能会节省一些编码,但似乎有点老套。例如,在这里您可以:

pipe_a = clone(pipe_b)[1:]
pipe_c = clone(pipe_b)
pipe_c.steps[1] = ('nolog', 'passthrough')

(没有克隆或其他深度复制pipe_b,最后一行将改变两者pipe_c and pipe_b。切片机制返回一个副本,所以pipe_a严格来说并不需要克隆,但我将其保留下来是为了感觉更安全。不幸的是你不能提供不连续的切片,所以pipe_c = pipe_b[0,2]不起作用,但你can像我上面所做的那样设置各个切片"passthrough"禁用它们。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于相交列列表的一致 ColumnTransformer 的相关文章

随机推荐

  • 从 Windows 命令行获取文件夹大小

    在 Windows 中 是否可以在不使用任何第三方工具的情况下从命令行获取文件夹的大小 我想要与右键单击 Windows 资源管理器 属性中的文件夹时获得的结果相同的结果 有一个内置 Windows 工具为了那个原因 dir s Folde
  • 如何避免锯齿并提高性能?

    In this 堆栈溢出答案 https stackoverflow com a 9709724 2345484事实证明 C 中的别名会降低代码速度 C 中的别名不仅适用于指针 还适用于引用 更普遍地适用于标准指定的这些类型 https s
  • ajax POST 后无法访问 JQuery $(this)?

    假设我有一堆共享点击事件的链接 a href class do stuff Click me a a href class do stuff Click me a a href class do stuff Click me a a hre
  • 使用 Utf8Json 库序列化时排除空字段?

    使用以下方法将 POCO 序列化为 JSON 字符串时 有什么方法可以忽略空字段Utf8Json图书馆 我有一个ToString我在外部使用的下面的类中的方法 所以我想看看是否有任何方法可以在进行序列化时排除空字段 基本上我不希望序列化后
  • 禁用 gcc 对不兼容选项的警告

    我很好奇是否有一个选项可以禁用 gcc 关于参数对正在编译的语言无效的警告 Ex cc1 warning command line option Wno deprecated is valid for C Java ObjC but not
  • 如何在显示 jQuery ui 选项卡时插入 JavaScript?

    我想在我的页面上运行 JavaScript 函数 但仅限于显示选项卡时 其实有两个问题 我没有使用 ajax 选项卡 那么如果我只想在显示选项卡后运行代码 我会将 JavaScript 放入 加载 或 显示 回调中吗 根据上面的答案 我的代
  • IE 和 Firefox 中的文本大小不同

    为什么 IE 中的文本比 Firefox 中的文本稍大 宽 示例 顶部是 IE 渲染文本的方式 底部是 FF Image http www dreamscape hu text jpg 在 CSS 中声明为 Arial 16px 的文本 我
  • 如何将 Xamarin Forms Shell 集成到 MvvmCross 设置中

    我打算将 Xamarin Forms 与 MvvmCross 一起使用 根据他们的tutorial https www mvvmcross com documentation tutorials tipcalc a xamarin form
  • 如何接入Kubernetes部署

    我已经创建了 Docker 映像 并部署在具有最少数量机器的 k8s 集群中 设置了一台主机和一台工作机 两台机器都已启动并运行 并使用相同的 VLAN 网络相互通信 请查找以下 Pod 和部署服务以及所描述的状态 root jenkins
  • 如何配置 protobuf-net 的 RuntimeModel.Default 以支持序列化/反序列化 SessionSecurityToken?

    BinaryFormatter 能够简单地处理序列化 private byte TokenToBytes SessionSecurityToken token if token null return null using var memo
  • XML 格式中的换行符?

    在 XML 中编辑字符串时 我需要添加换行符 我想问一下 为 android 编程时 正确的形式是什么 因为 br 有效 但 ECLIPSE 将该区域标记为有问题 如果我查看建议 Eclipse 会告诉我我应该添加一个结束标签 如果我添加换
  • Blazor 作用域 CSS 未在 Azure Pipelines 上构建

    我正在开发一个使用作用域 CSS 的 Blazor 应用程序 但是当我尝试使用 Azure Pipelines 构建它时 不会生成作用域 CSS 文件 我在一台可以通过 RDP 访问的本地计算机上构建 我看到wwwroot assembly
  • 从 mach_timebase_info() 创建结构体

    在 C 中创建时基信息结构很容易 但在 Swift 中 以下内容在 Playground 中不起作用 let timebaseInfo mach timebase info data t mach timebase info timebas
  • 使用 pandas 和 scipy 绘制树状图

    我希望使用相关性生成树状图pandas and scipy 我使用数据集 作为DataFrame 由返回组成 其大小为n x m where n是日期的数量 m公司数量 然后我只需运行脚本 import pandas as pd impor
  • 如何让 ediff + hg 在 emacs 23.2 for mac 中工作?

    我使用 emacs 二进制文件http emacsformacosx com http emacsformacosx com 当我在 Mercurial 源目录中编辑文件并运行 ediff revision 时 我得到 File the f
  • 错误:预期未定义为 GraphQL 模式

    我收到一条错误 内容为 错误 预期未定义为 GraphQL 架构 请检查一下这是什么问题 当我移动到 localhost 3000 graphiql 时 它显示上述错误 也许我犯了一些错误 请任何人检查并帮助我 如果可能的话 我的服务器 j
  • 人脸识别-Python

    我正在尝试通过以下方式进行人脸识别主成分分析 PCA 使用Python 现在我能够获得训练图像之间的最小欧几里德距离images和输入图像input image 这是我的代码 import os from PIL import Image
  • 获取正在激活的选项卡(div)的ID

    我正在使用 jquery 1 9 和 jquery UI 1 10 我希望能够在单击选项卡时获取选项卡 ID 例如 如果我单击名为 Second 的选项卡 我想获得 tabs 2 响应 到目前为止我已经完成了以下代码
  • 我是否应该同步监听器通知?

    我总是很犹豫是否要把我的锁公开 公开 我总是尝试将锁限制在我的实现范围内 我相信 不这样做就会导致僵局 我有以下课程 class SomeClass protected ArrayList
  • 用于相交列列表的一致 ColumnTransformer

    我想用sklearn compose ColumnTransformer对于相交的列列表 一致 不是并行的 因此 第二个变换器应该仅在第一个变换器之后执行 log transformer p FunctionTransformer lamb