【问题标题】:Feature preprocessing of both continuous and categorical variables (of integer type) with scikit-learn使用 scikit-learn 对连续变量和分类变量(整数类型)进行特征预处理
【发布时间】:2017-09-19 04:06:35
【问题描述】:

主要目标如下:

  1. StandardScaler 应用于连续变量

  2. LabelEncoderOnehotEncoder 应用于分类变量

连续变量需要缩放,但同时,几个分类变量也是整数类型。应用StandardScaler 会导致不良影响。

另一方面,StandardScaler 会缩放基于整数的分类变量,这也不是我们想要的。

由于连续变量和分类变量混合在一个 Pandas DataFrame 中,解决此类问题的推荐工作流程是什么?

说明我观点的最佳示例是Kaggle Bike Sharing Demand 数据集,其中seasonweather 是整数分类变量

【问题讨论】:

  • StandardScalar 按列工作,我认为它不会对单热编码变量做任何事情。您是否尝试过为单个 Dataframe 执行上述操作?您是否发现了您似乎遇到问题的行为?
  • 单热编码变量与整数类型的变量相同。如果您将它们连接在一起,您为什么期望它们以不同的方式做事?如果它们的行为方式相同,那么如果有一个变量不是分类变量而是数值变量,并且其值为 1 或 0,然后在其上使用缩放器,您认为会发生什么?
  • 我试过了,显然它确实缩放了所有东西,不管他们假设什么值。您能否在该 Bike 数据集上申请 StandardScaler().fit_transform(df) 并告诉我其他情况?
  • 哦,对不起,我对 MinMaxScaler 和 StandardScaler 感到困惑。 MinMaxScaler 不会改变 1、0,但 StandardScaler 会(零均值和单位方差)。再次抱歉。
  • 你可以以scikit-learn.org/stable/auto_examples/…为例来联合不同的特征。

标签: python pandas machine-learning scikit-learn categorical-data


【解决方案1】:

检查 scikit-learn 中的 ColumnTransformer

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler,LabelBinarizer

numeric_columns=list(X.select_dtypes('float64').columns)
categorical_columns=list(X.select_dtypes('int64').columns)

pipeline=ColumnTransformer([
    ('num',StandardScaler(),numeric_columns),
    ('cat',LabelBinarizer(),categorical_columns),
])

new_X=pipeline.fit_transform(X)

【讨论】:

    【解决方案2】:

    查看sklearn_pandas.DataFrameMapper 元转换器。将其用作管道中执行按列数据工程操作的第一步:

    mapper = DataFrameMapper(
      [(continuous_col, StandardScaler()) for continuous_col in continuous_cols] +
      [(categorical_col, LabelBinarizer()) for categorical_col in categorical_cols]
    )
    pipeline = Pipeline(
      [("mapper", mapper),
      ("estimator", estimator)]
    )
    pipeline.fit_transform(df, df["y"])
    

    另外,您应该使用sklearn.preprocessing.LabelBinarizer 而不是[LabelEncoder(), OneHotEncoder()] 的列表。

    【讨论】:

    • sklearn_pandas.DataFrameMapper 很棒,绝对值得一试。谢谢你让我知道。但是根据文档,LabelBinarizer 应该用于您有一个具有多个值的目标变量的情况,而不是多个变量,每个变量都有一组不同的值,对吧?不知道能不能理解。
    • LabelBinarizer 是编码字符串列的正确选择 - 它首先将字符串转换为整数,然后将这些整数二值化为位向量。它一口气完成。无需在两个转换器步骤之间划分这个“工作流程”(即LabelEncoder 加上OneHotEncoder)。只需使用真实数据尝试一下,您就会爱上它。
    • 这里的“估算器”到底是什么意思?
    • @tbone 在 Scikit-Learn 管道的上下文中,管道的最后一步又名“final_estimator”是某种模型——回归器或分类器
    猜你喜欢
    • 2021-08-30
    • 2014-02-17
    • 2021-03-26
    • 2019-06-05
    • 2015-01-12
    • 2016-12-04
    • 2015-04-08
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多