Состязательная атака на LSTM с конкретной цельюPython

Программы на Python
Anonymous
Состязательная атака на LSTM с конкретной целью

Сообщение Anonymous »

У меня есть набор данных, в котором есть БЕЗОПАСНЫЕ записи и несколько атак. Я создал всего два класса: BENIGN и Attack (которые включают в себя все атаки набора данных). Я обучил его с помощью LSTM с точностью 99%. Теперь я хочу изменить входные данные, чтобы все записи об атаках классифицировались как БЕЗОПАСНЫЕ (конечно, не все записи, но хорошие %).

Код: Выделить всё

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import tensorflow as tf
from keras import Model
from keras.layers import Dense, Input, Dropout
from keras.losses import BinaryCrossentropy
from keras.metrics import Accuracy
from keras.optimizers import Adam
from keras.layers import LSTM

df1=pd.read_csv('Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv')
df2=pd.read_csv('Wednesday-workingHours.pcap_ISCX.csv')
df=pd.concat([df1,df2])

df.replace([np.inf, -np.inf], np.nan, inplace=True)
df.dropna(inplace=True)
mask=df[' Label'].str.startswith(('D','H'))
df.loc[mask,' Label']='Attack'
df[' Label'].value_counts()
#this return Label
BENIGN    537369
Attack    379748
Name: count, dtype: int64

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
df[' Label'] = encoder.fit_transform(df[' Label'])
X = df.drop(' Label', axis=1)  # Feature matrix (escludendo la colonna target)
y = df[' Label']               # Target (etichetta o variabile di risposta)
num_classes = len(np.unique(y))

from sklearn.preprocessing import StandardScaler

#Replace infinite values with NaN
X.replace([np.inf, -np.inf], np.nan, inplace=True)
# Drop rows with NaN values
X.dropna(inplace=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
X_train.shape

scaler=StandardScaler()
X_train=scaler.fit_transform(X_train)
X_test=scaler.transform(X_test)
X_train=X_train.reshape(len(X_train),1,X_train.shape[1])
X_test=X_test.reshape(len(X_test),1,X_test.shape[1])
X_train.shape[1:]
X_test.shape,y_test.shape

from keras.layers import Activation

def buildmodel(dim):
model=tf.keras.Sequential()
model.add(LSTM(40, return_sequences=True, input_shape=(dim)))
model.add(Dropout(0.2))
model.add(LSTM(78))
model.add(Dropout(0.4))
model.add(Dense(1,activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='sgd',metrics=['accuracy'])
return model

from tensorflow.keras.utils import to_categorical

# Converti le etichette in formato one-hot
y_train_one_hot = to_categorical(y_train, num_classes=2)
y_test_one_hot = to_categorical(y_test, num_classes=2)
model=buildmodel(X_train.shape[1:])
model.summary()

n_epochs=35
minibatch_size=15

# Early Stopping per fermare l'addestramento se non migliora
early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)

history = model.fit(
X_train, y_train,
validation_data=(X_test, y_test),
epochs=n_epochs,
batch_size=minibatch_size,  # Batch size maggiore per ridurre il numero di iterazioni
shuffle=True,
verbose=1,  # Mostra il progresso durante l'addestramento
callbacks=[early_stop]
)
Я получаю точность 99%. Затем я сделал эту атаку:

Код: Выделить всё

def create_adversarial_pattern(model, input_data, target_label):
with tf.GradientTape() as tape:
input_data = tf.convert_to_tensor(input_data)
tape.watch(input_data)

# Previsione del modello
prediction = model(input_data, training=False)

# Calcola la loss rispetto all'etichetta target_label
loss = tf.keras.losses.binary_crossentropy(target_label, prediction)

# Calcola il gradiente della loss rispetto ai dati di input
gradient = tape.gradient(loss, input_data)

# Segno del gradiente per creare la perturbazione
signed_grad = tf.sign(gradient)

return signed_grad

def generate_adversarial_examples(model, X_test, y_test, epsilon):
adversarial_examples = []

for i in range(0, len(X_test), 32):
input_data = X_test[i:i+32]
input_label = y_test.iloc[i:i+32].values.reshape(-1, 1)  # Converti Series a NumPy array e reshape

# Definisci la target_label opposta alla classe attuale
target_label = np.where(input_label == 0, 1, input_label)  # Forza ATTACK (0) a BENIGN (1)

# Creazione della perturbazione
perturbation = create_adversarial_pattern(model, input_data, target_label)

# Applicazione della perturbazione ai dati di input
adversarial_data = input_data + epsilon * perturbation

adversarial_examples.append(adversarial_data)

return np.vstack(adversarial_examples)

# Definisci il valore di epsilon (più alto = attacco più forte)
epsilon = 0.9

# Genera gli esempi adversarial
adversarial_X_test = generate_adversarial_examples(model, X_test, y_test, epsilon)

# Previsione sui dati adversarial
y_pred_adv = model.predict(adversarial_X_test)

# Calcola l'accuratezza sui dati adversarial
adv_accuracy = accuracy_score(y_test, np.round(y_pred_adv))
print(f'Accuratezza con attacco adversarial: {adv_accuracy * 100:.2f}%')

И я получаю новую точность 48%. Когда я пытаюсь построить график результатов, я получаю вот что: введите сюда описание изображения
Все должно быть наоборот. Атаки должны уменьшиться, а Бенинг увеличиться

Подробнее здесь: https://stackoverflow.com/questions/790 ... fic-target

Вернуться в «Python»