Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

780
Visualizações
¿Cómo puedo estandarizar solo variables numéricas en una canalización de sklearn?

Estoy tratando de crear una canalización de sklearn con 2 pasos:

  1. Estandarizar los datos
  2. Ajuste los datos usando KNN

Sin embargo, mis datos tienen variables numéricas y categóricas, que he convertido en dummies usando pd.get_dummies . Quiero estandarizar las variables numéricas pero dejar los maniquíes como están. He estado haciendo esto así:

 X = dataframe containing both numeric and categorical columns numeric = [list of numeric column names] categorical = [list of categorical column names] scaler = StandardScaler() X_numeric_std = pd.DataFrame(data=scaler.fit_transform(X[numeric]), columns=numeric) X_std = pd.merge(X_numeric_std, X[categorical], left_index=True, right_index=True)

Sin embargo, si tuviera que crear una canalización como:

 pipe = sklearn.pipeline.make_pipeline(StandardScaler(), KNeighborsClassifier())

Estandarizaría todas las columnas en mi DataFrame. ¿Hay alguna manera de hacer esto estandarizando solo las columnas numéricas?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

UPD: 2021-05-10

Para sklearn >= 0.20 podemos usar sklearn.compose.ColumnTransformer

Aquí hay un pequeño ejemplo :

importaciones y carga de datos

 # Author: Pedro Morales <part.morales@gmail.com> # # License: BSD 3 clause import numpy as np from sklearn.compose import ColumnTransformer from sklearn.datasets import fetch_openml from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split, GridSearchCV np.random.seed(0) # Load data from https://www.openml.org/d/40945 X, y = fetch_openml("titanic", version=1, as_frame=True, return_X_y=True)

Preprocesamiento de datos con reconocimiento de canalización mediante ColumnTransformer :

 numeric_features = ['age', 'fare'] numeric_transformer = Pipeline(steps=[ ('imputer', SimpleImputer(strategy='median')), ('scaler', StandardScaler())]) categorical_features = ['embarked', 'sex', 'pclass'] categorical_transformer = OneHotEncoder(handle_unknown='ignore') preprocessor = ColumnTransformer( transformers=[ ('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features)])

clasificación

 # Append classifier to preprocessing pipeline. # Now we have a full prediction pipeline. clf = Pipeline(steps=[('preprocessor', preprocessor), ('classifier', LogisticRegression())]) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) clf.fit(X_train, y_train) print("model score: %.3f" % clf.score(X_test, y_test))

Respuesta VIEJA:

Suponiendo que tiene el siguiente DF:

 In [163]: df Out[163]: abcd 0 aaa 1.01 xxx 111 1 bbb 2.02 yyy 222 2 ccc 3.03 zzz 333 In [164]: df.dtypes Out[164]: a object b float64 c object d int64 dtype: object

Puedes encontrar todas las columnas numéricas:

 In [165]: num_cols = df.columns[df.dtypes.apply(lambda c: np.issubdtype(c, np.number))] In [166]: num_cols Out[166]: Index(['b', 'd'], dtype='object') In [167]: df[num_cols] Out[167]: bd 0 1.01 111 1 2.02 222 2 3.03 333

y aplique StandardScaler solo a esas columnas numéricas:

 In [168]: scaler = StandardScaler() In [169]: df[num_cols] = scaler.fit_transform(df[num_cols]) In [170]: df Out[170]: abcd 0 aaa -1.224745 xxx -1.224745 1 bbb 0.000000 yyy 0.000000 2 ccc 1.224745 zzz 1.224745

ahora puede "codificar en caliente" columnas categóricas (no numéricas)...

over 4 years ago · Santiago Trujillo Relatório

0

Yo usaría FeatureUnion . Luego, generalmente hago algo así, suponiendo que codifique de forma ficticia sus variables categóricas también dentro de la canalización en lugar de antes con Pandas:

 from sklearn.pipeline import Pipeline, FeatureUnion, make_pipeline from sklearn.preprocessing import OneHotEncoder from sklearn.base import BaseEstimator, TransformerMixin from sklearn.neighbors import KNeighborsClassifier class Columns(BaseEstimator, TransformerMixin): def __init__(self, names=None): self.names = names def fit(self, X, y=None, **fit_params): return self def transform(self, X): return X[self.names] numeric = [list of numeric column names] categorical = [list of categorical column names] pipe = Pipeline([ ("features", FeatureUnion([ ('numeric', make_pipeline(Columns(names=numeric),StandardScaler())), ('categorical', make_pipeline(Columns(names=categorical),OneHotEncoder(sparse=False))) ])), ('model', KNeighborsClassifier()) ])

También puede consultar Sklearn Pandas , que también es interesante.

over 4 years ago · Santiago Trujillo Relatório

0

Dado que ha convertido sus funciones categóricas en ficticios mediante pd.get_dummies , no necesita utilizar OneHotEncoder . Como resultado, su tubería debe ser:

 from sklearn.preprocessing import StandardScaler,FunctionTransformer from sklearn.pipeline import Pipeline,FeatureUnion knn=KNeighborsClassifier() pipeline=Pipeline(steps= [ ('feature_processing', FeatureUnion(transformer_list = [ ('categorical', FunctionTransformer(lambda data: data[:, cat_indices])), #numeric ('numeric', Pipeline(steps = [ ('select', FunctionTransformer(lambda data: data[:, num_indices])), ('scale', StandardScaler()) ])) ])), ('clf', knn) ] )
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda