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))
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 claseStandardScaler
y solo aplique la operación de escalado en las columnas deseadas. Aquí tienes un ejemplo de implementación:Este transformador acepta una lista de nombres de columna (
columnas_a_escalar
) como entrada en su constructor. Durante el métodofit
, aplica el métodofit
del objetoStandardScaler
solo en las columnas seleccionadas. Durante el métodotransform
, aplica el métodotransform
del objetoStandardScaler
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:
En este ejemplo, el transformador
StandardScalerConCaracterísticasEspecíficas
se utiliza para escalar solo las columnasxy
yxyz
, y el conjunto de datos resultante se alimenta a un estimadorLinearRegression
.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.