Как обработать несколько категориальных столбцов в искусственной нейронной сети? - PullRequest
0 голосов
/ 23 июня 2018

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

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

Structure of the dataset

Category       |  Problem Category   | Affected devices      | Reason for creating    | Issue status | Priority | Security Engineer 

Cybersecurity     Penetration breach   Personal user devices   Hourly analysis          Transferred          3         K. Schulz
Cybersecurity     Lack of Cert         Company main devices    Hourly analysis          Closed               2         U. Frank
IoT               Malware installed    Personal user devices   Hourly analysis          Transferred          2         L. Tolso
....
....


# Matrix of features
X = dataset.iloc[:,:-1].values

# dependent variable: engineers
y = dataset.iloc[:,-1:].values

# Encode the categorical data to numerical data
# The priority column will not be encoded because it is already in numerical data, i.e., 0,1,2,3.

labelEncoder_X_category            = LabelEncoder()
labelEncoder_X_problem_category    = LabelEncoder()
labelEncoder_X_affected_devices    = LabelEncoder()
labelEncoder_X_reason_for_creating = LabelEncoder()
labelEncoder_X_issue_status        = LabelEncoder()

X[:, 0] = labelEncoder_X_category.fit_transform(X[:, 0])
X[:, 1] = labelEncoder_X_problem_category.fit_transform(X[:, 1])
X[:, 2] = labelEncoder_X_affected_devices.fit_transform(X[:, 2])
X[:, 3] = labelEncoder_X_reason_for_creating.fit_transform(X[:, 3])
X[:, 4] = labelEncoder_X_issue_status.fit_transform(X[:, 4])

# Create dummy variable
# Column zero (Category) will be used to split the encoded data of this column into multiple columns with many 0s and 1s
oneHotEncoder_category         = OneHotEncoder(categorical_features = [0])

# Once the column zero has been separated into columns of 0s and 1s, attach it to the current matrix of features
X  = oneHotEncoder_category.fit_transform(X).toarray()

print(X)

# Split the data into training and test set
# Not yet implemented because I want to solve my questions

# Feature scaling       
# Not yet implemented because I want to solve my questions

Вопросы

  1. Все столбцы были закодированы в числовые значения, за исключением столбца «Приоритет», и только нулевой столбец (категория) был разбит на несколько столбцов 0 и 1, но мне также нужно разделить другие столбцы на 0 и 1 или достаточно только одного столбца?

  2. Я обеспокоен тем, что мне нужно избегать проблемы отсутствия мультиколлинеарности, то есть я не могу включить все фиктивные переменные в мою модель, но как я могу применить этот же принцип, если кодирую остальные столбцы в 0 и 1с?

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

1 Ответ

0 голосов
/ 24 июня 2018

Существуют различные способы кодирования категориальных данных , но наиболее распространенным из них является однократное кодирование.В вашем случае:

  1. Да, вам придется в горячем виде кодировать все категориальные столбцы так, чтобы каждый столбец становился вектором [0,0,...,1,0,0,...].Теперь вы можете объединить все векторы столбцов в один большой в качестве входных данных для сети.На выходе будет классификация инженера.Возможно, вы также захотите установить приоритет горячего кодирования, поскольку, возможно, существуют конечные дискретные значения, которые можно рассматривать как категории.

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

Глядя на ваши данные, я бы подумал об использовании дерево решений .Конечные узлы были бы инженерами, и вы отличались от большинства отличительных особенностей.Преимущество в том, что вы можете точно знать, что он выучил, и визуализировать это.Более того, если есть небольшие изменения (новая категория, новый инженер и т. Д.), Вы можете изменять дерево вручную, пока у вас не появятся новые данные обучения.

...