首页 > 解决方案 > 如何处理人工神经网络中的多个分类列?

问题描述

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

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

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 列(类别)被拆分为几列 0 和 1,但我是否还需要将其他列拆分为 0 和 1,或者是否足够只有1列?

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

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

标签: pythonmachine-learningneural-networkkerasclassification

解决方案


对分类数据进行编码有不同的方法,但最常见的一种是 one-hot 编码。在你的情况下:

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

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

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


推荐阅读