使用 OneHotEncoder 出现错误“预期的二维数组,而是得到一维数组”

Posted

技术标签:

【中文标题】使用 OneHotEncoder 出现错误“预期的二维数组,而是得到一维数组”【英文标题】:Error "Expected 2D array, got 1D array instead" Using OneHotEncoder 【发布时间】:2018-06-06 00:44:38 【问题描述】:

我是机器学习的新手,正在尝试解决我在使用 OneHotEncoder 类时遇到的错误。错误是:“预期的 2D 数组,得到 1D 数组”。因此,当我想到一维数组时,它类似于:[1,4,5,6],而二维数组将是 [[2,3], [3,4], [5,6]],但我仍然无法弄清楚为什么会失败。它在这条线上失败了:

X[:, 0] = onehotencoder1.fit_transform(X[:, 0]).toarray()

这是我的全部代码:

# Import Libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Import Dataset
dataset = pd.read_csv('Data2.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 5].values
df_X = pd.DataFrame(X)
df_y = pd.DataFrame(y)

# Replace Missing Values
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = 'NaN', strategy = 'mean', axis = 0)
imputer = imputer.fit(X[:, 3:5 ])
X[:, 3:5] = imputer.transform(X[:, 3:5])


# Encoding Categorical Data "Name"
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_x = LabelEncoder()
X[:, 0] = labelencoder_x.fit_transform(X[:, 0])

# Transform into a Matrix
onehotencoder1 = OneHotEncoder(categorical_features = [0])
X[:, 0] = onehotencoder1.fit_transform(X[:, 0]).toarray()

# Encoding Categorical Data "University"
from sklearn.preprocessing import LabelEncoder
labelencoder_x1 = LabelEncoder()
X[:, 1] = labelencoder_x1.fit_transform(X[:, 1])

我相信您可以通过这段代码看出我有 2 列是标签。我使用标签编码器将这些列转换为数字。我想使用 OneHotEncoder 更进一步,将它们变成一个矩阵,这样每一行都会有这样的东西:

0  1  0
1  0  1

我唯一想到的是我是如何对标签进行编码的。我一个一个地做,而不是一次做。不确定是不是这个问题。

我希望做这样的事情:

# Encoding Categorical Data "Name"
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_x = LabelEncoder()
X[:, 0] = labelencoder_x.fit_transform(X[:, 0])

# Transform into a Matrix
onehotencoder1 = OneHotEncoder(categorical_features = [0])
X[:, 0] = onehotencoder1.fit_transform(X[:, 0]).toarray()

# Encoding Categorical Data "University"
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_x1 = LabelEncoder()
X[:, 1] = labelencoder_x1.fit_transform(X[:, 1])

# Transform into a Matrix
onehotencoder2 = OneHotEncoder(categorical_features = [1])
X[:, 1] = onehotencoder1.fit_transform(X[:, 1]).toarray()

下面你会发现我的整个错误:

File "/Users/jim/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 441, in check_array
    "if it contains a single sample.".format(array))

ValueError: Expected 2D array, got 1D array instead:
array=[ 2.  1.  3.  2.  3.  5.  5.  0.  4.  0.].
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.

对正确方向的任何帮助都会很棒。

【问题讨论】:

使用X[:, 0] = onehotencoder1.fit_transform(X[:, 0].reshape(-1,1)).toarray() 【参考方案1】:

我遇到了同样的错误,在错误消息之后有如下建议:

"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."

因为我的数据是一个数组,所以我使用了X.values.reshape(-1,1),它可以工作。 (还有另一个建议是使用X.values.reshape 而不是X.reshape)。

【讨论】:

【参考方案2】:

这是 sklearn OneHotEncoder 中提出的问题 https://github.com/scikit-learn/scikit-learn/issues/3662。大多数 scikit learn 估计器需要 2D 数组而不是 1D 数组。

标准做法是包含一个多维数组。由于您已在 categorical_features = [0] 中指定了将哪一列视为 onehotencoding 的分类,因此您可以将下一行重写为以下内容以获取整个数据集或其中的一部分。它将只考虑第一列进行分类到虚拟转换,同时仍然有一个多维数组可供使用。

onehotencoder1 = OneHotEncoder(categorical_features = [0])
X = onehotencoder1.fit_transform(X).toarray()

(我希望您的数据集不再有分类值。我建议您先对所有内容进行标签编码,然后再进行 onehotencode。

【讨论】:

【参考方案3】:

我通过添加遇到了一个修复

X=X.reshape(-1,1)

错误现在似乎消失了,但不确定这是否是解决此问题的正确方法

【讨论】:

【参考方案4】:

在会改变分类特征的那一刻,您需要添加另一对括号:

X[:, 0] = pd.DataFrame(onehotencoder1.fit_transform(X[[:, 0]]).toarray())

【讨论】:

【参考方案5】:

您需要重塑数据,因为该方法需要一个多维数组,如前所述。 X = x.reshape(-1,1) 也为我工作。

【讨论】:

以上是关于使用 OneHotEncoder 出现错误“预期的二维数组,而是得到一维数组”的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 OneHotEncoder 然后使用 make_column_transformer 规范化值后出现 ValueError

labelencoder 和 OneHotEncoder 的值错误

特征处理1_StringIndexer与OneHotEncoder

如何在 pandas 系列列表中使用 OneHotEncoder?

尝试将 LabelEncoder 和 OneHotEncoder 用于具有多列的数据集

Scikit Learn OneHotEncoder 拟合和变换错误:ValueError:X 的形状与拟合期间不同