我是机器学习的新手,并试图解决我正在使用OneHotEncoder类的错误。错误是:“预期的2D数组,而不是1D数组”。因此,当我想到1D数组时,它就像:[1,4,5,6]
和2D数组将是[[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列是标签。我使用Label Encoder将这些列转换为数字。我想使用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.
任何正确方向的帮助都会很棒。
答案 0 :(得分:2)
这是sklearn OneHotEncoder中出现的一个问题 https://github.com/scikit-learn/scikit-learn/issues/3662。大多数scikit学习估计器需要2D阵列而不是一维阵列。
标准做法是包含一个多维数组。由于您已在categorical_features = [0]
中指定了哪一列被视为分类,因此您可以将下一行重写为以下内容以获取整个数据集或其中的一部分。它只会考虑分类到虚拟转换的第一列,同时仍然可以使用多维数组。
onehotencoder1 = OneHotEncoder(categorical_features = [0])
X = onehotencoder1.fit_transform(X).toarray()
(我希望你的数据集没有更多的分类值。我建议你首先对所有内容进行labelencode,然后是onehotencode。
答案 1 :(得分: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 :(得分:0)
我通过添加
来解决问题X = X.reshape(-1,1)
错误现在似乎消失了,但不确定这是否是解决此问题的正确方法
答案 3 :(得分:0)
您需要重塑数据的形状,因为该方法需要一个如上所述的多维数组。 X = x.reshape(-1,1)也为我工作。
答案 4 :(得分:0)
此刻将更改分类功能,您需要添加另一对方括号:
X[:, 0] = pd.DataFrame(onehotencoder1.fit_transform(X[[:, 0]]).toarray())