Dado un transformador sklearn t , ¿hay alguna forma de determinar si t cambia el orden de las columnas/columnas de cualquier conjunto de datos de entrada X , sin aplicarlo a los datos?
Por ejemplo, con t = sklearn.preprocessing.StandardScaler hay un mapeo 1 a 1 entre las columnas de X y t.transform(X) , a saber, X[:, i] -> t.transform(X)[:, i] , mientras que obviamente este no es el caso para sklearn.decomposition.PCA .
Un corolario de eso sería: ¿Podemos saber cómo cambiarán las columnas de la entrada al aplicar t , por ejemplo, qué columnas elige un sklearn.feature_selection.SelectKBest ya ajustado?
No estoy buscando soluciones para transformadores específicos , sino una solución aplicable a todos o al menos a una amplia selección de transformadores.
Siéntase libre de implementar su propia clase Pipeline o contenedor si es necesario.
No todos sus "transformadores" tendrían el método .get_feature_names_out . Su implementación se discute en sklearn github . En el mismo enlace, puede ver que hay, para citar a @thomasjpfan, una clase _OneToOneFeatureMixin utilizada por transformadores con una correspondencia simple uno a uno entre las características de entrada y salida.
Restringido a sklearn, podemos verificar si el transformador o estimador es una subclase de _OneToOneFeatureMixin , por ejemplo:
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']Estos serían el código fuente de _OneToOneFeatureMixin
Encontré una respuesta parcial. Tanto StandardScaler como SelectKBest tienen métodos .get_feature_names_out . No encontré el tiempo para investigar más.
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())