es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar StandardScaler dentro de un pipeline solo en ciertos valores?

Tengo un problema. Quiero usar StandardScaler(), pero mi conjunto de datos contiene ciertos valores de OneHotEncoding y otros valores que no deben ser escalados. Pero si ejecuto StandardScaler(), todos los valores se escalan. ¿Existe alguna opción para ejecutar este método solo en ciertos valores dentro de una tubería?

Encontré esta pregunta: [https://stackoverflow.com/questions/43798377/one-hot-encode-categorical-variables-and-scale-continuous-ones-simultaneouely] con el siguiente código:

columns = ['rank']
columns_to_scale = ['gre', 'gpa']

scaler = StandardScaler()
ohe = OneHotEncoder(sparse=False)

Entonces, ¿hay alguna opción para ejecutar solo StandardScaler() dentro de una tubería, solo en ciertos valores y fusionar los otros valores con los valores escalados? Por lo tanto, la tubería solo debería usar StandardScaler() en los valores ‘xy’ y ‘xyz’.

Clase StandardScaler

from sklearn.base import BaseEstimator, TransformerMixin

class StandardScalerConCaracteristicas(BaseEstimator, TransformerMixin):
    def __init__(self, columnas_a_escalarse):
        scaler = StandardScaler()

    def fit(self, X, y=None):
        scaler.fit(X_train) # solo std.fit en el conjunto de entrenamiento
        X_train_nor = scaler.transform(X_train.values)

    def transform(self, X, y=None):
        return X
**Tubería**

columnas_a_escalarse = [‘xy’, ‘xyz’]

pasos = [(‘standard_scaler’, StandardScalerConCaracteristicas(columnas_a_escalarse)),
(‘seleccion_de_caracteristicas’, SelectFromModel(estimator=LogisticRegression(max_iter=100))),
(‘lasso’, Lasso(alpha=0.03))]

tuberia = Pipeline(pasos)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=30)

parametros = {}

grid = GridSearchCV(tuberia, param_grid=parametros, cv=5)
grid.fit(X_train, y_train)

print(“score = %3.2f” %(grid.score(X_test, y_test)))
print(‘Puntuación del conjunto de entrenamiento: ‘ + str(grid.score(X_train, y_train)))
print(‘Puntuación del conjunto de prueba: ‘ + str(grid.score(X_test, y_test)))

Predicción

y_pred = grid.predict(X_test)
print(“RMSE Val:”, metrics.mean_squared_error(y_test, y_pred, squared=False))

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una opción para ejecutar solo el StandardScaler() en determinados valores dentro de una tubería. Una posible solución es crear un transformador personalizado que extienda la clase StandardScaler y solo aplique la operación de escalado en las columnas deseadas. Aquí tienes un ejemplo de implementación:

    from sklearn.base import BaseEstimator, TransformerMixin
    from sklearn.preprocessing import StandardScaler
    
    class StandardScalerConCaracterísticasEspecíficas(BaseEstimator, TransformerMixin):
        def __init__(self, columnas_a_escalar):
            self.columnas_a_escalar = columnas_a_escalar
            self.escalador = StandardScaler()
    
        def fit(self, X, y=None):
            self.escalador.fit(X[self.columnas_a_escalar])
            return self
    
        def transform(self, X, y=None):
            X_escalado = self.escalador.transform(X[self.columnas_a_escalar])
            X_sin_escalar = X.drop(columns=self.columnas_a_escalar)
            return pd.concat([pd.DataFrame(X_escalado, columns=self.columnas_a_escalar), X_sin_escalar], axis=1)
    

    Este transformador acepta una lista de nombres de columna (columnas_a_escalar) como entrada en su constructor. Durante el método fit, aplica el método fit del objeto StandardScaler solo en las columnas seleccionadas. Durante el método transform, aplica el método transform del objeto StandardScaler en las columnas seleccionadas y anexa las columnas no escaladas al resultado.

    Puedes usar este transformador personalizado en una tubería junto con otros transformadores o estimadores que operen en diferentes columnas. Aquí tienes un ejemplo de tubería:

    from sklearn.pipeline import Pipeline
    from sklearn.linear_model import LinearRegression
    
    columnas_a_escalar = ['xy', 'xyz']
    
    tuberia = Pipeline([
        ('escalador', StandardScalerConCaracterísticasEspecíficas(columnas_a_escalar)),
        ('regresor', LinearRegression())
    ])
    

    En este ejemplo, el transformador StandardScalerConCaracterísticasEspecíficas se utiliza para escalar solo las columnas xy y xyz, y el conjunto de datos resultante se alimenta a un estimador LinearRegression.

    Ten en cuenta que este enfoque asume que el conjunto de datos de entrada es un DataFrame de pandas. Si estás trabajando con un array numpy, debes modificar el transformador en consecuencia.

Comments are closed.