使用Scikit-learn包的ClassNamePrefixFeaturesOutMixin

举报
yd_37369233 发表于 2026/08/18 10:21:31 2026/08/18
【摘要】 使用 Scikit-learn 的 ClassNamePrefixFeaturesOutMixin 前言在 Scikit-learn 中,get_feature_names_out 是一个非常重要的接口,它允许转换器(transformer)输出转换后的特征名称,从而让机器学习流水线(pipeline)中的每一步都能保持特征的可解释性。而 ClassNamePrefixFeaturesOu...

使用 Scikit-learn 的 ClassNamePrefixFeaturesOutMixin

前言

在 Scikit-learn 中,get_feature_names_out 是一个非常重要的接口,它允许转换器(transformer)输出转换后的特征名称,从而让机器学习流水线(pipeline)中的每一步都能保持特征的可解释性。而 ClassNamePrefixFeaturesOutMixin 正是 Scikit-learn 提供的一个辅助混合类(mixin),用于帮助开发者快速实现这一功能。

什么是 ClassNamePrefixFeaturesOutMixin?

ClassNamePrefixFeaturesOutMixinsklearn.base 模块中的一个混合类。它的作用是为需要自行生成输出特征名称的转换器提供标准化实现——通过将类名的小写形式作为前缀,自动为每个输出特征生成名称。

简单来说,如果你的自定义转换器输出了 n 个特征,这个 mixin 能自动帮你生成形如 ["类名前缀0", "类名前缀1", ..., "类名前缀n-1"] 的特征名称数组。

为什么需要它?

在 Scikit-learn 的生态中,get_feature_names_out 方法是 set_output API 的核心组成部分。当一个转换器实现了这个方法后,BaseEstimator 会自动包装 transformfit_transform 方法以遵循 set_output API。这意味着:

  • 流水线中的中间步骤可以保留有意义的特征名称
  • 输出数据可以以 DataFrame 等形式返回,并带有清晰的列名
  • 整个机器学习工作流的可解释性和调试体验大幅提升

ClassNamePrefixFeaturesOutMixinOneToOneFeatureMixin 一起,被官方列为定义 get_feature_names_out 的实用辅助类

工作原理

这个 mixin 的工作基于一个关键假设:当转换器被拟合(fitted)后,必须定义一个 _n_features_out 属性,表示 transformfit_transform 方法将返回的输出特征数量。

在调用 get_feature_names_out 时,mixin 会:

  1. 获取当前类的名称并将其转换为小写(例如 MyTransformer"mytransformer"
  2. 读取 _n_features_out 属性获取特征数量
  3. 生成形如 ["类名小写0", "类名小写1", ...] 的特征名称数组

官方示例

以下是一个来自 Scikit-learn 官方文档的完整示例:

import numpy as np
from sklearn.base import ClassNamePrefixFeaturesOutMixin

class MyEstimator(ClassNamePrefixFeaturesOutMixin):
    def fit(self, X, y=None):
        # 关键:在 fit 中设置输出特征数量
        self._n_features_out = X.shape[1]
        return self

X = np.array([[1, 2], [3, 4]])
MyEstimator().fit(X).get_feature_names_out()
# 输出: array(['myestimator0', 'myestimator1'], dtype=object)

在这个例子中,MyEstimator 继承自 ClassNamePrefixFeaturesOutMixin,在 fit 方法中设置了 _n_features_out = X.shape[1](即 2)。调用 get_feature_names_out() 后,自动返回了 ["myestimator0", "myestimator1"]

更完整的实现(继承 BaseEstimator)

在实际开发中,通常还会同时继承 BaseEstimator 以获取完整的估计器接口:

import numpy as np
from sklearn.base import BaseEstimator, ClassNamePrefixFeaturesOutMixin

class MyEstimator(ClassNamePrefixFeaturesOutMixin, BaseEstimator):
    def fit(self, X, y=None):
        self._n_features_out = X.shape[1]
        return self

X = np.array([[1, 2], [3, 4]])
MyEstimator().fit(X).get_feature_names_out()
# 输出: array(['myestimator0', 'myestimator1'], dtype=object)

实际应用场景

在 Scikit-learn 的核心代码库中,ClassNamePrefixFeaturesOutMixin 被多个内置转换器所使用。例如:

  • KNeighborsTransformer:将输入转换为 k 近邻的加权图,继承自 ClassNamePrefixFeaturesOutMixin
  • PCA:主成分分析,输出特征名称形如 ["pca0", "pca1", "pca2"]

方法说明

ClassNamePrefixFeaturesOutMixin 主要提供一个公开方法:

get_feature_names_out(input_features=None)

获取转换后的输出特征名称。

  • 参数 input_features:可选,用于验证输入特征名称是否与 fit 时看到的名称一致
  • 返回ndarray 类型的特征名称数组

特征名称的生成规则是:以类名的小写形式为前缀,后接从 0 开始的数字索引

注意事项

  1. 必须设置 _n_features_out:在 fit 方法中必须为 self._n_features_out 赋值,否则 get_feature_names_out 无法正常工作。

  2. 类名影响输出:生成的特征名称前缀取决于实际子类的名称。如果类名是 MyCustomTransformer,输出将是 ["mycustomtransformer0", "mycustomtransformer1", ...]

  3. 配合 BaseEstimator 使用:虽然官方示例中单独继承 ClassNamePrefixFeaturesOutMixin 也能工作,但生产级代码建议同时继承 BaseEstimator,以获得完整的 Scikit-learn 估计器接口。

总结

ClassNamePrefixFeaturesOutMixin 是 Scikit-learn 为转换器开发者提供的一个轻量级但极其实用的辅助工具。它让自定义转换器能够以极少的代码量实现 get_feature_names_out 方法,从而无缝融入 Scikit-learn 的现代输出 API 体系。

无论你是在开发一个简单的特征选择器,还是构建复杂的降维算法,只要你的转换器需要输出多个特征并希望保留可解释的特征名称,ClassNamePrefixFeaturesOutMixin 都是一个值得纳入工具箱的利器。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。