кодер выдает ошибку значения, когда я вызываю функцию на фрейме данных - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь один раз закодировать один столбец моего фрейма данных, а остальные столбцы закодированы. Я использую код как показано ниже:

def OneHotEncoder(repair,field):
    oe=preprocessing.OneHotEncoder()
    oe.fit(repair[field])
    np.save('/Users/sayontimondal/Desktop/SKlearn Model/Encoders/'+str(field)+'_enc_classes.npy', oe.classes_)
    repair[field] = repair[field].map(lambda s: 'Other' if s not in oe.classes_ else s)
    repair[field]=oe.transform(repair[field]) 
    return repair[field]

Но при вызове функции в моем фрейме данных: repair['SALES_ORG_ID']=OneHotEncoder(repair,'SALES_ORG_ID')

Я получаю сообщение об ошибке: не удалось преобразовать строку в число с плавающей запятой: Другое Я не понимаю, почему это происходит, поскольку это работает, когда я делаю то же самое с кодировщиками меток. Есть идеи, что я делаю не так?

Я просто хочу сохранить классы кодировщика, чтобы их можно было повторно использовать в моем наборе проверки, чтобы можно было использовать любой другой способ.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я присоединился к своему существующему фрейму данных «Другое», как это: Other = pd.DataFrame([['Other','Other','Other','Other','Other']], columns = ['CONFIG_CD','COMPONENT_CD_ISSUE_CD','SOLD_TO_SHIP_TO','SALES_ORG_ID','PART_NO']) repair = pd.concat([repair,Other]) После этого я делаю следующее для кодировщика этикеток, который отлично работает:

#label encoder def labelHotEncoder(repair,field): le = preprocessing.LabelEncoder() le.classes_= np.load('/Users/sayontimondal/Desktop/SKlearn Model/Encoders/'+str(field)+'_enc_classes.npy') #np.save('/Users/sayontimondal/Desktop/SKlearn Model/Encoders/'+str(field)+'_enc_classes.npy', le.classes_) repair[field] = repair[field].map(lambda s: 'Other' if s not in le.classes_ else s) repair[field]=le.transform(repair[field]) return repair[field] и затем вызывая функцию, как показано ниже:

repair['CONFIG_CD']=labelHotEncoder(repair,'CONFIG_CD') repair['COMPONENT_CD_ISSUE_CD']=labelHotEncoder(repair,'COMPONENT_CD_ISSUE_CD') repair['SOLD_TO_SHIP_TO']=labelHotEncoder(repair,'SOLD_TO_SHIP_TO') repair['PART_NO']=labelHotEncoder(repair,'PART_NO')

0 голосов
/ 31 августа 2018

Показать полную трассировку стека и некоторый воспроизводимый код и данные, чтобы мы могли проверить это. Это кажется легко решаемой проблемой и может быть сделано, если вы предоставите, как вы собираетесь ее решить.

Кроме этого, здесь есть несколько проблем:

1) OneHotEncoder нельзя использовать непосредственно для строк. Сначала вам нужно преобразовать строковые объекты в целые числа (возможно, используя LabelEncoder)

2) Однократное кодирование преобразует ваш единственный столбец в несколько столбцов (в зависимости от уникальных значений в них), поэтому вы не можете назначить его непосредственно одному столбцу вашего фрейма данных.

3) Если вы можете успешно преобразовать, используя OneHotEncoder, даже тогда возвращаемые данные являются разреженной матрицей, что опять-таки не подходит для фрейма данных pandas.

4) Вы назначаете одни и те же данные одному и тому же кадру данных дважды. Оказавшись внутри метода, вы делаете это:

repair[field]=oe.transform(repair[field]) 

И затем вы вызываете метод следующим образом:

repair['SALES_ORG_ID']=OneHotEncoder(repair,'SALES_ORG_ID')

Это не обязательно.

5) Сначала вы вводите (или пытаетесь вписать) все данные в field. Таким образом, oe.classes_ будет содержать все уникальные категории. Итак, после этого делаем

repair[field] = repair[field].map(lambda s: 'Other' if s not in oe.classes_ else s)

не имеет никакого смысла. Можете ли вы показать, как вы делаете это успешно для labelencoder, как вы сказали в вопросе? Теперь, даже если вы как-то успешно это сделаете, следующая строка:

repair[field]=oe.transform(repair[field]) 

выдаст ошибку, потому что «Other» - это строка, которую OneHotEncoder не обрабатывает. Вам нужно добавить дополнительную категорию ('Other' в этом случае, прежде чем подгонять данные.

6) Я бы посоветовал вам сохранить трансформаторы, используя Joblib или Pickle вместо Numpy.

Примечание : Как уже упоминалось в журнале изменений здесь , начиная со следующей версии (0.20.0), OneHotEncoder сможет обрабатывать строки в переданных данных:

Строка или панды. Категориальные столбцы теперь можно кодировать с помощью OneHotEncoder или OrdinalEncoder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...