使用 make_column_transformer 结合 OneHotEncoder 和 StandardScaler + passthrough

每当我同时使用 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]])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注