python - 如何处理人工神经网络中的多个分类列?
问题描述
目前,我正在使用以下数据集,其中我有多个具有不同值的列,我想将每一行分类到正确的类别 - 在这种情况下,正确的工程师。
目标:根据类别、问题类别、受影响设备、创建原因、问题状态和优先级,确定工单属于哪个工程师。这是一个分类问题,我正在使用人工神经网络来解决这个问题。
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 和 1,我该如何应用同样的原则?
我试图尽可能详细地说明我在这个问题上的情况,我希望我没有让任何人感到困惑,但如果我这样做了,请随时纠正我或问我更多问题,我将非常乐意为你提供帮助。
解决方案
对分类数据进行编码有不同的方法,但最常见的一种是 one-hot 编码。在你的情况下:
是的,您必须对所有分类列进行一次热编码,以便每一列都成为一个向量
[0,0,...,1,0,0,...]
。现在您可以将所有列向量连接成一个大的向量作为网络的输入。输出将是工程师的分类。您可能还想对优先级进行一次热编码,因为可能存在有限的离散值,这些值可以被视为类别。我不确定您为什么担心多重共线性。如果你在做回归,这通常是一个问题,在你的分类情况下,神经网络基本上会选择状态组合(因为你每列都是一个热点)并学会忽略其他状态。对于任何学习算法都是如此,如果工程师 A 总是对某个类别做出响应,那么这足以对数据进行分类。
查看您的数据,我会考虑使用决策树。叶节点将是工程师,并且您从最显着的特征中分支出来。优点是您可以确切地知道它学到了什么并将其可视化。更好的是,如果有细微的变化(新类别、新工程师等),您可以手动修改树,直到获得新的训练数据。
推荐阅读
- javascript - 想在 react-markdown 文件中编写脚本,但所有字符都已转义
- javascript - 使用 net 包的 NodeJs 中的 SO_REUSEADDR
- c# - Windows.Forms.Timers 在 c# 中同时勾选和单击按钮
- php - timezone_name_from_abbr 在 php 中不起作用
- jquery - componentdidmount 内的 jquery 插件函数内的“this”关键字
- perl - 我需要根据 CCNA 编号从基因序列中提取基因长度(为给定查询提取值)
- python - 如何在 Django 虚拟环境中运行 Crontab?
- vuejs2 - 当我使用顺风和元素加载时,加载微调器不在屏幕中心,如何解决?
- c++ - 如何将主机和内核的数据定位在两个不同的位置
- gradle - Gradle 7.2 自定义插件:如何在应用(项目:项目)中使用版本目录?