Использование Scikit-Learn OneHotEncoder с Pandas DataFrame - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь заменить столбец внутри Pandas DataFrame, содержащий строки, в эквивалентный код в горячем эквиваленте, используя OneHotEncoder Scikit-Learn.Мой код ниже не работает:

from sklearn.preprocessing import OneHotEncoder
# data is a Pandas DataFrame

jobs_encoder = OneHotEncoder()
jobs_encoder.fit(data['Profession'].unique().reshape(1, -1))
data['Profession'] = jobs_encoder.transform(data['Profession'].to_numpy().reshape(-1, 1))

Он выдает следующую ошибку (строки в списке опущены):

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-91-3a1f568322f5> in <module>()
      3 jobs_encoder = OneHotEncoder()
      4 jobs_encoder.fit(data['Profession'].unique().reshape(1, -1))
----> 5 data['Profession'] = jobs_encoder.transform(data['Profession'].to_numpy().reshape(-1, 1))

/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py in transform(self, X)
    730                                        copy=True)
    731         else:
--> 732             return self._transform_new(X)
    733 
    734     def inverse_transform(self, X):

/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py in _transform_new(self, X)
    678         """New implementation assuming categorical input"""
    679         # validation of X happens in _check_X called by _transform
--> 680         X_int, X_mask = self._transform(X, handle_unknown=self.handle_unknown)
    681 
    682         n_samples, n_features = X_int.shape

/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py in _transform(self, X, handle_unknown)
    120                     msg = ("Found unknown categories {0} in column {1}"
    121                            " during transform".format(diff, i))
--> 122                     raise ValueError(msg)
    123                 else:
    124                     # Set the problematic rows to an acceptable value and

ValueError: Found unknown categories ['...', ..., '...'] in column 0 during transform

Вот некоторые примеры данных:

data['Profession'] =

0         unkn
1         safe
2         rece
3         unkn
4         lead
          ... 
111988    indu
111989    seni
111990    mess
111991    seni
111992    proj
Name: Profession, Length: 111993, dtype: object

Что именно я делаю не так?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

OneHotEncoder Кодирует целочисленные категорические объекты в виде числового массива в одно касание.Это Transform метод возвращает разреженную матрицу, если sparse = True или 2-й массив.Вы не можете преобразовать 2-й массив (или разреженную матрицу) в Pandas Series .Вы должны создать Pandas Serie (столбец в кадре данных Pandas) для каждой категории .

. Я бы рекомендовал использовать pandas.get_dummies insted:

data = pd.get_dummies(data,prefix=['Profession'], columns = ['Profession'], drop_first=True)

РЕДАКТИРОВАТЬ:

Использование Sklearn OneHotEncoder:

transformed = jobs_encoder.transform(data['Profession'].to_numpy().reshape(-1, 1))
#Create a Pandas DataFrame of the hot encoded column
ohe_df = pd.DataFrame(transformed, columns=jobs_encoder.get_feature_names())
#concat with original data
data = pd.concat([data, ohe_df], axis=1).drop(['Profession'], axis=1)

Другие параметры: Если вы выполняете настройку гиперпараметра с GridSearch рекомендуется использовать ColumnTransformer и FeatureUnion с Pipeline или напрямую make_column_transformer

0 голосов
/ 26 сентября 2019

Так получилось, что Scikit-Learns LabelBinarizer дал мне больше удачи в преобразовании данных в формат с горячим кодированием, с помощью решения Амни , мой окончательный код выглядит следующим образом

import pandas as pd
from sklearn.preprocessing import LabelBinarizer

jobs_encoder = LabelBinarizer()
jobs_encoder.fit(data['Profession'])
transformed = jobs_encoder.transform(data['Profession'])
ohe_df = pd.DataFrame(transformed)
data = pd.concat([data, ohe_df], axis=1).drop(['Profession'], axis=1)
...