使用Scikit-learn包的OneToOneFeatureMixin

举报
yd_37369233 发表于 2026/08/27 13:47:20 2026/08/27
【摘要】 OneToOneFeatureMixin 是 scikit-learn 中的一个 Mixin 类,用于为一对一特征映射的自定义 Transformer 提供特征名称推断(get_feature_names_out)的能力。────────────────────核心概念当一个 Transformer 对每个输入特征独立地进行一一对应的变换(输出特征数 = 输入特征数,且每个输出特征只依赖于一...

OneToOneFeatureMixin 是 scikit-learn 中的一个 Mixin 类,用于为一对一特征映射的自定义 Transformer 提供特征名称推断(get_feature_names_out)的能力。

────────────────────

核心概念

当一个 Transformer 对每个输入特征独立地进行一一对应的变换(输出特征数 = 输入特征数,且每个输出特征只依赖于一个输入特征)时,可以继承此 Mixin,自动获得
get_feature_names_out() 方法。

│ 📌 该类自 scikit-learn 1.1 起引入。

────────────────────

类签名

class sklearn.base.OneToOneFeatureMixin

它只提供一个方法:

get_feature_names_out(input_features=None) -> ndarray
• 如果 input_features 为 None,则返回默认名称 ["x0", "x1", ..., "x(n-1)"]。
• 如果提供了 input_features,则原样返回(因为是一对一映射,名称不变)。

────────────────────

使用示例

示例 1:自定义一对一 Transformer

import numpy as np
from sklearn.base import BaseEstimator, TransformerMixin, OneToOneFeatureMixin

class DoubleFeatures(OneToOneFeatureMixin, BaseEstimator, TransformerMixin):
    """将每个特征乘以 2 的一对一变换器"""

    def fit(self, X, y=None):
        # 验证输入并存储 n_features_in_
        self._validate_data(X, reset=True)
        return self

    def transform(self, X):
        # 验证输入与 fit 时一致
        self._validate_data(X, reset=False)
        return X * 2

    def inverse_transform(self, X):
        self._validate_data(X, reset=False)
        return X / 2


# 使用
X = np.array([[1, 2, 3],
              [4, 5, 6]])

transformer = DoubleFeatures()
transformer.fit(X)

print("transform:\n", transformer.transform(X))
# [[ 2  4  6]
#  [ 8 10 12]]

print("feature names (default):", transformer.get_feature_names_out())
# ['x0' 'x1' 'x2']

print("feature names (custom):", transformer.get_feature_names_out(input_features=["a", "b", "c"]))
# ['a' 'b' 'c']

示例 2:与 Pipeline 结合使用

from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
import pandas as pd

df = pd.DataFrame({"temperature": [20, 25, 30], "humidity": [60, 65, 70]})
y = np.array([1.0, 2.0, 3.0])

pipe = make_pipeline(DoubleFeatures(), LinearRegression())
pipe.fit(df, y)

# 因为 DoubleFeatures 继承了 OneToOneFeatureMixin,
# pipeline 可以正确传递特征名称
print(pipe[:-1].get_feature_names_out())
# ['temperature' 'humidity']

────────────────────

继承顺序很重要

# ✅ 正确:OneToOneFeatureMixin 在前
class MyTransformer(OneToOneFeatureMixin, BaseEstimator, TransformerMixin):
    ...

# ❌ 错误:可能导致 MRO 问题
class MyTransformer(BaseEstimator, TransformerMixin, OneToOneFeatureMixin):
    ...

────────────────────

与相关 Mixin 的对比

Mixin │ 输出特征数 │ 适用场景
─────────────────────────────────┼────────────┼─────────────────────────────────────────
OneToOneFeatureMixin │ = 输入数 │ 一对一映射(如缩放、取对数)
─────────────────────────────────┼────────────┼─────────────────────────────────────────
ClassNamePrefixFeaturesOutMixin │ 自定义 │ 输出名加类名前缀(如 PCA → pca0, pca1)
─────────────────────────────────┼────────────┼─────────────────────────────────────────
TransformerMixin │ — │ 仅提供 fit_transform,无特征名推断

────────────────────

关键注意事项

1. 必须调用 _validate_data:在 fit 中用 reset=True,在 transform 中用 reset=False,以确保 n_features_in_ 和 feature_names_in_ 被正确设置。
2. 仅适用于一对一映射:如果你的 Transformer 改变了特征数量(如 PCA、多项式特征),应使用 ClassNamePrefixFeaturesOutMixin 或手动实现

get_feature_names_out。
3. 与 pandas 交互:当输入是 DataFrame 时,validate_data 会自动存储 feature_names_in,get_feature_names_out() 会返回这些列名。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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