将单列进行独热编码

4
我试图在鸢尾花数据集中对目标列(“Species”)使用独热编码器,但是出现了以下错误:
ValueError:期望2D数组,得到1D数组: 如果您的数据仅具有一个特征,请使用array.reshape(-1, 1)重新整形您的数据;如果它包含单个样本,请使用array.reshape(1,-1)。
Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm    Species
0   1   5.1 3.5 1.4         0.2     Iris-setosa
1   2   4.9 3.0 1.4         0.2     Iris-setosa
2   3   4.7 3.2 1.3         0.2     Iris-setosa
3   4   4.6 3.1 1.5         0.2     Iris-setosa
4   5   5.0 3.6 1.4         0.2     Iris-setosa

我在谷歌上搜索了这个问题,发现大多数scikit learn估计器需要一个二维数组而不是一维数组。

同时,我还发现我们可以尝试将带有索引的数据框传递给编码单列,但它没有起作用。

onehotencoder = OneHotEncoder(categorical_features=[df.columns.tolist().index('pattern_id')
X = dataset.iloc[:,1:5].values
y = dataset.iloc[:, 5].values

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

labelencoder= LabelEncoder()
y = labelencoder.fit_transform(y)


onehotencoder = OneHotEncoder(categorical_features=[0])
y = onehotencoder.fit_transform(y)

我试图对单个分类列进行编码并拆分成多个列(通常的编码方式)

1
pandas的get_dummies对此非常有用。 - Rorschach
1
可能是如何在Python中进行One-Hot编码?的重复问题。 - skillsmuggler
3个回答

9

错误提示:期望是一个二维数组,但提供了一个一维数组。如果您的数据只有一个特征,请使用array.reshape(-1, 1)重新整理数据;如果您的数据只包含一个样例,请使用array.reshape(1, -1)。

这个错误提示表明您需要将数组转换为向量。您可以通过以下方式实现:

from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import pandas as pd
import numpy as np

# load iris dataset 
>>> iris = datasets.load_iris()
>>> iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
>>> y = iris.target.values
>>> onehotencoder = OneHotEncoder(categories='auto')
>>> y = onehotencoder.fit_transform(y.reshape(-1,1))
# y - will be sparse matrix of type '<class 'numpy.float64'>
# if you want it to be a array you need to 
>>> print(y.toarray())
[[1. 0. 0.]
 [1. 0. 0.]
    . . . . 
 [0. 0. 1.]
 [0. 0. 1.]]

您还可以使用 get_dummies 函数 (文档)

>>> pd.get_dummies(iris.target).head()
   0.0  1.0  2.0
0    1    0    0
1    1    0    0
2    1    0    0
3    1    0    0
4    1    0    0

希望这能有所帮助!

5
我曾遇到类似的情况,发现以下方法可行:
在fit或fit_transform命令中使用两个方括号表示列名。
one_hot_enc = OneHotEncoder()

arr =  one_hot_enc.fit_transform(data[['column']])
df = pd.DataFrame(arr)

fit_transform方法会给你返回一个数组,你可以将其转换为Pandas数据框。你可以将其附加到原始数据框中或直接分配给现有的列。


5

对于您的情况,由于您似乎在使用kaggle数据集,我建议只需使用

import pandas as pd
pd.get_dummies(df.Species).head()

Out[158]: 
   Iris-setosa  Iris-versicolor  Iris-virginica
0            1                0               0
1            1                0               0
2            1                0               0
3            1                0               0
4            1                0               0

请注意,这里的默认设置编码了所有类别(3种物种),通常只使用两种并将平均差异与基线组进行比较(例如在R中的默认设置或通常在执行回归/ANOVA时,可以使用“drop_first”参数实现)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接