【问题标题】:Label Encoding on multiple columns with same transformation on train and test set在训练集和测试集上具有相同转换的多列标签编码
【发布时间】:2021-10-19 02:30:26
【问题描述】:

我有一个带有一些列的 pandas 数据框,其中 10 个是分类的,我想使用 LabelEncoder 对它们进行标记编码。但是,我想在训练和测试集上使用相同的转换。我正在这样做:

categorical_columns = train.columns[:10].tolist()       # List of categorical columns: [c0, c1, c2 ... c9]

le = LabelEncoder()
le.fit(categorical_columns)

train[categorical_columns] = le.transform(train[categorical_columns])
test[categorical_columns] = le.transform(test[categorical_columns])

但是这段代码给了我错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-42-a43d4dd9a428> in <module>
      4 le.fit(categorical_columns)
      5 
----> 6 train[categorical_columns] = le.transform(train[categorical_columns])
      7 test[categorical_columns] = le.transform(test[categorical_columns])

/opt/conda/lib/python3.7/site-packages/sklearn/preprocessing/_label.py in transform(self, y)
    270         """
    271         check_is_fitted(self)
--> 272         y = column_or_1d(y, warn=True)
    273         # transform of empty array is empty array
    274         if _num_samples(y) == 0:

/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py in inner_f(*args, **kwargs)
     70                           FutureWarning)
     71         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 72         return f(**kwargs)
     73     return inner_f
     74 

/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py in column_or_1d(y, warn)
    845     raise ValueError(
    846         "y should be a 1d array, "
--> 847         "got an array of shape {} instead.".format(shape))
    848 
    849 

ValueError: y should be a 1d array, got an array of shape (300000, 10) instead.

我应该如何正确地做?

【问题讨论】:

    标签: pandas machine-learning scikit-learn


    【解决方案1】:

    LabelEncoder 只能用于编码y 值。

    您应该使用sklearn.preprocessing.OrdinalEncoder 对分类X 特征执行此操作。

    如下:

    from sklearn.preprocessing import OrdinalEncoder
    
    X = [['Male', 'X'], ['Female', 'Y'], ['Female', 'Z']]
    OrdinalEncoder().fit_transform(X)
    

    哪个输出:

    array([[1., 0.],
           [0., 1.],
           [0., 2.]])
    

    【讨论】:

      【解决方案2】:

      你可以用OneHotEncoder代替LabelEncoder

      >>> df
            Sex Cabin Embarked
      0  female   C85        C
      1  female  C123        S
      2    male   E46        S
      3  female    G6        S
      4  female  C103        S
      5    male   D56        S
      6    male    A6        S
      
      from sklearn.preprocessing import OneHotEncoder
      
      arr = OneHotEncoder().fit_transform(df).toarray()
      
      >>> arr
      
      #       Sex   , Cabin                         , Embarked 
      array([[1., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0.],
             [1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1.],
             [0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 1.],
             [1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1.],
             [1., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1.],
             [0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 1.],
             [0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 1.]])
      

      要了解更多,请阅读this article(有点旧)

      【讨论】:

        猜你喜欢
        • 2019-05-13
        • 2021-05-20
        • 2018-10-23
        • 2020-11-21
        • 2020-04-30
        • 2020-11-21
        • 2020-05-28
        • 2013-03-04
        • 2017-11-01
        相关资源
        最近更新 更多