Код: Выделить всё
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]
)
Код: Выделить всё
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}%')
Все должно быть наоборот. Атаки должны уменьшиться, а Бенинг увеличиться
Подробнее здесь: https://stackoverflow.com/questions/790 ... fic-target