Правильное использование One Hot Encoding, получено непредвиденное значение ошибки - PullRequest
0 голосов
/ 18 марта 2020

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

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Churn_Modelling.csv')
X = dataset.iloc[:, 3:13].values
y = dataset.iloc[:, 13].values

# Encoding categorical data
from sklearn.preprocessing import OneHotEncoder

onehotencoder = OneHotEncoder(categories =X[:,1].reshape(-1,1))

Если все хорошо, я смогу закодировать данные с помощью

X = onehotencoder.fit_transform(X).toarray()

(верно?), Но возникает эта специфическая ошибка:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Есть ли что-нибудь, кроме c Я не поступаю правильно? Я проверил документацию https://scikit-learn.org/0.20/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn .preprocessing.OneHotEncoder , но это не помогло мне ...

Есть что-то элементарное, что я делаю неправильно? Мне также очень любопытно, почему эта ошибка появляется, я посмотрел ее, но я не понимаю, что она делает в этом контексте. Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.

ЧТОБЫ ПРОЯВИТЬ НАБОР ДАННЫХ: у меня есть десять столбцов, в которых я хочу только горячо кодировать категориальные значения для стран (есть три: Франция, Германия и Испания), где остальные столбцы содержат числовые значения.

Одна вещь, которая меня интересует, заключается в том, следует ли для категорий аргументов передавать весь столбец, который нужно кодировать, или если просто дается массив с различными значениями? Так что вместо

onehotencoder = OneHotEncoder(categories =X[:,1].reshape(-1,1))

Нужно ли делать что-то вроде

onehotencoder = OneHotEncoder(categories = np.array(['France','Germany','Spain']).reshape(-1,1))

?

Последнее редактирование: я просто пытаюсь найти «быстрый» способ горячего кодирования указать столбец c во всем наборе данных.

Мне известно, что я всегда мог бы извлечь столбец, который хочу горячим кодированием, запустить простой код для этого столбца и затем вставить его обратно в кадр данных, Я просто надеялся, что смогу найти какой-нибудь код, который можно было бы применить в самых разных ситуациях с минимальным редактированием.

Редактировать: добавить экран печати набора данных: Пример набора данных

1 Ответ

0 голосов
/ 20 марта 2020

У вас проблема здесь: когда вы делаете:

X = dataset.iloc[:, 3:13].values

, вы получаете массив numpy без имен столбцов.

Вы делаете:

onehotencoder = OneHotEncoder(categories =X[:,1].reshape(-1,1))

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

categories=np.unique(X[:,1]).reshape(-1,1)
onehotencoder = OneHotEncoder(categories=categories, handle_unknown='ignore')

Я также добавил аргумент handle_unknown, на случай, если в вашей матрице могут быть значения, которых нет в categories.

Начните с этого.

...