【问题标题】:How to transform categorical column using one hot encoder in sklearn如何使用 sklearn 中的一个热编码器转换分类列
【发布时间】:2020-06-02 16:54:07
【问题描述】:

我有一个带有分类列的数据框,我正在尝试使用sklearn 使用下面的代码段来one hot encode

oneEncoder= OneHotEncoder()
features['COL2'] = features['COL2'].apply(lambda col :  oneEncoder.fit_transform(col))

但它一直在扔 ValueError: Expected 2D array, got scalar array instead: array=1771. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

我也试过

oneEncoder= OneHotEncoder() #initializing an object of class LabelEncoder
oneEncoder.fit_transform( features['COL2'])

但它会抛出 ValueError: Expected 2D array, got 1D array instead:

【问题讨论】:

  • 你不能分配回Col2,因为OHE转换的结果是多维的。

标签: pandas scikit-learn one-hot-encoding


【解决方案1】:

你可以直接做

categories = pd.get_dummies(features['COL2'])

否则你可以传递一个二维数组

oneEncoder.fit_transform( features[['COL2']].values)

【讨论】:

  • 我遵循了第二种方法......但是当我打印列值时,它会打印分类值,而不是 OHE 表示
【解决方案2】:

试试:

oneEncoder.fit_transform(df[["Col2"]]).todense()

假设我们有:

features = pd.DataFrame({"Col2":["a","b","c"]})

然后:

oneEncoder= OneHotEncoder()
oneEncoder.fit_transform(features[["Col2"]]).todense()
matrix([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

如果您正在处理 Series 对象,您可能希望对其进行重塑:

oneEncoder.fit_transform(features.Col2.values.reshape(-1,1)).todense()
matrix([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

删除todense() 方法会将您的转换留在稀疏矩阵中。

最后,您可能总是通过以下方式解码矩阵的列的含义:

oneEncoder.categories_
[array(['a', 'b', 'c'], dtype=object)]

毫不奇怪,它们是按字母顺序排列的独特输入。

【讨论】:

  • 我选择使用oneEncoder.fit_transform(features.Col2.values.reshape(-1,1)).todense(),但是当我尝试打印值时,它会打印旧的分类值而不是 OHE
  • 您需要连接新值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2016-05-08
  • 2023-01-03
  • 2018-09-16
  • 2019-06-07
  • 2017-06-04
  • 2018-10-29
相关资源
最近更新 更多