首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras MLP不工作

Keras MLP不工作
EN

Data Science用户
提问于 2023-05-09 18:12:26
回答 1查看 44关注 0票数 0

对于我的学位的最后一个项目,我正在与Keras合作,并试图建立不同的人工智能模型。我的MLP有点问题。首先,我对UNSW 15数据集进行预处理,然后将其用作NN中的输入。以下是预处理过程:

代码语言:javascript
复制
import pandas as pd
import numpy as np
from tensorflow.keras.utils import get_file

import numpy as np
import tensorflow.keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from sklearn.model_selection import train_test_split
from tensorflow.keras.callbacks import EarlyStopping
from sklearn import metrics

from sklearn.preprocessing import OrdinalEncoder

dfs = []
for i in range(1,5):
    path = './UNSW-NB15_{}.csv'# There are 4 input csv files
    dfs.append(pd.read_csv(path.format(i),dtype={'attack_cat': str, 'ct_ftp_cmd' : int }, header = None))
all_data = pd.concat(dfs).reset_index(drop=True)  # Concat all to a single df

 This csv file contains names of all the features
df_col = pd.read_csv('./NUSW-NB15_features.csv', encoding='ISO-8859-1')
 Making column names lower case, removing spaces
df_col['Name'] = df_col['Name'].apply(lambda x: x.strip().replace(' ', '').lower())
 Renaming our dataframe with proper column names
all_data.columns = df_col['Name']

all_data.drop(['srcip', 'sport', 'dstip', 'dsport', 'ct_ftp_cmd','state'],axis=1, inplace=True)
all_data['attack_cat'] = all_data['attack_cat'].str.strip()
all_data['attack_cat'] = all_data['attack_cat'].replace(['Backdoors'], 'Backdoor')
all_data.groupby('attack_cat')['attack_cat'].count()
all_data["attack_cat"] = all_data["attack_cat"].fillna('Normal')
all_data.groupby('attack_cat')['attack_cat'].count()
all_data.drop(all_data[all_data['is_ftp_login'] >= 2.0].index, inplace = True)
all_data['ct_flw_http_mthd'] = all_data['ct_flw_http_mthd'].fillna(0)
all_data['is_ftp_login'] = all_data['is_ftp_login'].fillna(0)

ord_enc = OrdinalEncoder()
all_data['encoded'] = ord_enc.fit_transform(all_data[['attack_cat']])
all_data['encoded_int'] = all_data['encoded'].astype(int)
all_data.drop(['encoded'],axis=1)
all_data.drop(['encoded_int'],axis=1)

ord_enc_serv = OrdinalEncoder()
all_data['encoded_serv'] = ord_enc_serv.fit_transform(all_data[['service']])
all_data['int_serv'] = all_data['encoded_serv'].astype(int)
all_data.drop(['encoded_serv'],axis=1)
all_data.drop(['encoded','encoded_serv'],axis=1)

ord_enc_proto = OrdinalEncoder()
all_data['encoded_proto'] = ord_enc.fit_transform(all_data[['proto']])
all_data['int_proto'] = all_data['encoded_proto'].astype(int)
all_data= all_data.drop(['encoded_proto'],axis=1)

encoded_data = all_data.drop(['encoded','encoded_serv','proto','service','attack_cat','label'],axis=1)

multi_data = encoded_data

X = multi_data.drop(columns=['encoded_int'],axis=1)
Y = multi_data['encoded_int']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,Y, train_size = 0.8, test_size = 0.2, random_state = 0,stratify = Y)

这就是模型:

代码语言:javascript
复制
model = Sequential()
model.add(Dense(X.shape[1], input_dim= X.shape[1], activation= 'relu'))
model.add(Dense(2*X.shape[1]+1, activation= 'relu'))
model.add(Dense(2*X.shape[1]+1,activation= 'relu'))
model.add(Dense(10,activation= 'softmax', kernel_initializer='normal'))
model.compile(loss= 'sparse_categorical_crossentropy', optimizer= 'adam', metrics= ['accuracy'])
monitor = EarlyStopping(monitor='val_loss', min_delta=1e-3, patience=5, 
                        verbose=1, mode='auto', restore_best_weights=True)

model.fit(X_train,y_train,validation_data=(X_test,y_test),
          callbacks=[monitor],batch_size=10000,verbose=2, epochs=100)

 Evaluate the model on the test set
from sklearn.metrics import classification_report
y_pred = model.predict(X_test)
y_pred_classes = y_pred
print(classification_report(y_test, y_pred_classes))

现在,笔记本会抛出这个错误:

分类度量不能处理多类和连续多输出目标的混合。

我需要一些帮助,因为我已经做了几个版本,我不能找到正确的一个,我不知道它是否在模型中的错误或其他什么,但我想获得准确性评分和衡量标准,以查看每一类攻击,其价值。

谢谢你的帮助。

编辑:

我终于能让它发挥作用了。现在它的准确度为71%。我所做的就是选择20个最重要的特性,然后对数据进行规范化。除输出层外,除输出层外,其余各层均有激活函数乙状结肠的71%。我正在尝试不同的配置和激活功能。怎样才能提高准确度?

EN

回答 1

Data Science用户

发布于 2023-05-10 07:05:36

您所调用的classification_report抛出分类度量的行不能处理多类和连续多输出目标的混合,因为y_preds_classes是从softmax输出的,因此它将是一个(507973,10)个浮点数数组,而y_test是一个(507973)个it数组--也就是说,您需要将softmax的输出转换回类别,以便与实际的真相标签进行比较。

类似于此y_preds = np.argmax(y_pred_classes, axis=1)的内容允许您调用classification_report而不抛出。您还可以添加目标名称,因此,如下所示:

代码语言:javascript
复制
target_names=["attack0", "attack1", "attack2", "attack3", "attack4", "attack5", "attack6", "attack7", "attack8", "attack9" ]
y_preds = np.argmax(y_pred_classes, axis=1)
print(classification_report(y_test, y_preds, target_names=target_names))

我建议也看一下混淆矩阵。

代码语言:javascript
复制
from sklearn.metrics import multilabel_confusion_matrix
multilabel_confusion_matrix(y_test, y_preds) 

代码语言:javascript
复制
import matplotlib.pyplot as plt
from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay.from_predictions(y_test, y_preds)
plt.show()

这将告诉您,经过训练的分类器只是简单地将每个分类器分类为第6类,一个很好的起点将是理解类的数据分布。有许多方法来处理高倾斜的输入数据,包括过采样和欠采样,或者根据它们的输入分布加权类。这是关于在keras中加权类的一个很好的教程:https://www.tensorflow.org/tutorials/structured_数据/不平衡_数据

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/121425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档