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

时间:2019-09-17 14:41:43

标签: keras neural-network deep-learning multiclass-classification

enter image description here enter image description here我有一个标记数据集。最后一栏(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) + "%")

1 个答案:

答案 0 :(得分:1)

如果我正确理解,您正在尝试解决一个多类分类问题,其中您的目标标签属于4种不同的攻击。因此,应使用具有“ softmax”激活功能(而非“ Sigmoid”激活)的具有4个单位而不是1个单位的输出密集层。此外,在编译模型时,应使用“ categorical_crossentropy”损失代替“ binary_crossentropy”。 此外,使用此设置,将argmax应用于预测结果(每个测试样本具有4个类别概率值),您将获得最终的标签/类别。


[编辑] 您的混淆矩阵和高准确性表明您正在使用不平衡的数据集。 0类的样本数量可能非常高,其余3类的样本数量很少。要解决此问题,您可能需要应用加权样本或过采样/欠采样方法。