AutoGluon `autogluon.features` 特征生成器模块全解:从 API 参考到源码级实现

AutoGluon `autogluon.features` 特征生成器模块全解:从 API 参考到源码级实现 AutoGluonautogluon.features特征生成器模块全解从 API 参考到源码级实现【免费下载链接】autogluonFast and Accurate ML in 3 Lines of Code项目地址: https://gitcode.com/GitHub_Trending/au/autogluon导读本文围绕 AutoGluon 开源仓库中docs/api/autogluon.features.rst所定义的autogluon.features特征生成器Feature GeneratorsAPI 展开系统讲解AbstractFeatureGenerator基类以及AutoMLPipelineFeatureGenerator、PipelineFeatureGenerator、BulkFeatureGenerator等 20 余个具体生成器的职责、核心参数与底层实现。你将掌握 AutoGluon 表格数据默认特征工程流水线的完整构成理解每个生成器在原始数据 → 模型可用特征链条中扮演的角色并能够基于源码编写自定义特征生成器。模块定位AutoGluon 特征工程的核心 APIautogluon.features是 AutoGluon 的独立子包对应仓库中的 features 目录它本身不负责模型训练而是提供一整套有状态stateful的特征变换器Feature Generator。每个生成器遵循统一的生命周期初始化时通过参数决定特征生成方式通过.fit()或.fit_transform()在训练数据通常是 pandas DataFrame上拟合通过.transform()将训练阶段学到的变换规则如类别映射、分箱边界、词表应用到新数据上。其 API 参考页面 docs/api/autogluon.features.rst 通过 Sphinxautosummary/autoclass机制将 features/src/autogluon/features/generators/init.py 中导出的全部生成器类自动生成 API 文档。因此本文的行文骨架即对应文档中列出的类清单并按基类 → 组合型生成器 → 单功能生成器三层展开。生成器体系总览层次生成器职责基类AbstractFeatureGenerator所有生成器的抽象基类定义生命周期与元数据管理组合型PipelineFeatureGenerator、BulkFeatureGenerator、AutoMLPipelineFeatureGenerator串联/并联多个生成器构成端到端流水线类型处理AsTypeFeatureGenerator、IdentityFeatureGenerator、LabelEncoderFeatureGenerator、CategoryFeatureGenerator、CategoryMemoryMinimizeFeatureGenerator、NumericMemoryMinimizeFeatureGenerator、DatetimeFeatureGenerator处理数值、类别、日期等特征类型清洗/去重FillNaFeatureGenerator、DropDuplicatesFeatureGenerator、DropUniqueFeatureGenerator缺失值填充、重复列与无信息列剔除衍生特征BinnedFeatureGenerator、DummyFeatureGenerator、RenameFeatureGenerator、TextNgramFeatureGenerator、TextSpecialFeatureGenerator分箱、占位、重命名、文本统计与 n-gram模块的REGISTERED_FE_CLS_LST见init.py还额外注册了ArithmeticFeatureGenerator、CatAsNumFeatureGenerator、CategoricalInteractionFeatureGenerator、FrequencyFeatureGenerator、GroupByFeatureGenerator、IsNanFeatureGenerator、OneHotEncoderFeatureGenerator、OOFTargetEncodingFeatureGenerator、RandomSubsetFeatureCompressionGenerator、SpearmanFeatureSelector等未列入 RST 文档但可用的生成器表明该模块仍在持续扩充。基类 AbstractFeatureGenerator一切生成器的宪法abstract.py 中的AbstractFeatureGenerator是所有生成器的共同祖先。其核心设计可概括为三组概念生命周期方法.fit(X, **kwargs)简单封装fit_transform.fit_transform(X, y, feature_metadata_in, **kwargs)拟合并返回变换结果重复调用会触发AssertionError.transform(X)仅变换若未拟合则触发AssertionError子类只需实现两个内部方法_fit_transform(X, y)与_transform(X)其余流程由基类模板方法统一调度。核心参数初始化参数参数默认值说明features_inNone生成器期望的输入特征名列表不在其中的列会被丢弃。为None时在 fit 阶段自动推断feature_metadata_inNone输入特征的FeatureMetadata对象为None时由_infer_feature_metadata_in推断post_generatorsNone在本生成器变换逻辑之后顺序执行的一系列生成器前者的输出作为后者的输入pre_enforce_typesFalse为True时严格按训练数据的原始 dtype如 int64、float32约束后续数据无法转换则抛异常。建议在流水线最外层开启pre_drop_uselessFalse为True时在 fit 阶段剔除全数据集仅一个唯一值的列post_drop_duplicatesFalse为True时自动在post_generators末尾追加DropDuplicatesFeatureGenerator大宽表上可能极其耗时reset_indexFalse为True时在 fit/transform 期间将索引重置为 0..N-1结束后恢复原索引。建议在流水线最外层开启避免非默认索引破坏内部生成器column_names_as_strTrue将输入列名统一转为字符串避免整数列名导致下游错误name_prefix/name_suffixNone为所有输出特征名添加前后缀会通过追加RenameFeatureGenerator实现infer_features_in_argsNone特征推断时传给FeatureMetadata.get_features()的 kwargsinfer_features_in_args_strategyoverwriteoverwrite完全使用自定义参数update用自定义参数更新默认推断参数banned_feature_special_typesNone额外排除的输入特征特殊类型special typetarget_typeNone目标变量问题类型binary/multiclass/regression供部分需要 y 的生成器使用random_state0拟合时的随机种子verbosity20 静默1 仅警告2 info 级日志3 额外输出详细特征类型信息元数据对象features_in/features_out输入/输出特征名列表feature_metadata_in/feature_metadata变换前后数据的FeatureMetadata含原始 dtype 分组与特殊类型feature_metadata_real变换后数据的精确 dtype 元数据仅供print_feature_metadata_info内省使用可安全置为None以省内存。FeatureMetadata本身定义在 common/src/autogluon/common/features/feature_metadata.py与其配合的原始类型Raw types与特殊类型Special types常量在 common/src/autogluon/common/features/types.py 中定义原始类型包括int、float、object、category、datetime、bool特殊类型包括text、text_as_category、text_special、text_ngram、text_embedding、datetime_as_int、datetime_as_object、image_path、image_bytearray、binned、sparse、stack等。正是这套类型系统驱动着后续每个生成器的_infer_features_in_args选择我该处理哪些特征。组合型生成器把生成器组织成流水线BulkFeatureGenerator多阶段并联-串联框架bulk.py 中的BulkFeatureGenerator面向需要多级特征生成的复杂场景。其核心参数generators是一个生成器组的列表同一组内的生成器并行拟合在同一份数据上输出拼接concat后作为下一组生成器的输入。文档给出的标准示例from autogluon.tabular import TabularDataset from autogluon.features.generators import ( AsTypeFeatureGenerator, BulkFeatureGenerator, CategoryFeatureGenerator, DropDuplicatesFeatureGenerator, FillNaFeatureGenerator, IdentityFeatureGenerator, ) from autogluon.common.features.types import R_INT, R_FLOAT generators [ [AsTypeFeatureGenerator()], # 将所有输入特征转换为与 fit 时完全一致的类型 [FillNaFeatureGenerator()], # 填充所有缺失值 [ CategoryFeatureGenerator(), # 将 object 类型转为 category 并最小化内存 # 将非 object/category 特征原样保留否则 int 特征会被丢弃 IdentityFeatureGenerator(infer_features_in_argsdict(valid_raw_types[R_INT, R_FLOAT])), ], # CategoryFeatureGenerator 与 IdentityFeatureGenerator 的输出拼接后 # 再输入 DropDuplicatesFeatureGenerator [DropDuplicatesFeatureGenerator()], # 剔除彼此重复的特征 ] feature_generator BulkFeatureGenerator(generatorsgenerators, verbosity3) label class train_data TabularDataset(https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv) X_train train_data.drop(labels[label], axis1) y_train train_data[label] X_train_transformed feature_generator.fit_transform(XX_train, yy_train) test_data TabularDataset(https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv) X_test_transformed feature_generator.transform(test_data)源码实现要点_fit_transform见 bulk.py每个 Stage 通过_fit_transform_stage并行执行组内生成器并借助is_valid_metadata_in判断某生成器是否有可用输入——无合适 dtype 输入时直接跳过并记录日志组内生成器若产生同名特征会触发AssertionErrorDataFrame 不允许重名列此时应通过name_prefix规避remove_unused_featuresTrue默认会在拟合后基于特征依赖链裁剪未产生任何输出特征的输入特征优化推理速度传false_recursive可同时关闭内层生成器的该行为pre_generators/post_generators会被分别转成独立的 Stage 拼接到self.generators的首尾。PipelineFeatureGenerator带智能默认值的端到端封装pipeline.py 中的PipelineFeatureGenerator是BulkFeatureGenerator的子类在默认值上做了大量工程化处理官方明确建议所有面向端到端数据变换的自定义生成器都应基于它参数默认值说明pre_generators[FillNaFeatureGenerator(inplaceTrue)]主变换之前执行先填充缺失值post_generators[DropUniqueFeatureGenerator()]主变换之后执行剔除唯一值占比过高的无信息列pre_drop_uselessTrue剔除全列单值的无用特征pre_enforce_typesTrue强制类型一致reset_indexTrue重置索引post_drop_duplicatesTrue末尾去重列verbosity3默认输出详尽日志该生成器还有两个值得注意的健壮性设计内存用量监控_compute_pre_memory_usage/_compute_post_memory_usagepipeline.py会估算变换前后 DataFrame 的内存占用当原始数据占用超过可用内存 5%、处理后超过 15% 时输出警告空数据兜底_fit_transform_custom在检测到所有输入特征均无用时会将流水线替换为DummyFeatureGenerator输出一个全 0 的__dummy__特征并打印警告保证 AutoGluon 不会因 0 特征而崩溃。AutoMLPipelineFeatureGeneratorAutoGluon 表格任务的默认流水线auto_ml_pipeline.py 中的AutoMLPipelineFeatureGenerator是 AutoGluon Tabular 在未指定feature_generator时的默认特征生成流水线见 tabular/src/autogluon/tabular/configs/config_helper.py 中的AutoMLPipelineFeatureGenerator构建逻辑以及 feature_generator_presets.py。它以开关参数的形式把PipelineFeatureGenerator的各能力暴露给用户参数默认值说明enable_numeric_featuresTrue保留 int/float 原始类型特征原样透传给模型追加IdentityFeatureGeneratorenable_categorical_featuresTrue将 object/category 特征处理为内存优化的 category追加CategoryFeatureGeneratorenable_datetime_featuresTrue将 datetime 特征转为自 epoch 起的毫秒数 int 特征追加DatetimeFeatureGeneratorenable_text_special_featuresTrue由 text 特征生成词数、大写字母比例、符号计数等统计特征追加TextSpecialFeatureGeneratorenable_text_ngram_featuresTrue由 text 特征生成 n-gram 特征追加TextNgramFeatureGeneratorenable_raw_text_featuresFalse是否保留原始文本特征输出列名带_raw_text后缀如sentence → sentence_raw_textenable_vision_featuresTrue[实验性] 保留被标记为image_path特殊类型的列仅供视觉模型使用不会被当作类别特征。注意image_path不会被自动推断需在自定义FeatureMetadata中显式指定vectorizerCountVectorizer(min_df30, ngram_range(1, 3), max_features10000, dtypenp.uint8)传入TextNgramFeatureGenerator的 sklearn 向量化器text_ngram_paramsNone除vectorizer外传给TextNgramFeatureGenerator的其余参数custom_feature_generatorsNone自定义生成器列表插入到第一个拿到原始 X 的生成器阶段即最先执行需自行避免与默认生成器重叠默认流水线由_get_default_generatorsauto_ml_pipeline.py构建顺序为数值特征原样保留 →可选原始文本保留 → 类别特征处理 → 日期特征处理 → 文本统计特征 → 文本 n-gram →可选视觉特征及其缺失标记。注意它不接受generators参数若需自定义生成器组合应改用PipelineFeatureGenerator。使用示例取自该类的 docstringfrom autogluon.tabular import TabularDataset from autogluon.features.generators import AutoMLPipelineFeatureGenerator feature_generator AutoMLPipelineFeatureGenerator() label class train_data TabularDataset(https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv) X_train train_data.drop(labels[label], axis1) y_train train_data[label] X_train_transformed feature_generator.fit_transform(XX_train, yy_train) test_data TabularDataset(https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv) X_test_transformed feature_generator.transform(test_data)此外该模块还提供AutoMLInterpretablePipelineFeatureGenerator它通过覆盖_get_category_feature_generator改用CategoryFeatureGenerator(minimize_memoryFalse, maximum_num_cat10, post_generators[OneHotEncoderFeatureGenerator()])从而产出可解释性更好的 one-hot 特征。单功能生成器逐个解析以下逐一对应 RST 文档列出的生成器类结合源码说明其行为。AsTypeFeatureGenerator类型强制与布尔化astype.py 用于在变换时强制数据 dtype 与训练时一致无法转换则抛异常。核心参数convert_boolTrue自动将只有两个唯一值的特征转换为布尔int8 的 0/1convert_bool_methodauto布尔转换方法auto时按convert_bool_method_v2_threshold默认 15布尔列数 ≥15 用 v2 批量法与convert_bool_method_v2_row_threshold默认 128行数阈值自动选择 v1简单逐列法或 v2快速批量法大数据量下可快 10 倍以上推理阶段若发现训练时为无缺失的 int 特征出现了缺失值会警告并填充为 0。IdentityFeatureGenerator原样透传identity.py 不做任何变换仅按infer_features_in_args筛选特征后原样返回。它是组合流水线中保留某类特征的标准手段例如AutoMLPipelineFeatureGenerator用它保留数值特征与image_path特征。其_more_tags声明feature_interactionsFalse表示输入输出为一一映射从而支持自动化的特征剪枝。CategoryFeatureGenerator类别特征处理核心category.py 负责将 object 类型转为 category、剔除罕见类别并优化内存是默认流水线中类别处理的主力。关键参数stateful_categoriesTrue训练类别映射在变换时生效训练中未见过的新类别被当作缺失值minimize_memoryTrue将类别值替换为顺序整数追加CategoryMemoryMinimizeFeatureGenerator不损失精度但大幅降低内存cat_orderoriginal类别顺序可选original/alphanumeric/count按频次排序最少的编码为 0决定minimize_memoryTrue时各类别对应的整数编码minimum_cat_count2出现次数少于该值的类别视为罕见类别并被置为缺失maximum_num_catNone最多保留的非罕见类别数按出现频次取前 N 个fillnaNone缺失值处理方式None保持 NaNmode填众数rare将缺失归入专门的稀有类别整数类别为max(categories)1否则为_NaN_若缺失值过少则并入最稀有的幸存类别。拟合后文本类特征会被标记为text_as_category特殊类型见_fit_transform中S_TEXT → S_TEXT_AS_CATEGORY的迁移逻辑供下游模型区分。DatetimeFeatureGenerator日期转数值datetime.py 将 datetime及被识别为datetime_as_object的字符串日期转为数值特征。默认提取[year, month, day, dayofweek]四个分量可通过features参数自定义完整选项见 pandasSeries.dt访问器同时保留自 epoch 起的毫秒数原始数值。实现上通过pd.to_datetime(utcTrue, errorscoerce, formatmixed)做宽松解析拟合阶段以非缺失值的均值时间戳填充缺失值_fillna_map。输出特征命名形如feature.year、feature.dayofweek特殊类型标记为datetime_as_int。CategoryMemoryMinimizeFeatureGenerator / NumericMemoryMinimizeFeatureGenerator内存优化memory_minimize.py 中的两个生成器分别压缩类别与数值特征内存CategoryMemoryMinimizeFeatureGenerator把 category 的取值映射为单调递增整数RangeIndexNumericMemoryMinimizeFeatureGenerator将 int 特征裁剪并转换 dtype默认dtype_outnp.uint8np.iinfo/np.finfo自动决定裁剪上下界适用于取值区间已知的离散特征。FillNaFeatureGenerator缺失值填充fillna.py 按原始类型映射填充缺失值fillna_map{object: }按 raw type 指定填充值fillna_defaultnp.nan未出现在映射中的 raw type 的默认填充值建议保持 np.naninplaceFalse为True时不复制数据直接原地填充会改动外部数据。DropDuplicatesFeatureGenerator重复列剔除drop_duplicates.py 剔除完全重复的特征列。关键参数sample_size_init1000先用小样本初筛候选重复列大幅加速sample_size_final5000最终判定时抽样的行数None时做精确去重最昂贵。实现上针对数值列采用统计量分桶 blake2b 全列指纹哈希的两阶段方案源码注释称可比 pandasdrop_duplicates快 100 倍以上类别列则先将每列factorize为编码再复用数值方案变换时由于重复列已被移出features_in_transform直接返回原数据。DropUniqueFeatureGenerator低信息列剔除drop_unique.py 剔除两类列只有 1 个唯一值的常量列以及max_unique_ratio默认 0.99以上取值互不重复的 category/object 列近似唯一值如 ID 列。但具有text、image_path、image_bytearray特殊类型的列会被豁免避免误删文本与图片特征。BinnedFeatureGenerator数值分箱binned.py 将 int/float 特征按num_bins默认 10分箱为保持相对秩序的离散整数值并通过get_smallest_valid_dtype_int选用能容纳分箱数的最小整数 dtype 以省内存输出特征标记为binned特殊类型。分箱逻辑封装在 features/src/autogluon/features/binning.py。DummyFeatureGenerator占位特征dummy.py 忽略所有输入输出一个全 0 的__dummy__列。用于测试或当数据无可用特征时兜底is_valid_metadata_in恒为TruePipelineFeatureGenerator的空数据场景即依赖它。RenameFeatureGenerator列重命名rename.py 通过name_prefix/name_suffix重命名列而不改变取值用于避免多路变换产生重名列或标记特征来源。inplaceFalse时不修改外部数据其_more_tags声明allow_post_generatorsFalse即该生成器不允许再挂post_generators。基类AbstractFeatureGenerator在指定name_prefix/name_suffix时也会自动追加一个RenameFeatureGenerator(inplaceFalse)见 abstract.py。LabelEncoderFeatureGenerator类别编码化label_encoder.py 将 category 特征转换为对应的cat.codes整数编码缺失编码为 -1并把text_as_category特殊类型从输出元数据中移除。TextSpecialFeatureGenerator文本统计特征text_special.py 从原始文本特征生成统计特征每个文本列默认产出 6 个基础统计量char_count字符数、word_count词数、capital_ratio大写字母比例、lower_ratio小写字母比例、digit_ratio数字比例、special_ratio特殊符号比例并对每个过滤后保留的符号生成symbol_count.symbol与symbol_ratio.symbol计数/比例特征。参数symbols默认[!, ?, , %, $, *, , #, ^, ., :, , /, ;, -, ]min_occur_ratio0.01min_occur_offset10符号出现次数需达到ceil(min_occur_offset n_samples * min_occur_ratio)才生成对应特征见_filter_symbolsbin_featuresTrue在post_generators最前面追加BinnedFeatureGenerator对输出分箱降低模型过拟合风险与内存占用post_drop_duplicatesTrue默认去重当部分符号在数据中不出现时清理输出。输出特征的特殊类型为text_special。TextNgramFeatureGenerator文本 n-gram 特征text_ngram.py 使用 sklearnCountVectorizer或TfidfVectorizer为文本特征生成 n-gram 特征。核心参数vectorizer默认CountVectorizer(min_df30, ngram_range(1, 3), max_features10000, dtypenp.uint8)若改用TfidfVectorizer内存占用将增加约 4–8 倍vectorizer_strategycombinedcombined将所有文本列拼接后共用一个向量化器特征名加__nlp__.前缀separate每列独立向量化both两者输出拼接。除非各文本列互不相关否则建议保持combinedmax_memory_ratio0.15OOM 安全阀预测 n-gram 以 float32 存储的内存占比超过该比例时按最不频繁到最频繁的顺序裁剪词表downscale_vectorizerprefilter_tokensFalse、prefilter_token_count100可选地使用SelectKBest二分类用f_classif回归用f_regression仅保留与目标最相关的 token。实现细节_fit_transform_ngrams拟合向量化器时通过去重文本列表加速并把vectorizer.stop_words_置None大数据集上对象体积可缩小 100 倍以上每个特征还额外追加一个_total_列表示该行非零 n-gram 计数若生成过程 OOM会尝试将词表按 0.25 比例降采样重试失败 3 次后放弃 n-gram 特征。编写自定义特征生成器基于基类的模板方法模式编写新生成器只需实现三个方法参考 tabular 示例 example_custom_feature_generator.pyfrom autogluon.features.generators import AbstractFeatureGenerator class MyFeatureGenerator(AbstractFeatureGenerator): staticmethod def get_default_infer_features_in_args() - dict: # 指定本生成器关注哪些类型的输入特征 return dict(valid_raw_types[int, float]) def _fit_transform(self, X, yNone, **kwargs): # 训练期拟合逻辑返回 (X_out, type_group_map_special) ... def _transform(self, X): # 推理期变换逻辑必须与训练期输出列完全一致 ...基类会在fit_transform中自动完成列名字符串化、特征推断、pre_drop_useless/pre_enforce_types处理、post_generators链式拟合以及features_out/feature_metadata的构建子类无需关心这些样板逻辑。若生成器不涉及特征交互一对一映射应在_more_tags中返回{feature_interactions: False}以支持自动特征剪枝。对应单元测试可参考 features/tests/features/generators/test_auto_ml_pipeline.py 等测试文件其中大量使用fit_transform_assert校验输出。小结autogluon.features以AbstractFeatureGenerator为统一抽象通过单功能生成器 组合型生成器BulkFeatureGenerator/PipelineFeatureGenerator/AutoMLPipelineFeatureGenerator两级体系将 AutoGluon 表格流水线的特征工程完整解耦数值原样透传、类别编码压缩、日期数值化、文本统计与 n-gram、缺失填充、重复/无信息列剔除均可独立开关与自由组合。理解这些生成器的参数与实现仓库中 features/src/autogluon/features/generators/ 目录即是全部实现既能让你在fit(..., feature_generator...)处精准调优默认流水线也为编写符合 AutoGluon 规范的自定义特征变换器提供了可直接参照的范式。【免费下载链接】autogluonFast and Accurate ML in 3 Lines of Code项目地址: https://gitcode.com/GitHub_Trending/au/autogluon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考