Сбой OneHotEncoder после объединения кадров данных

#python-3.x #scikit-learn #one-hot-encoding

Вопрос:

У меня есть модель, которая успешно работает.

Когда я попытался предсказать с его помощью, он потерпел неудачу из-за того, что после однократного кодирования в тестовом наборе было больше столбцов, чем в поезде.

После некоторого чтения я нашел, где мне нужно сначала объединить два df, один код, а затем разделить их.

  1. Добавлен столбец «temp» в набор данных поезда со значением «поезд».
  2. Добавлен столбец «temp» в набор тестовых данных со значением «тест».
  3. Это делается для того, чтобы я мог разделить df позже, используя логическое индексирование, подобное этому:
 X = temp_df[temp_df['temp'] == 'train'] X2 = temp_df[temp_df['temp'] == 'test']  
  1. Вертикально соедините два df.
  2. Проверьте форму нового комбинированного df.
  3. Измените все столбцы на тип «категория», кроме «temp», который является объектом:
 basin category region category lga category extraction_type_class category management category quality_group category quantity category source category waterpoint_type category cluster category temp object  
  1. Теперь я просто пытаюсь закодировать OneHotEncode, как делал это раньше. Я выбираю только категориальные столбцы:
 cat_ix = temp_df.select_dtypes(include=['category']).columns  
  1. И я стараюсь обращаться с:
 ct = ColumnTransformer([('o', OneHotEncoder(), cat_ix)], remainder='passthrough') temp_df = ct.fit_transform(temp_df)  

Сбой в строке temp_df = ct.fit_transform(temp_df).

Эти идентичные шаги отлично сработали до того, как я добавил столбец temp и объединил два df.

Точная ошибка:

 Traceback (most recent call last):  File "C:UsersMarkAppDataLocalProgramsPythonPython38libsite-packagessklearncompose_column_transformer.py", line 778, in _hstack  converted_Xs = [  File "C:UsersMarkAppDataLocalProgramsPythonPython38libsite-packagessklearncompose_column_transformer.py", line 779, in lt;listcompgt;  check_array(X, accept_sparse=True, force_all_finite=False)  File "C:UsersMarkAppDataLocalProgramsPythonPython38libsite-packagessklearnutilsvalidation.py", line 738, in check_array  array = np.asarray(array, order=order, dtype=dtype)  File "C:UsersMarkAppDataLocalProgramsPythonPython38libsite-packagespandascoregeneric.py", line 1993, in __array__  return np.asarray(self._values, dtype=dtype) ValueError: could not convert string to float: 'train'  The above exception was the direct cause of the following exception:  Traceback (most recent call last):  File "C:UsersMarkAppDataLocalProgramsPythonPython38libsite-packagessklearncompose_column_transformer.py", line 783, in _hstack  raise ValueError( ValueError: For a sparse output, all columns should be a numeric or convertible to a numeric.  

Почему он жалуется на «поезд»? Это находится в столбце «temp», который исключается.

Ответ №1:

Обратите внимание , что обратная связь не ссылается OneHotEncoder , это все ColumnTransformer . Вы пытаетесь пройти через temp столбец, который привязывается к разреженной матрице с одним горячим кодом в методе _hstack , и второе сообщение об ошибке является более актуальным. Он не может сложить массив строкового типа в числовой разреженный массив (что приводит к первому сообщению об ошибке).

Если разреженная матрица не слишком велика, вы можете просто заставить ее быть плотной, используя sparse_threshold=0 в ColumnTransformer или sparse=False в OneHotEncoder . Если он слишком велик для памяти (или вы предпочитаете разреженные матрицы), вы можете использовать индикатор 0/1 для разделения поезда/теста вместо строк "train", "test" .