
cuml.compose 指南用 ColumnTransformer 在 cuML 中构建 GPU 加速的列级特征工程管线【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cumlcuml.compose是 NVIDIA cuML 面向异构表格数据的特征工程组合模块它把 scikit-learn 风格的ColumnTransformer、make_column_transformer与make_column_selector三个 API 完整移植到 GPU 生态让开发者可以对同一份 DataFrame 中的不同列子集分别应用标准化、归一化、独热编码等预处理变换再自动拼接成统一特征空间。阅读本篇后你将掌握这三个 API 的完整参数语义、GPU 加速的实现原理以及如何把它们嵌入 cuML 训练管线并保持与 scikit-learn 的输入输出兼容。模块概览cuml.compose 提供什么cuml.compose是 cuML 的公开 API 子模块对外仅暴露三个成员由 python/cuml/cuml/compose/init.py 统一导出from cuml._thirdparty.sklearn.preprocessing import ( ColumnTransformer, make_column_selector, make_column_transformer, ) __all__ [ ColumnTransformer, # 类按列分组应用变换器 make_column_transformer, # 函数免命名快速构造 make_column_selector, # 类按 dtype / 正则批量选列 ]三者的分工与 scikit-learn 的sklearn.compose一一对应API类型作用ColumnTransformer类核心对象对指定列子集分别fit/transform并横向拼接结果make_column_transformer函数ColumnTransformer的简写构造器自动按类型生成变换器名字make_column_selector类生成可调用对象按数据类型或列名正则自动挑选列供ColumnTransformer使用与其在 sklearn 版本中的位置不同cuML 将这三个实现放在cuml._thirdparty.sklearn.preprocessing包内见 python/cuml/cuml/_thirdparty/sklearn/preprocessing/_column_transformer.py文件头部注释明确说明该代码源自 scikit-learn为支持 GPU 加速而做了修改并以 BSD-3-Clause 协议发布。这意味着 cuML 用户在使用cuml.compose时无需在 CPU/GPU 之间切换即可获得与 sklearn 一致的 API 体验。ColumnTransformer按列分组变换的核心类ColumnTransformer允许不同的列子集走不同的变换器最终把每个变换器的输出横向拼接hstack成单一特征空间适用于异构列数据例如同时包含数值列、类别列、文本列的表格。构造参数详解构造函数签名如下来自 源码 L568-L583ColumnTransformer( transformersNone, # 必填[(name, transformer, columns), ...] *, # 以下均为关键字参数 remainderdrop, sparse_threshold0.3, n_jobsNone, transformer_weightsNone, verboseFalse, )各参数语义transformers必填由(name, transformer, columns)三元组组成的列表。name字符串与Pipeline、FeatureUnion一致允许通过set_params定位子变换器也用于网格搜索transformer必须支持fit与transform的估计器也接受两个特殊字符串drop丢弃该列与passthrough原样透传columns列选择器可以是整数、字符串、整数/字符串列表、布尔掩码、slice切片或可调用对象。整数按位置索引字符串按 DataFrame 列名索引标量字符串/整数用于期望 1D 输入向量的变换器其余情况会传入 2D 数组。可调用对象接收输入数据X并返回上述任意类型批量选列时可搭配make_column_selector。remainder默认drop未被任何变换器覆盖的剩余列如何处理。drop直接丢弃默认passthrough剩余列原样透传并拼接到各变换器输出之后估计器对剩余列执行该估计器的fit/transform。注意使用该特性时fit与transform阶段传入的 DataFrame 列顺序必须一致源码_validate_remainder会记录_df_columns与_n_features用于校验。sparse_threshold默认0.3当各变换器输出混有稀疏与稠密数据时若整体密度低于该值则以稀疏矩阵拼接设为0强制返回稠密。若输出全为稠密或全为稀疏则该参数被忽略。n_jobs默认None并行任务数。None表示 1除非处于joblib.parallel_backend上下文中-1表示使用全部处理器。源码通过joblib.Parallel实现真正的并行 fit/transform见 L867-L875。transformer_weights默认None以变换器名为键、权重为值的字典输出特征将乘以对应权重在_fit_transform_one/_transform_one中实现乘法。verbose默认False为True时逐个打印每个变换器拟合耗时借助_print_elapsed_time上下文管理器。关键属性transformers_拟合后的(name, fitted_transformer, column)列表fitted_transformer可能是估计器、drop或passthrough。若存在剩余列末尾会追加(remainder, transformer, remaining_columns)元组因此此时len(transformers_) len(transformers) 1否则二者相等。named_transformers_只读的sklearn.utils.Bunch可按名称直接访问已拟合的变换器源码 L749-L760。sparse_output_布尔标志指示transform输出是稀疏矩阵还是稠密数组取决于各变换器输出与sparse_threshold。官方文档示例源码 docstring 给出了可直接运行的示例L548-L563import cupy as cp from cuml.compose import ColumnTransformer from cuml.preprocessing import Normalizer ct ColumnTransformer( [(norm1, Normalizer(norml1), [0, 1]), (norm2, Normalizer(norml1), slice(2, 4))]) X cp.array([[0., 1., 2., 2.], [1., 1., 0., 1.]]) # Normalizer 将 X 的每一行缩放到单位范数 # 这里对每行的前两个元素与后两个元素分别独立缩放。 ct.fit_transform(X) # array([[0. , 1. , 0.5, 0.5], # [0.5, 0.5, 0. , 1. ]])输出矩阵的列顺序遵循transformers列表中声明的顺序未指定的列默认被丢弃passthrough指定的列则追加在最右侧。GPU 加速的实现细节从源码结构可以推断 cuML 版与 sklearn 版的三个关键差异点输出类型统一为 CuPy_fit_transform_one与_transform_one都包在cuml.using_output_type(cupy)上下文内执行L302-L334保证中间结果与拼接结果都是 GPU 上的 CuPy 数组避免设备-主机往返拷贝。同时支持 pandas 与 cudf_safe_indexing/_pandas_indexing通过hasattr(X, iloc)分流对pd.Index与cudf.Index都做了显式处理字符串列名索引对 pandas DataFrame 与 cuDF DataFrame 均生效。稀疏拼接走 cupyx_hstack在稀疏输出时使用cu_sparse.hstack(...).tocsr()即cupyx.scipy.sparse稠密输出时使用 CuPy 的np.hstack全程无 CPU 中转。此外fit_transform与transform都标注了cuml.internals.mlfunc其中fit_transform额外设置preserve_indexTrue与column_namesfeature_names_out使输出 DataFrame 能保留列名get_feature_names_out则按{transformer_name}__{feature_name}的规则生成输出特征名L762-L813。make_column_transformer免命名的快速构造器当不需要手动命名变换器、也不需要transformer_weights权重时可用make_column_transformer快速构造from cuml.preprocessing import StandardScaler, OneHotEncoder from cuml.compose import make_column_transformer ct make_column_transformer( (StandardScaler(), [numerical_column]), (OneHotEncoder(), [categorical_column]))其参数与ColumnTransformer基本一致*transformers接收(transformer, columns)二元组没有name一项remainder默认dropsparse_threshold默认0.3另有n_jobs与verbose。实现上_get_transformer_list调用_name_estimators依据变换器类型自动生成小写类名作为名字同名变换器会追加-N后缀去重L337-L359随后内部直接构造一个ColumnTransformer返回。因此上例等价于ColumnTransformer(transformers[(standardscaler, StandardScaler(...), [numerical_column]), (onehotencoder, OneHotEncoder(...), [categorical_column])])make_column_selector按 dtype 或正则批量选列make_column_selector返回一个可调用对象专门用于ColumnTransformer的列选择。它支持两种选择条件数据类型dtype与列名正则多个条件同时给出时必须全部满足才选中该列源码 docstring 明确 all criteria must match。构造参数pattern默认None正则字符串列名匹配该模式即被选中为None时不按模式过滤。dtype_include默认None要包含的 dtype 或 dtype 列表语义与pandas.DataFrame.select_dtypes一致。dtype_exclude默认None要排除的 dtype 或 dtype 列表。调用约定该可调用对象接收一个 DataFrame内部先取df.iloc[:1]首行再执行select_dtypes(include..., exclude...)过滤 dtype最后用cols.str.contains(pattern, regexTrue)过滤列名返回选中的列名列表L1208-L1219。注意make_column_selector目前只接受 pandas/cuDF 风格、带iloc的 DataFrame直接传入裸数组会抛出ValueError。官方示例来自 docstringL1181-L1199按 dtype 自动分流数值列与类别列——数值列走StandardScaler对象类型列走OneHotEncoderfrom cuml.preprocessing import StandardScaler, OneHotEncoder from cuml.compose import make_column_transformer, make_column_selector import cupy as cp import cudf X cudf.DataFrame({city: [London, London, Paris, Sallisaw], rating: [5, 3, 4, 5]}) ct make_column_transformer( (StandardScaler(), make_column_selector(dtype_includecp.number)), # rating (OneHotEncoder(), make_column_selector(dtype_includeobject))) # city ct.fit_transform(X) # array([[ 0.90453403, 1. , 0. , 0. ], # [-1.50755672, 1. , 0. , 0. ], # [-0.30151134, 0. , 1. , 0. ], # [ 0.90453403, 0. , 0. , 1. ]])与 scikit-learn 的对齐验证测试视角cuml.compose的正确性由专门的测试套件保障见 python/cuml/tests/test_compose.py。测试策略极具参考价值同一份数据分别喂给 cuML 版与 sklearn 版再断言输出逐元素一致assert_allclose。test_column_transformer对remainder取drop/passthrough、transformer_weights取None/{scaler: 2.4, normalizer: 1.8}做参数化组合覆盖整数列索引与字符串列名DataFrame 场景下自动转为c0风格列名两种选列方式并验证fit_transform与transform结果都与 sklearn 基线一致且输出类型与输入类型相同assert type(t_X) is type(X)。test_column_transformer_sparse额外参数化sparse_threshold为0.2与0.8验证稀疏输入下输出密度与阈值的关系——当数据集密度低于阈值时输出保持稀疏类型否则转为稠密。测试中还记录了一个已知限制CSC 格式输入会pytest.xfail()。其余用例约 385 行还覆盖了make_column_transformer、make_column_selector与 sklearn 版本的等价性以及与sklearn.base.clone的兼容。这意味着只要你的数据在 CPU 版 sklearn 上行为正确cuml.compose给出的结果在数值上与其一致可放心迁移。accel 模式下的额外补丁在 cuML 的cuml.accel加速模式下cuml.compose还有一层针对 sklearn 原版ColumnTransformer的运行时补丁见 python/cuml/cuml/accel/_patches/sklearn/compose.py它把 sklearnColumnTransformer的fit、fit_transform、transform三个方法统一包进using_output_type(numpy)上下文确保在混合调用 sklearn 组件时返回结果为 NumPy 类型从而保证与既有 sklearn 代码的无缝互操作。实战把 ColumnTransformer 嵌入 cuML 训练管线结合 Pipeline 模块 与 cuML 估计器一个典型的 GPU 端到端流程如下import cudf from cuml.compose import make_column_transformer, make_column_selector from cuml.preprocessing import StandardScaler, OneHotEncoder from cuml.linear_model import LogisticRegression from cuml.pipeline import Pipeline import cupy as cp # 1. 构造按 dtype 自动分流的列变换器 preprocessor make_column_transformer( (StandardScaler(), make_column_selector(dtype_includecp.number)), # 数值列标准化 (OneHotEncoder(), make_column_selector(dtype_includeobject)), # 类别列独热 remainderdrop, # 未覆盖列丢弃 ) # 2. 组装 GPU 训练管线 pipe Pipeline(steps[ (preprocess, preprocessor), (clf, LogisticRegression()), ]) # 3. 直接在 cuDF DataFrame 上拟合 X cudf.DataFrame({age: [23, 45, 31, 52], city: [A, B, A, C], score: [0.9, 0.3, 0.7, 0.1]}) y cudf.Series([1, 0, 1, 0]) pipe.fit(X, y) print(pipe.predict(X))要点回顾数值列与类别列的变换被自动路由到不同 GPU 变换器互不干扰make_column_selector让按 dtype 选列变成声明式配置新增同类型列时无需改动代码变换后的特征列名可通过get_feature_names_out获取形如standardscaler__age、onehotencoder__city_A便于解释模型或对接特征平台若某列需要保留原始值参与建模将remainder改为passthrough即可无需显式声明。小结cuml.compose以三个 API 覆盖了异构表格数据特征工程的完整闭环ColumnTransformer负责按列分组变换与结果拼接make_column_transformer提供免命名快速构造make_column_selector提供按 dtype/正则的声明式选列。其实现直接移植自 scikit-learn 并针对 GPU 做了三处关键改造——CuPy 输出统一、cudf/pandas 双栈索引、cupyx 稀疏拼接——同时通过 test_compose.py 与 sklearn 基线逐元素对齐确保 GPU 加速不牺牲结果正确性。无论是将既有 sklearn 特征工程代码迁移到 cuML还是从零构建 GPU 原生训练管线cuml.compose都是列级预处理的标准入口。【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cuml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考