在OneHotEncoder文档中,infrequent与unknown出现在相邻参数里,却指向不同来源的类别。scikit-learn 1.9.1的定义从输入开始:整数或字符串表示离散特征的取值,独热编码为每个类别建立二进制列,结果可以是稀疏矩阵或稠密数组。默认情况下,编码器按每个特征见过的唯一值取得类别。[1]
因此,低频类别仍是已有类别中的成员,只是在频数规则下被归到一组;未知类别则是在转换时出现、需要由handle_unknown决定如何表达的取值。API的categories_列出拟合时确定的类别,infrequent_categories_则列出各特征里的低频类别。两套属性提供不同集合的记录,不能把低频列表直接转述成全部未知输入的名单。
min_frequency的两种类型具有不同口径。整数表示数量门槛,某类别的样本数低于它时视作低频;浮点数则按该值与样本总数的乘积比较。这里说明的是参数的类型含义,没有为项目推荐一个门槛。max_categories回答另一个问题:每个输入特征最多输出多少列;存在低频类别时,这个上限把代表低频组的那一列也计在内,而不是只限制常见类别后再额外加一列。
低频类别可以合并为一组,但分组与删列不是同时按原始类别独立发生。文档明确把drop安排在分组之后。drop_idx_记录每个特征要删除的类别在categories_中的位置;若它对应一个低频类别,删除的是整个低频组。这项顺序有直接的读表用途:解释一份输出列清单时,必须知道被删除的对象是否已经代表多个原始类别,不能只按一个类别名称描述其范围。
未知类别的error策略会在转换时抛出错误;ignore则把该特征对应的独热编码列全部表示为零。逆向转换时,这个未知类别用None表示。这里的全零限定在相应特征的列,不能扩大为整条样本的所有特征都被改成零;None也保留为文档说明的逆向结果,而不是另猜原来的类别名称。
infrequent_if_exist带有一个关键条件:低频组确实存在时,未知类别才映射到该组,位置在编码的最后;逆向转换将其表示为infrequent。若没有低频组,转换和逆向转换都按ignore处理。这个分支说明,策略名称含有低频,并不足以证明每个输入特征都有可接纳未知值的低频列,还要看该特征是否形成过这样的组。
warn并非另造第五种类别集合。文档说它先发出警告,随后按infrequent_if_exist继续编码。于是,警告属于处理过程的信息,而后续类别表达仍取决于低频组是否存在。版本注记将warn标为1.6新增,不能拿这一实现版本号当作当前网页首次发布日期。
对AI开发资料的整理,这些规则把类别清单、低频分组、输出列数量、分组后删列和未知输入表达连在一起,解释的是编码对象如何变化。本篇限于实际读取的1.9.1接口定义,没有执行编码、训练模型或选择业务阈值;这也与分类结果的混淆矩阵、AP评分是不同问题。
资料:[1] https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。