使用 make_column_transformer 与 OnehotEncoder 和 StandaScaler + 直通

问题描述 投票:0回答:3

每当我同时使用 StandardScaler 和 OnehotEncoding 时,我都无法使用 remainder='passthrough'。不管我怎么说,我都有一个问题。它要么是参数之前的关键字,要么是 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')

上面的代码有效,我只是在使用 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 个元组之前,上述方法不起作用。这是可以理解的。然而,这样做是试图对我的一些数字进行编码,并且我收到一条消息,告诉我它遇到了一些具有浮动的列。而且我的准确性严重下降。

python machine-learning scikit-learn
3个回答
5
投票

首选做法是不在 one-hot 编码列上使用 StandardScaler。下面的第一个示例演示了 OHE 在分类变量上的应用和 StandardScaler 在数值列上的应用。第二个示例显示了 OHE 在选定列上的顺序应用以及 StandardScaler 在所有列上的顺序应用,但不建议这样做。

示例_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]])

2
投票

对 KRKirov 的答案进行一些补充,因为它也可能有用。

当您使用 make_column_transformer 时,它会按给定的顺序预处理您的特征。因此其余部分(处理过程中未触及的所有功能)应该出现在最后。

您的代码的问题在于您在中间传递了剩余参数,因此进程中剩余的所有功能都会到达那里。之后就无法进行处理了。因此,首先,先进行所有特殊处理,然后再使用余数参数对其他特征进行处理。

这里我用代码来解释一下。

(1)导入

import pandas as pd
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
onhe = OneHotEncoder()
scaler = StandardScaler()

(2)我将创建基本的DataFrame

df = pd.DataFrame({'sex':['m', 'f','f','m'],
                       'age':[45,25,10,31], 
                       'married':['y','y','n','y'],
                       'salary':[1000,300,370,500],
                       'child':[5, 1,0,3]})
print(df)

(3) 假设我们要对性别和已婚列进行编码,对年龄和工资列进行标准缩放,并保留子列不变。

transforming = make_column_transformer((onhe,['sex','married']),
 (scaler,['age', 'salary']),
    remainder = 'passthrough')
     
processed_df = transforming.fit_transform(df)
print(processed_df)

请注意,余数是在过程结束时分配的。 更重要的是,如果你想对所有剩余的特征('年龄','薪水','孩子')进行缩放,那么你可以使用:

transforming_1 = make_column_transformer((onhe, ['sex', 'married']), remainder = scaler)
processed_df_1 = transforming_1.fit_transform(df)
print(processed_df_1)

它将对两个给定列进行编码,然后对所有剩余列进行 StandardScaling。

当涉及到您的情况时,您的代码(从中您收到错误)应该如下所示:

trans_cols= make_column_transformer((OneHotEncoder(),['job', 'marital', 'education', 'default','housing','loan','contact','month','poutcome']),(StandardScaler(),['age', 'job', 'marital', 'education', 'default', 'balance','housing','loan', 'contact', 'month', 'duration','campaign', 'pdays', 'previous','poutcome']),remainder='passthrough')

0
投票

#基本变压器

“将 numpy 导入为 np 从 sklearn.preprocessing 导入 OneHotEncoder 从 sklearn.compose 导入 ColumnTransformer 编码器=ColumnTransformer(transformers=[('one_hot',OneHotEncoder(),['Name1','Char1'])],remainder='passthrough') 编码数据=编码器.fit_transform(others_data)”

“确保 OneHotEncoder 的输出符合预期。OneHotEncoder 默认情况下可能会生成稀疏矩阵,需要将其转换为密集格式才能在 DataFrame 中使用。”

“如果您的编码数据是稀疏矩阵格式,请在创建 DataFrame 时使用 .toarray() 方法将其转换为密集格式:”

将稀疏矩阵转换为稠密矩阵

encoded_data_dense = encoded_Data.toarray()

然后创建一个DataFrame

encoded_data_df = pd.DataFrame(encoded_data_dense, columns=encoder.get_feature_names_out())

© www.soinside.com 2019 - 2024. All rights reserved.