Norvager

ads

Dec 19th, 2021
808
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.59 KB | None | 0 0
  1. import numpy as np
  2. import tensorflow as tf
  3. import random as rn
  4. import pandas as pd
  5. from tensorflow.keras.utils import to_categorical
  6. from keras import backend as K
  7. from tensorflow import keras
  8. from tensorflow.keras.models import Sequential
  9. from tensorflow.keras.layers import Dense
  10. from sklearn.model_selection import train_test_split
  11. from sklearn.preprocessing import StandardScaler, MinMaxScaler
  12. from sklearn.model_selection import cross_validate
  13. from sklearn.model_selection import KFold
  14. import matplotlib.pyplot as plt
  15. from imblearn.pipeline import Pipeline
  16. from keras.wrappers.scikit_learn import KerasClassifier
  17. #Открыть набор данных в переменную  
  18. df = pd.read_csv('vehicle.dat')
  19. print(df.columns)
  20. X = df.drop([' Class'], axis = 1)
  21. Y = to_categorical(df[' Class'].astype('category').cat.codes)
  22. X = MinMaxScaler().fit_transform(X.to_numpy())
  23. #Определение метрик качества работы сытемы - полнота, точность, F-мера
  24. def recall_m(y_true, y_pred):#Полнота
  25.     print(type(y_true))
  26.     true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
  27.     possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
  28.     recall = true_positives / (possible_positives + K.epsilon())
  29.     return recall
  30.  
  31. def precision_m(y_true, y_pred):#Точность
  32.     true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
  33.     predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
  34.     precision = true_positives / (predicted_positives + K.epsilon())
  35.     return precision
  36.  
  37. def f1_m(y_true, y_pred):#F1-мера
  38.     precision = precision_m(y_true, y_pred)
  39.     recall = recall_m(y_true, y_pred)
  40.     return 2*((precision*recall)/(precision+recall+K.epsilon()))
  41. #Создание нейронной сети
  42. def my_model(my_X, my_Y, activation_1='tanh', activation_2='relu',
  43.              neurons_input = 10, neurons_hidden_1=10, loss = 'mse',
  44.              optimizer='adam'):
  45.   model = Sequential()#Сеть с последовательным послойным распространением сигнала
  46.   model.add(Dense(neurons_input,activation=activation_1,input_shape=(my_X.shape[1],)))#Добавили полносвязный слой. 10 нейронов
  47.   #активация - гиперболический тангенс tanh, число входов - 144, по числу параметров
  48.   #Возможные функции активации
  49.   #https://keras.io/api/layers/activations/
  50.   model.add(Dense(neurons_hidden_1,activation=activation_2))
  51.   model.add(Dense(my_Y.shape[1],activation='sigmoid'))
  52.   #model.add(Dense(my_Y.shape[1],activation='selu'))#Добавили полносвязный слой. Число нейронов - число выходов (пользователей)
  53.   #Функция активации - софтмакс, для нормировки
  54.   model.compile(
  55.     #Возможные loss-функции
  56.     #https://keras.io/api/losses/probabilistic_losses/#binarycrossentropy-class
  57.     #loss = tf.keras.losses.BinaryCrossentropy(),
  58.     loss=loss,#потери - среднеквадратичная ошибка
  59.     optimizer=tf.optimizers.Adam(learning_rate=1e-3),#оптимизатор adam
  60.     #optimizer = optimizer,
  61.     metrics=['acc', f1_m, precision_m, recall_m]#метрики - доля верных ответов, F1-мера, точность, полнота
  62.   )
  63.   return(model)
  64.  
  65. # Define the K-fold Cross Validator
  66. num_folds = 3
  67. batch_size = 18
  68. acc_per_fold = []
  69. loss_per_fold = []
  70. f1_per_fold = []
  71. prec_per_fold = []
  72. recall_per_fold = []
  73. res_f1_per_fold = []
  74. res_loss_per_fold = []
  75.  
  76. kfold = KFold(n_splits=num_folds, shuffle=True)
  77.  
  78. # K-fold Cross Validation model evaluation
  79. fold_no = 1
  80. for train, test in kfold.split(X, Y):
  81.   model = my_model(X, Y)
  82.   # Compile the model
  83.   # Generate a print
  84.   print('------------------------------------------------------------------------')
  85.   print(f'Training for fold {fold_no} ...')
  86.  
  87.   # Fit data to model
  88.   results = model.fit(X[train],Y[train],
  89.                       batch_size=batch_size,
  90.                       validation_data = (X[test],Y[test]),
  91.                       epochs=50,verbose=1)#Обучаем модель, 560 циклов (эпох), с отображением процесса
  92.   # Generate generalization metrics
  93.   scores = model.evaluate(X[test], Y[test], verbose=1)
  94.   #print(scores)
  95.   print(f'Score for fold {fold_no}: {model.metrics_names[0]} of {scores[0]};')
  96.   print(f'{model.metrics_names[1]} of {scores[1]*100}%; {model.metrics_names[2]} of {scores[2]*100}%;')
  97.   print(f'{model.metrics_names[3]} of {scores[3]*100}%; {model.metrics_names[4]} of {scores[4]*100}%;')
  98.   acc_per_fold.append(scores[1] * 100)
  99.   f1_per_fold.append(scores[2] * 100)
  100.   prec_per_fold.append(scores[3] * 100)
  101.   recall_per_fold.append(scores[4] * 100)
  102.   loss_per_fold.append(scores[0])
  103.   res_f1_per_fold.append(results.history['val_f1_m'])
  104.   res_loss_per_fold.append(results.history['loss'])
  105.  
  106.   # Increase fold number
  107.   fold_no = fold_no + 1
  108.  
  109. # == Provide average scores ==
  110. print('------------------------------------------------------------------------')
  111. print('Score per fold')
  112. for i in range(0, len(acc_per_fold)):
  113.   print('------------------------------------------------------------------------')
  114.   print(f'> Fold {i+1} - Loss: {loss_per_fold[i]} - Accuracy: {acc_per_fold[i]}%')
  115.   print(f'- F1: {f1_per_fold[i]}% ')
  116.   print(f'- Precision: {prec_per_fold[i]}%')
  117.   print(f'- Recall: {recall_per_fold[i]}%')
  118. print('------------------------------------------------------------------------')
  119. print('Average scores for all folds:')
  120. print(f'> Accuracy: {np.mean(acc_per_fold)} (+- {np.std(acc_per_fold)})')
  121. print(f'> Loss: {np.mean(loss_per_fold)} (+- {np.std(loss_per_fold)})')
  122. print(f'> F1: {np.mean(f1_per_fold)} (+- {np.std(f1_per_fold)})')
  123. print(f'> Precision: {np.mean(prec_per_fold)} (+- {np.std(prec_per_fold)})')
  124. print(f'> Recall: {np.mean(recall_per_fold)} (+- {np.std(recall_per_fold)})')
  125. print('------------------------------------------------------------------------')
  126. #Находим среднюю F-меру
  127. f1_line = [sum(x) / len(x) for x in zip(*res_f1_per_fold)]
  128. #Средняя лосс-функция
  129. loss_line = [sum(x) / len(x) for x in zip(*res_loss_per_fold)]
  130.  
  131. #Вывод графиков
  132. plt.plot(f1_line)#выводим F1-меру для обучающей выборки
  133. plt.plot(loss_line)#выводим F1-меру для тестовой выборки
  134. plt.title('Model F1')
  135. plt.ylabel('F1|Loss')
  136. plt.xlabel('Epoch')
  137. plt.legend(['F1', 'Loss'], loc='upper left')
  138. plt.show()
  139.  
  140.  
  141.  
Advertisement
Add Comment
Please, Sign In to add comment