Ожидаемый 2D-массив, вместо него получен 1D-массив, изменение формы данных

Я действительно застрял в этой проблеме. Я пытаюсь использовать OneHotEncoder для кодирования моих данных в матрицу после использования LabelEncoder, но получаю эту ошибку: Ожидаемый массив 2D, вместо этого получен массив 1D.

В конце сообщения об ошибке (приведенного ниже) было сказано «Изменить форму моих данных», что, как я думал, я сделал, но оно все еще не работает. Если я понимаю Reshaping, это просто, когда вы хотите буквально изменить некоторые данные в другой размер матрицы? Например, если я хочу изменить матрицу 3 x 2 на 4 x 6?

Мой код не работает в этих двух строках:

X = X.reshape(-1, 1) # I added this after I saw the error
X[:, 0] = onehotencoder1.fit_transform(X[:, 0]).toarray()

Вот код, который у меня есть до сих пор:

# Data Preprocessing

# 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 = X.reshape(-1, 1)
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])

Вот полное сообщение об ошибке:

 File "/Users/jim/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 1809, in _transform_selected
    X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)

  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.00000000e+00   7.00000000e+00   3.20000000e+00   2.70000000e+01
   2.30000000e+03   1.00000000e+00   6.00000000e+00   3.90000000e+00
   2.80000000e+01   2.90000000e+03   3.00000000e+00   4.00000000e+00
   4.00000000e+00   3.00000000e+01   2.76700000e+03   2.00000000e+00
   8.00000000e+00   3.20000000e+00   2.70000000e+01   2.30000000e+03
   3.00000000e+00   0.00000000e+00   4.00000000e+00   3.00000000e+01
   2.48522222e+03   5.00000000e+00   9.00000000e+00   3.50000000e+00
   2.50000000e+01   2.50000000e+03   5.00000000e+00   1.00000000e+00
   3.50000000e+00   2.50000000e+01   2.50000000e+03   0.00000000e+00
   2.00000000e+00   3.00000000e+00   2.90000000e+01   2.40000000e+03
   4.00000000e+00   3.00000000e+00   3.70000000e+00   2.77777778e+01
   2.30000000e+03   0.00000000e+00   5.00000000e+00   3.00000000e+00
   2.90000000e+01   2.40000000e+03].
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.

Любая помощь будет здорово.


person wolfbagel    schedule 25.12.2017    source источник
comment
Ваш массив 1D, он должен быть 2D.... где бы вы ни получали ошибку, просто добавьте numpy.asmatrix(data), где данные - это данные, которые вы передаете... или вы можете изменить форму... Передача массива 1D устарела в последнее время версии sklearn   -  person Jai    schedule 25.12.2017
comment
Привет, @JayShah, я добавил в свой код: X = X.reshape(-1, 1). Это правильный способ изменить данные?   -  person wolfbagel    schedule 25.12.2017
comment
да X = X.reshape(-1, 1) это правильный способ изменить данные, но с ошибкой, но это будет работать, только если ваш X является массивом numpy, а не списком... Если это список, чем сделать список массивов из списка ... из сообщения об ошибке я ясно вижу, что array = [ ] является 1D, потому что у него есть одна открывающая и закрывающая скобки, и после изменения формы удалите X[:, 1] в преобразовании и просто поставьте X   -  person Jai    schedule 25.12.2017


Ответы (3)


попробуйте изменить код на этот

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])
res_0 = onehotencoder1.fit_transform(X[:, 0].reshape(-1, 1))  # <=== Change
X[:, 0] = res_0.ravel()

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

Если вы получаете ошибку в labelencoder_x1.fit_transform(X[:, 1]), сделайте ее labelencoder_x1.fit_transform(X[:, 1].reshape(-1, 1))

person Jai    schedule 25.12.2017
comment
Спасибо за решение! Я запускаю его построчно, но в этой строке происходит сбой: X[:, 0] = res_0.ravel(), говоря, что ravel не найден. - person wolfbagel; 25.12.2017
comment
попробуйте np.ravel(res_0) - person Jai; 25.12.2017

Хорошо, я наконец получил код для работы. См. решение ниже:

# Data Preprocessing

# 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])


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


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

# Transform University into a Matrix
onehotencoder2 = OneHotEncoder(categorical_features = [6])
X = onehotencoder2.fit_transform(X).toarray()
person wolfbagel    schedule 25.12.2017

Я получил ту же ошибку, когда пытался сделать то же самое. Я преобразовывал один столбец данных. Вот, как я преодолеваю эту проблему

encoding_X = OneHotEncoder(categories = [np.unique(X[:,0]).tolist()])
encoding_X.fit(np.unique(X[:,0]).reshape(-1,1).tolist())
encoding_X.transform(X[:,0].reshape(-1,1).tolist()).toarray()
person Syed Muhammad Asad    schedule 19.11.2019