如何处理人工神经网络中的多个分类列?

Posted

技术标签:

【中文标题】如何处理人工神经网络中的多个分类列?【英文标题】:How to process multiple categorical columns in an artificial neural network? 【发布时间】:2018-12-02 22:26:57 【问题描述】:

目前,我在以下dataset 工作,其中我有多个具有不同值的列,我想将每一行分类到正确的类别 - 在这种情况下,正确的工程师。

目标:根据类别、问题类别、受影响设备、创建原因、问题状态和优先级,确定工单属于哪个工程师。这是一个分类问题,我正在使用人工神经网络来解决这个问题。

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

问题

    除优先级列外,所有列都已编码为数值,只有第 0 列(类别)被拆分为几列 0 和 1,但我是否还需要将其他列拆分为 0 和 1还是只有 1 列就足够了?

    我担心我需要避免缺乏多重共线性问题,也就是说,我不能在我的模型中包含所有虚拟变量,但是如果我将其余列编码为 0,我该如何应用相同的原则和 1s?

我尝试尽可能详细地说明我遇到此问题的情况,希望没有让任何人感到困惑,但如果我这样做了,请随时纠正我或问我更多问题,我将非常乐意为您提供帮助.

【问题讨论】:

【参考方案1】:

encoding categorical data 有不同的方法,但最常见的一种是 one-hot 编码。在你的情况下:

    是的,您必须对所有分类列进行一次热编码,以便每一列都成为向量 [0,0,...,1,0,0,...]。现在您可以将所有列向量连接成一个大的向量作为网络的输入。输出将是工程师的分类。您可能还想对优先级进行一次热编码,因为可能存在可以被视为类别的有限离散值。

    我不确定您为什么担心多重共线性。如果你在做回归,这通常是一个问题,在你的分类情况下,神经网络基本上会选择状态组合(因为你每列都是一个热点)并学会忽略其他状态。对于任何学习算法都是如此,如果工程师 A 总是响应某个类别,那么这足以对数据进行分类。

查看您的数据,我会考虑使用decision tree。叶节点将是工程师,并且您从最显着的特征中分支出来。优点是您可以确切地知道它学到了什么并将其可视化。更好的是,如果有细微的变化(新类别、新工程师等),您可以手动修改树,直到获得新的训练数据。

【讨论】:

非常感谢您的回复,老实说,我很感谢您的建议,因为我错过了重要的关键事实,例如多重共线性不适用于这种情况,因为我的问题与分类而不是回归有关,而且,我认为优先级的数据不应该被编码,但我现在明白你的意思了。感谢您提供宝贵的反馈! :D

以上是关于如何处理人工神经网络中的多个分类列?的主要内容,如果未能解决你的问题,请参考以下文章

电子书人工神经网络理论及应用

卷积神经网络如何处理频道

人工智能如何处理自然语言

人工神经网络的分类 ann和bp是啥意思

[人工智能-深度学习-12]:神经网络基础 - 激活函数之SoftMax与多分类神经网络模型

我有一个分类项目,其中一些列/特征具有超过 90% 的空值。我该如何处理它们?