#python-3.x #scikit-learn #one-hot-encoding
Вопрос:
У меня есть модель, которая успешно работает.
Когда я попытался предсказать с его помощью, он потерпел неудачу из-за того, что после однократного кодирования в тестовом наборе было больше столбцов, чем в поезде.
После некоторого чтения я нашел, где мне нужно сначала объединить два df, один код, а затем разделить их.
- Добавлен столбец «temp» в набор данных поезда со значением «поезд».
- Добавлен столбец «temp» в набор тестовых данных со значением «тест».
- Это делается для того, чтобы я мог разделить df позже, используя логическое индексирование, подобное этому:
X = temp_df[temp_df['temp'] == 'train'] X2 = temp_df[temp_df['temp'] == 'test']
- Вертикально соедините два df.
- Проверьте форму нового комбинированного df.
- Измените все столбцы на тип «категория», кроме «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
- Теперь я просто пытаюсь закодировать OneHotEncode, как делал это раньше. Я выбираю только категориальные столбцы:
cat_ix = temp_df.select_dtypes(include=['category']).columns
- И я стараюсь обращаться с:
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"
.