#python #pandas #scikit-learn #transformation #numpy-ndarray
#python #pandas #scikit-learn #преобразование #numpy-ndarray
Вопрос:
Источник данных можно найти здесь .
Всем привет,
Я столкнулся с камнем преткновения в некотором коде, который я пишу, потому что метод fit_transform постоянно терпит неудачу. Он выдает эту ошибку:
Traceback (most recent call last):
File "/home/user/Datasets/CSVs/Working/Playstore/untitled0.py", line 18, in <module>
data = data[oh_cols].apply(oh.fit_transform)
File "/usr/lib/python3.8/site-packages/pandas/core/frame.py", line 7547, in apply
return op.get_result()
File "/usr/lib/python3.8/site-packages/pandas/core/apply.py", line 180, in get_result
return self.apply_standard()
File "/usr/lib/python3.8/site-packages/pandas/core/apply.py", line 255, in apply_standard
results, res_index = self.apply_series_generator()
File "/usr/lib/python3.8/site-packages/pandas/core/apply.py", line 284, in apply_series_generator
results[i] = self.f(v)
File "/usr/lib/python3.8/site-packages/sklearn/preprocessing/_encoders.py", line 410, in fit_transform
return super().fit_transform(X, y)
File "/usr/lib/python3.8/site-packages/sklearn/base.py", line 690, in fit_transform
return self.fit(X, **fit_params).transform(X)
File "/usr/lib/python3.8/site-packages/sklearn/preprocessing/_encoders.py", line 385, in fit
self._fit(X, handle_unknown=self.handle_unknown)
File "/usr/lib/python3.8/site-packages/sklearn/preprocessing/_encoders.py", line 74, in _fit
X_list, n_samples, n_features = self._check_X(X)
File "/usr/lib/python3.8/site-packages/sklearn/preprocessing/_encoders.py", line 43, in _check_X
X_temp = check_array(X, dtype=None)
File "/usr/lib/python3.8/site-packages/sklearn/utils/validation.py", line 73, in inner_f
return f(**kwargs)
File "/usr/lib/python3.8/site-packages/sklearn/utils/validation.py", line 620, in check_array
raise ValueError(
ValueError: Expected 2D array, got 1D array instead:
array=['Everyone' 'Everyone' 'Everyone' ... 'Everyone' 'Mature 17 ' 'Everyone'].
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.
Короче говоря:
ValueError: Expected 2D array, got 1D array instead:
Я провел некоторый поиск по этому вопросу в Интернете и нашел несколько потенциальных решений, но они, похоже, не сработали.
Вот мой код:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from category_encoders import CatBoostEncoder,CountEncoder,TargetEncoder
data = pd.read_csv("/home/user/Datasets/CSVs/Working/Playstore/data.csv")
oh = OneHotEncoder()
cb = CatBoostEncoder()
ce = CountEncoder()
te = TargetEncoder()
obj = [i for i in data if data[i].dtypes=="object"]
unique = dict(zip(list(obj),[len(data[i].unique()) for i in obj]))
oh_cols = [i for i in unique if unique[i] < 100]
te_cols = [i for i in unique if unique[i] > 100]
data = data[oh_cols].apply(oh.fit_transform)
Он выдает вышеупомянутую ошибку. Решение, которое я видел, посоветовало мне использовать .values
при преобразовании данных, и я попробовал следующее:
data = data[oh_cols].values.apply(oh.fit_transform)
data = data[oh_cols].apply(oh.fit_transform).values
encoding = np.array(data[oh_cols])
encoding.apply(oh.fit_transform)
Первая и третья выдали ту же ошибку, что и ниже,:
AttributeError: 'numpy.ndarray' object has no attribute 'apply'
В то время как второй вызвал первую ошибку, о которой я снова упомянул:
ValueError: Expected 2D array, got 1D array instead:
Я, честно говоря, в тупике, и я не уверен, куда идти дальше. Упражнение Kaggle, из которого я узнал об этом, прошло гладко, но по какой-то причине ничего не получается, когда я сам пробую свои силы.
Ответ №1:
Исправление
data_enc = oh.fit_transform(data[oh_cols])
В любом случае это намного лучше, чем apply
подход, потому что теперь в объекте oh
содержится много полезной информации, когда вы хотите проверить результаты, вы можете позже oh.transform
проверить свои тестовые данные и т. Д.
Объяснение ошибок
Ваши данные находятся в pandas
DataFrame
объекте. pandas
Функция apply
пытается применить oh.fit_transform
к каждому столбцу, но OneHotEncoder
ожидает ввода 2D.
Использование .values
или np.array()
преобразует ваш фрейм данных в массив numpy, но numpy
не имеет apply
метода.
Комментарии:
1. Спасибо. Я попробую и свяжусь с вами.