确定数据集的列在任何给定的 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
X
和 t.transform(X)
的列之间存在一对一的映射,即 X[:, i] -> t.transform(X)[:, i]
,而这显然不是sklearn.decomposition.PCA
.
的案例
其推论是:我们能否知道输入的列将如何通过应用 t
来改变,例如sklearn.feature_selection.SelectKBest
选择了哪些列。
我不是寻找针对特定变压器的解决方案,而是寻找适用于所有或至少适用于多种变压器的解决方案。
如有必要,请随意实施您自己的管道 class 或包装器。
我找到了部分答案。 StandardScaler
和 SelectKBest
都有 .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']
给定一个 sklearn 变换器 t
,有没有办法确定 t
是否更改 columns/column 任何给定输入数据集 X
、 的顺序没有将其应用于数据?
例如 t = sklearn.preprocessing.StandardScaler
X
和 t.transform(X)
的列之间存在一对一的映射,即 X[:, i] -> t.transform(X)[:, i]
,而这显然不是sklearn.decomposition.PCA
.
其推论是:我们能否知道输入的列将如何通过应用 t
来改变,例如sklearn.feature_selection.SelectKBest
选择了哪些列。
我不是寻找针对特定变压器的解决方案,而是寻找适用于所有或至少适用于多种变压器的解决方案。
如有必要,请随意实施您自己的管道 class 或包装器。
我找到了部分答案。 StandardScaler
和 SelectKBest
都有 .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']