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

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

У меня такой код:

X = pd.read_csv('Data2Cut.csv')

Y = X.select_dtypes(include=[object])

le = preprocessing.LabelEncoder()

Y_2 = Y.apply(le.fit_transform)


enc = preprocessing.OneHotEncoder()

enc.fit(Y_2)

onehotlabels = enc.transform(Y_2).toarray()
onehotlabels.shape

features = []
labels = []
mycsv = csv.reader(open('Data2Cut.csv'))
indexCount = 0
for row in mycsv:
  if indexCount < 8426:
    features.append([onehotlabels[indexCount], row[1], row[2], row[3], row[6], row[8], row[9], row[10], row[11]])
    labels.append(row[12])
    indexCount = indexCount + 1

training_data = np.array(features, dtype = 'float_')
training_labels = np.array(labels, dtype = 'float_')

log = linear_model.LogisticRegression()
log = log.fit(training_data, training_labels)
joblib.dump(log, "modelLogisticRegression.pkl")

Кажется, доходит до строки:

training_data = np.array(features, dtype = 'float_')

Перед тем, как он выйдет из строя, вы получите следующую ошибку:

ValueError: setting an array element with a sequence.

Я полагаю, что это результат того, что одни горячие закодированные значения являются массивами, а не плавающими. Как я могу изменить / настроить этот код, чтобы обрабатывать категориальные и числовые функции в качестве обучающих данных?

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

mobile, 1498885897, 17491407,   23911,  west coast, 2,  seagull, 18,    41.0666666667,  [0.325, 0.35],  [u'text', u'font', u'writing', u'line'],    102, 5  
#...

person sometimesiwritecode    schedule 07.07.2017    source источник
comment
попробовал это, но дал ту же ошибку   -  person sometimesiwritecode    schedule 07.07.2017
comment
Не могли бы вы предоставить немного своих данных? Было бы полезно отладить.   -  person cs95    schedule 07.07.2017
comment
добавил образец строки!   -  person sometimesiwritecode    schedule 07.07.2017
comment
Это из PostData2Cut или Data2Cut? Насколько последнее актуально? Вы тоже можете это опубликовать?   -  person cs95    schedule 07.07.2017
comment
Мое плохое - неправильное имя, которое я скопировал - оба - Data2Cut.csv - все та же ошибка.   -  person sometimesiwritecode    schedule 07.07.2017
comment
Фактически, onehotlabels[indexCount], row[9] и row[10] - все списки.   -  person cs95    schedule 07.07.2017
comment
Кроме того, row[10] содержит строки. Вы даже не можете преобразовать их в числа с плавающей запятой.   -  person cs95    schedule 07.07.2017
comment
да, я попробовал сплющить, и он дал ту же ошибку. Значит, я все неправильно подхожу к этому?   -  person sometimesiwritecode    schedule 07.07.2017
comment
Я пытаюсь понять, почему вы добавляете строки в свой список функций. Чего вы пытаетесь достичь?   -  person cs95    schedule 07.07.2017
comment
строки - это просто категории, если в этом есть смысл?   -  person sometimesiwritecode    schedule 07.07.2017


Ответы (2)


Вы, должно быть, уже нашли свой ответ, но я публикую свои выводы (я боролся с тем же самым) здесь для людей, у которых есть тот же вопрос. Способ добиться этого - вместо этого добавить столбцы результирующей закодированной разреженной матрицы в ваш обучающий фрейм данных. Например. (не обращайте внимания на ошибку в цене в первой строке):

Источник: https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f

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

person Ehsan Khaveh    schedule 12.08.2018

Какую версию sklearn вы используете?

Я вижу, что в sklearn версии 0.18.1 передача 1d-массивов в качестве данных устарела и выдает предупреждение, как показано ниже, и не дает желаемого результата.

DeprecationWarning: передача 1d-массивов в качестве данных устарела в версии 0.17 и вызовет ValueError в 0.19. Измените форму данных с помощью X.reshape (-1, 1), если ваши данные имеют одну функцию, или X.reshape (1, -1), если они содержат один образец. Предупреждение об устаревании)

Попробуйте заменить следующую строку кода

onehotlabels = enc.transform(Y_2).toarray()

к одному ниже

onehotlabels = enc.transform(Y_2.reshape((-1,1)).toarray()

или вы можете использовать pd.get_dummies, чтобы получить одну матрицу функций с горячим кодированием.

person Siva-Sg    schedule 09.07.2017