每当我同时使用 StandardScaler 和 OneHotEncoding 时,我就无法使用 remainder=’passthrough’。无论我如何尝试,都会遇到问题,不是关键字在参数之前,就是 fit_transform 出现问题,等等。以下是我正在做的:
trans_cols= make_column_transformer((OneHotEncoder(),['job', 'marital', 'education', 'default','housing','loan','contact','month','poutcome']),remainder='passthrough')trans_cols.fit_transform(X)这里是我的列: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
并保留两个元组,否则上述代码无法工作。这可以理解。然而,这样做会尝试对我的某些数字进行编码,并且我收到了一条消息说它遇到了一些浮点类型的列。此外,我的准确率严重下降。
回答:
推荐的做法是不对经过独热编码的列使用 StandardScaler。下面的第一个示例展示了对分类变量应用 OHE 和对数值列应用 StandardScaler 的方法。第二个示例展示了对选定列顺序应用 OHE 和对所有列应用 StandardScaler 的方法,但这不被推荐。
示例1:
import numpy as npimport pandas as pdfrom sklearn.preprocessing import OneHotEncoderfrom sklearn.preprocessing import StandardScalerfrom sklearn.compose import ColumnTransformerfrom sklearn.compose import make_column_transformerfrom sklearn.pipeline import Pipelinedf = 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)
输出:
dfOut[57]: Cat_Var Num_Var0 b 01 a 12 b 23 a 34 a 4XOut[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_2Out[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]])