keras - Keras 多类分类(密集模型) - 混淆矩阵不正确
问题描述
我有一个标记的数据集。最后一列 (78) 包含 4 种攻击类型。以下代码混淆矩阵对于两种类型的攻击都是正确的。任何人都可以帮助修改 keras 多类攻击检测和纠正的代码以获得正确的混淆矩阵吗?以及正确的精度代码,FPR,多类的TPR。谢谢。
import pandas as pd
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
from keras.utils.np_utils import to_categorical
dataset_original = pd.read_csv('./XYZ.csv')
# Dron NaN value from Data Frame
dataset = dataset_original.dropna()
# data cleansing
X = dataset.iloc[:, 0:78]
print(X.info())
print(type(X))
y = dataset.iloc[:, 78] #78 is labeled column contains 4 anomaly type
print(y)
# encode the labels to 0, 1 respectively
print(y[100:110])
encoder = LabelEncoder()
y = encoder.fit_transform(y)
print([y[100:110]])
# Split the dataset now
XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.2, random_state=0)
# feature scaling
scalar = StandardScaler()
XTrain = scalar.fit_transform(XTrain)
XTest = scalar.transform(XTest)
# modeling
model = Sequential()
model.add(Dense(units=16, kernel_initializer='uniform', activation='relu', input_dim=78))
model.add(Dense(units=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(units=6, kernel_initializer='uniform', activation='relu'))
model.add(Dense(units=1, kernel_initializer='uniform', activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(XTrain, yTrain, batch_size=1000, epochs=10)
history = model.fit(XTrain, yTrain, batch_size=1000, epochs=10, verbose=1, validation_data=(XTest,
yTest))
yPred = model.predict(XTest)
yPred = [1 if y > 0.5 else 0 for y in yPred]
matrix = confusion_matrix(yTest, yPred)`enter code here`
print(matrix)
accuracy = (matrix[0][0] + matrix[1][1]) / (matrix[0][0] + matrix[0][1] + matrix[1][0] + matrix[1][1])
print("Accuracy: " + str(accuracy * 100) + "%")
解决方案
如果我理解正确,您正在尝试解决目标标签属于 4 种不同攻击的多类分类问题。因此,您应该使用具有 4 个单元而不是 1 个单元的输出密集层和“softmax”激活函数(而不是“sigmoid”激活)。此外,在编译模型时,您应该使用“categorical_crossentropy”损失代替“binary_crossentropy”。此外,使用此设置,将 argmax 应用于预测结果(每个测试样本有 4 个类别概率值),您将获得最终标签/类别。
[编辑]您的混淆矩阵和高精度表明您正在使用不平衡的数据集。可能有非常多的样本来自第 0 类,而很少有样本来自剩余的 3 类。要处理此问题,您可能需要应用加权样本或过采样/欠采样方法。
推荐阅读
- ejabberd - 是否可以使用 ejabberd REST API 更新房间标题(和其他选项)?
- python - 如何通过python将文件从Sharepoint复制到本地文件夹
- bash - 带有模式和引号字符的 bash 循环
- vba - VBA Excel 无法更改绘图标题的布局
- javascript - 选中时 React Set Class Active
- python - 为数据框创建日期列
- state - 分层状态机 (HSM) 当前状态
- google-calendar-api - Google Calendar API,缺少事件通知
- javascript - Threejs - 将相机旋转 90 度,而不是物体
- apache-spark - 如何将 spark 参数传递给 dataproc 工作流模板?