использование make_column_transformer с OnehotEncoder и StandaScaler + passthrough - PullRequest
0 голосов
/ 06 января 2020

Я не могу использовать remainder = 'passthrough' всякий раз, когда я использую StandardScaler и OnehotEncoding одновременно. Как бы то ни было, у меня есть проблема. это либо ключевое слово перед аргументом, проблема с fit_tranform ... вы называете это. Вот что я делаю:

trans_cols= make_column_transformer((OneHotEncoder(),['job', 'marital', 'education', 
 'default','housing','loan','contact','month','poutcome']),remainder='passthrough')

trans_cols.fit_transform(X)

here are my columns:
Index(['age', 'job', 'marital', 'education', 'default', 'balance', 'housing',
   'loan', 'contact', 'month', 'duration', 'campaign', 'pdays', 'previous',
   'poutcome', 'y'],
  dtype='object')

Приведенный выше код работает, я просто не могу объединить 2 оценки при использовании ключевого аргумента remainder . Вот почему я пытаюсь:

trans_cols= make_column_transformer((OneHotEncoder(),['job', 'marital', 'education', 'default','housing','loan',
                                                  'contact','month','poutcome']),remainder='passthrough',

(StandardScaler(),['age', 'job', 'marital', 'education', 'default', 'balance',
                  'housing','loan', 'contact', 'month', 'duration',
                  'campaign', 'pdays', 'previous','poutcome']))

Однако вышеприведенное не работает, пока я не удалю remainder и сохраню 2 кортежа. Что понятно. однако, делая это, он пытается закодировать некоторые из моих чисел c, и у меня появляется сообщение о том, что он столкнулся с некоторыми столбцами с плавающей точкой. Плюс моя точность сильно падает.

1 Ответ

0 голосов
/ 06 января 2020

Рекомендуется не использовать StandardScaler для столбцов с горячим кодированием. Первый пример, приведенный ниже, демонстрирует применение OHE к категориальным переменным и StandardScaler для числовых столбцов c. Во втором примере показано последовательное применение OHE для выбранных столбцов и StandardScaler для всех столбцов, но это не рекомендуется.

Example_1:

import numpy as np
import pandas as pd

from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.compose import make_column_transformer
from sklearn.pipeline import Pipeline

df = pd.DataFrame({'Cat_Var': np.random.choice(['a', 'b'], size=5),
                   'Num_Var': np.arange(5)})

cat_cols = ['Cat_Var']
num_cols = ['Num_Var']

col_transformer = make_column_transformer(
        (OneHotEncoder(), cat_cols),
        remainder=StandardScaler())

X = col_transformer.fit_transform(df)

Вывод:

df
Out[57]: 
  Cat_Var  Num_Var
0       b        0
1       a        1
2       b        2
3       a        3
4       a        4

X
Out[58]: 
array([[ 0.        ,  1.        , -1.41421356],
       [ 1.        ,  0.        , -0.70710678],
       [ 0.        ,  1.        ,  0.        ],
       [ 1.        ,  0.        ,  0.70710678],
       [ 1.        ,  0.        ,  1.41421356]])

Пример 2:

col_transformer_2 = ColumnTransformer(
        [('cat_transform', OneHotEncoder(), cat_cols)],
        remainder='passthrough'
        )

pipe = Pipeline(
        [
         ('col_tranform', col_transformer_2),
         ('standard_scaler', StandardScaler())
         ])

X_2 = pipe.fit_transform(df)

Вывод:

X_2
Out[62]: 
array([[-1.22474487,  1.22474487, -1.41421356],
       [ 0.81649658, -0.81649658, -0.70710678],
       [-1.22474487,  1.22474487,  0.        ],
       [ 0.81649658, -0.81649658,  0.70710678],
       [ 0.81649658, -0.81649658,  1.41421356]])
...