One Hot 编码单列

新手上路,请多包涵

我正在尝试在 Iris 数据集中的目标列(“物种”)上使用一个热编码器。

但我收到以下错误:

ValueError:预期的二维数组,得到的是一维数组:

如果您的数据具有单个特征,则使用 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 学习估计器需要一个二维数组而不是一维数组。

同时,我还发现我们可以尝试传递带有索引的数据框来对单列进行编码,但是没有用

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)

我正在尝试对单个分类列进行编码并拆分为多个列(编码通常的工作方式)

原文由 ARC 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 546
2 个回答

ValueError: Expected 2D array, got 1D array instead: Reshape your data either using array.reshape(-1, 1) if your data has a single feature or 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

希望有帮助!

原文由 Arkady. A 发布,翻译遵循 CC BY-SA 4.0 许可协议

我遇到过类似的情况,发现以下方法有效:

在 fit 或 fit_transform 命令中使用两个方括号作为列名

one_hot_enc = OneHotEncoder()

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

fit_transform 为您提供一个数组,您可以将其转换为 pandas 数据框。您可以将其附加到原始数据框或直接分配给现有列。

原文由 Abhijith 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进