每当我同时使用 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 个元组之前,上述方法不起作用。这是可以理解的。然而,这样做是试图对我的一些数字进行编码,并且我收到一条消息,告诉我它遇到了一些具有浮动的列。而且我的准确性严重下降。
首选做法是不在 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]])
对 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')
#基本变压器
“将 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()
encoded_data_df = pd.DataFrame(encoded_data_dense, columns=encoder.get_feature_names_out())