确定数据集的列在任何给定的 Scikit-Learn 转换器下是否不变

Determine whether the Columns of a Dataset are invariant under any given Scikit-Learn Transformer

给定一个 sklearn 变换器 t,有没有办法确定 t 是否更改 columns/column 任何给定输入数据集 X 的顺序没有将其应用于数据?

例如 t = sklearn.preprocessing.StandardScaler Xt.transform(X) 的列之间存在一对一的映射,即 X[:, i] -> t.transform(X)[:, i],而这显然不是sklearn.decomposition.PCA.

的案例

其推论是:我们能否知道输入的列将如何通过应用 t 来改变,例如sklearn.feature_selection.SelectKBest 选择了哪些列。

不是寻找针对特定变压器的解决方案,而是寻找适用于所有或至少适用于多种变压器的解决方案。

如有必要,请随意实施您自己的管道 class 或包装器。

我找到了部分答案。 StandardScalerSelectKBest 都有 .get_feature_names_out 方法。我没有时间进一步调查。

from numpy.random import RandomState
import numpy as np
import pandas as pd

from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest

from sklearn.linear_model import LassoCV


rng = RandomState()

# Make some data
slopes = np.array([-1., 1., .1])
X = pd.DataFrame(
    data = np.linspace(-1,1,500)[:, np.newaxis] + rng.random((500, 3)), 
    columns=["foo", "bar", "baz"]
)
y = pd.Series(data=np.linspace(-1,1, 500) + rng.rand((500)))

# Test Transformers
scaler = StandardScaler().fit(X)
selector = SelectKBest(k=2).fit(X, y)

print(scaler.get_feature_names_out())
print(selector.get_feature_names_out())

并不是所有的“变形金刚”都有 .get_feature_names_out 方法。它的实现在 sklearn github 中讨论。在同一个 link 中,您可以看到有一个 _OneToOneFeatureMixin class 由具有输入和输出特征之间简单的一对一对应关系的转换器使用 _OneToOneFeatureMixin class 16=]

限于sklearn,我们可以检查transformer或estimator是否是_OneToOneFeatureMixin的subclass,例如:

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest
from sklearn.base import _OneToOneFeatureMixin

tf = {'pca':PCA(),'standardscaler':StandardScaler(),'kbest':SelectKBest()}

[i+":"+str(issubclass(type(tf[i]),_OneToOneFeatureMixin)) for i in tf.keys()]

['pca:False', 'standardscaler:True', 'kbest:False']

这些会 source code for _OneToOneFeatureMixin