Код ML выдает ошибку значения при преобразовании данных

#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. Спасибо. Я попробую и свяжусь с вами.