使用Scikit-learn包的OneToOneFeatureMixin
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() 会返回这些列名。
- 点赞
- 收藏
- 关注作者
评论(0)