Keras多类分类(密集模型)-混淆矩阵不正确

Keras多类分类(密集模型)-混淆矩阵不正确,keras,neural-network,deep-learning,multiclass-classification,Keras,Neural Network,Deep Learning,Multiclass Classification,我有一个带标签的数据集。最后一列(78)包含4种攻击类型。以下代码混淆矩阵适用于两种类型的攻击。任何人都可以帮助修改keras多类攻击检测和纠正代码,以获得正确的混淆矩阵吗?对于精度的正确代码,FPR、TPR用于多类。谢谢 import pandas as pd from sklearn.preprocessing import LabelEncoder, StandardScaler from sklearn.model_selection import train_test_split fr

我有一个带标签的数据集。最后一列(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个单元的输出密集层,而不是具有“softmax”激活功能(而不是“sigmoid”激活)的1个单元。此外,在编译模型时,应使用“分类交叉熵”损失代替“二进制交叉熵”。 此外,使用此设置,在预测结果上应用argmax(每个测试样本有4个类别概率值),您将获得最终标签/类别


[编辑]
您的混淆矩阵和高精度表明您正在处理一个不平衡的数据集。可能非常多的样本来自类别0,少数样本来自其余3个类别。要处理此问题,您可能需要应用加权样本或过采样/欠采样方法。

您好,非常感谢您的回复。你完全理解我的期望。我已经按照你的建议做了,关于混淆矩阵=混淆矩阵(yTest,yPred),我有一个错误,ValueError:分类指标无法处理多类和连续多输出目标的混合。请检查错误以解决问题。感谢使用此新设置,您不需要在yPred上应用阈值,而是使用argmax。还要确保混淆矩阵中yPred和yTest的形状相同。感谢您的回复。我是凯拉斯的新手。如果您有时间,请您配合编写或修改最后几行以设置混乱矩阵的argmax?您可以尝试使用y=keras.utils.to_category(y,num_classes=4)来代替y=encoder.fit_transform(我以前没有使用过)吗?对于混乱矩阵,请尝试以下方法:矩阵=混乱矩阵(yTest.argmax(axis=1),yPred.argmax(axis=1))numpy.AxisError:轴1超出维度为1的数组的界限