Blame view

python/ANN.py 5.89 KB
4d6b688b   rcavalie   Réseau de neurone...
1
2
3
4
5
6
7
  """
  Created on Thu Jan 18 14:28:42 2018
  @author: Robin Cavalieri
  Réseau de neurones 
  P32 : Apprentissage DoS
  PFE 2018 - IMA5SC Polytech Lille
  """
bdfec245   rcavalie   intégration du ré...
8
  #Programme générique. N'oubliez pas de changer les PATHS
4d6b688b   rcavalie   Réseau de neurone...
9
10
11
12
13
  ###############################################################################
  #LIBRAIRIES UTILES
  ###############################################################################
  import numpy as np
  import pandas as pd
9a50b3df   rcavalie   premiere version ok
14
  import csv
4d6b688b   rcavalie   Réseau de neurone...
15
16
17
18
19
20
  # Modelisation
  from sklearn.model_selection import train_test_split
  from sklearn.preprocessing import StandardScaler
  from sklearn.metrics import confusion_matrix
  # Réseau de neurones 
  from keras.models import Sequential
4d6b688b   rcavalie   Réseau de neurone...
21
  from keras.layers import Dense
4d6b688b   rcavalie   Réseau de neurone...
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  ###############################################################################
  
  ###############################################################################
  #TRAVAIL PRELIMINAIRE DE TRAITEMENT DES DONNEES D'APPRENTISSAGE
  ###############################################################################
  # Ouverture des bases d'apprentissage
  dataset_ping_norm = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/ping_norm.csv');
  dataset_ping_attack = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/ping_attack.csv');
  dataset_rssi_norm = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/rssi_norm.csv');
  dataset_rssi_attack = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/rssi_attack.csv');
  
  #Concaténation des datasets de même classe 1-Normal 2- Attaque
  temp = dataset_rssi_norm.iloc[:,1].values;
  dataset_norm = np.c_[dataset_ping_norm, temp];
  temp = dataset_rssi_attack.iloc[:,1].values;
  dataset_attack = np.c_[dataset_ping_attack, temp];
  
  #Concaténation des datasets de même type
  dataset = np.concatenate((dataset_attack, dataset_norm), axis=0);
  
  #Récupération de la taille des matrices de données 
  [nSizeX, nSizeY] = np.shape(dataset);
  
  #On mélange les données pour éviter un apprentissage par fontière
  np.random.shuffle(dataset);
  
  #Sortie associée (correspond à la classe attaque ou non : colonne 1)
  target = dataset[:, 0];
  
  #Données d'entrée (ping : colonne 2 et rssi : colonne 3)
  #data = dataset[:,1];
  data = dataset[:,0:nSizeY-1];
  
  #80% des données utilisées à l'entrainement et 20% des données en test 
  data_train, data_test, target_train, target_test = train_test_split(data, target, test_size = 0.2, random_state = 0);
  
  #Normalisation des données 
  sc = StandardScaler();
  data_train = sc.fit_transform(data_train);
  data_test = sc.transform(data_test);
  ###############################################################################
  
  ###############################################################################
  #ARCHITECTURE DU RESEAU DE NEURONES par le biais de la librairie KERAS
  #ANN 
  ###############################################################################
  #Création du classifieur 
  classifier = Sequential();
  #Couche d'entrée donc avec 2 entrées, PING et DELTA_RSSI
9a50b3df   rcavalie   premiere version ok
71
72
73
  classifier.add(Dense(32, activation='relu', input_dim=2))
  #Couche de sortie
  classifier.add(Dense(1, activation='sigmoid'))
4d6b688b   rcavalie   Réseau de neurone...
74
75
76
77
78
79
80
81
82
83
84
85
86
  ###############################################################################
  
  ###############################################################################
  #COMPILATION
  ###############################################################################
  # optimizer : algorithme choisi pour trouver le model (le plus puissant)
  # loss : Si deux valeurs en sortie (binairie outcome) : binary_crossentropy
  classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy']);
  ###############################################################################
  
  ###############################################################################
  #TRAINING
  ###############################################################################
9a50b3df   rcavalie   premiere version ok
87
  classifier.fit(data_train, target_train, batch_size =1, epochs=10);
4d6b688b   rcavalie   Réseau de neurone...
88
89
  ###############################################################################
  
f0cdc988   rcavalie   travail sur la ré...
90
  ###############################################################################
4d6b688b   rcavalie   Réseau de neurone...
91
  #TAUX DE REUSSITE A PARTIR DES DONNEES DE TEST
f0cdc988   rcavalie   travail sur la ré...
92
  ###############################################################################
4d6b688b   rcavalie   Réseau de neurone...
93
94
95
96
97
98
99
100
101
102
103
  data_pred = classifier.predict(data_test);
  # Conversion en True ou False les predictions
  # Si y_pred > 0.5 : True 
  data_pred_binary = (data_pred > 0.5);
  # Matrice de cout
  cm = confusion_matrix(target_test, data_pred_binary);
  #dire qu'un trafic normal est une attaque
  good_prediction = cm[0, 0] + cm[1, 1];
  #dire qu'une attaque est un trafic normal 
  bad_prediction = cm[1, 0] + cm[0, 1];  
  taux_succes = good_prediction * 100 / (good_prediction + bad_prediction);
f0cdc988   rcavalie   travail sur la ré...
104
  ###############################################################################
bdfec245   rcavalie   intégration du ré...
105
  
f0cdc988   rcavalie   travail sur la ré...
106
  ###############################################################################
bdfec245   rcavalie   intégration du ré...
107
  #SAUVEGARDE DU TRAINING SET
f0cdc988   rcavalie   travail sur la ré...
108
  ###############################################################################
bdfec245   rcavalie   intégration du ré...
109
110
111
112
113
  #Le modèle est mis au format JSON 
  classifier_json = classifier.to_json();
  with open('C:/Users/Utilisateur/PFE/python/Training/training.json',"w") as json_file : 
      json_file.write(classifier_json);
  #Les poids sont mis en HDF5
f0cdc988   rcavalie   travail sur la ré...
114
115
116
  classifier.save_weights("C:/Users/Utilisateur/PFE/python/Training/training.h5");
  ###############################################################################
  
9a50b3df   rcavalie   premiere version ok
117
118
119
120
121
122
123
124
125
126
127
128
129
  ##########################################################################################
  #REALISER DES PREDICTIONS
  ##########################################################################################
  dataset_to_pred = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/data_to_pred.csv', quoting=csv.QUOTE_NONE);
  [xSizePred, ySizePred] = np.shape(dataset_to_pred);
  data_to_pred = dataset_to_pred.iloc[:, 0: ySizePred].values;
  predictions = classifier.predict(data_to_pred);
  
  predictions_named = [];
  
  for x in range(0, xSizePred-1):
      if predictions[x] > 0.5:
          predictions_named.append("Attaque")
f0cdc988   rcavalie   travail sur la ré...
130
      else:
9a50b3df   rcavalie   premiere version ok
131
132
          predictions_named.append("RAS")
  ##########################################################################################