import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import np_utils
import numpy as np
import keras
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
#Montar o drive:
from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
#arquivo = "/content/drive/MyDrive/Mestrado/Mestrado_Otacílio_Raphael/DataSetDGA/DataSet_DGA_(Rev1)T1.xlsx"
arquivo = "/content/drive/MyDrive/Mestrado/Mestrado_Otacílio_Raphael/DataSetDGA/DataSetDGA(Rev1)T1_S.Outiliers.xlsx"
DataSet = pd.read_excel(arquivo)                                                             # Sintaxe para nomear DataSet.
DataSet.head()
Unnamed: 0 H2 CH4 C2H4 C2H6 C2H2 NTE NF Rótulo
0 0 21.00 63.0 4.0 87.0 1.0 0 0 NO
1 1 0.01 61.0 6.0 81.0 1.0 0 0 NO
2 2 0.01 58.0 5.0 77.0 1.0 0 0 NO
3 3 0.01 56.0 6.0 73.0 1.0 0 0 NO
4 4 0.01 58.0 5.0 75.0 1.0 0 0 NO
gases = ['H2', 'CH4', 'C2H4', 'C2H6', 'C2H2']
X = DataSet[gases].values
classe = DataSet['NTE'].values
classe_dummy = np_utils.to_categorical(classe)
Xl = np.log(X)
#Xln = np.log(X)
# Normalizar DataSet:
from sklearn.preprocessing import StandardScaler
previsores = StandardScaler().fit_transform(Xl)
print('Média antes:',np.mean(X))
print('Média depois:',np.mean(previsores))
print('Variância antes:',np.std(X))
print('Variância depois:',np.std(previsores))
np.isnan(previsores)
Média antes: 138.30720459081837
Média depois: -6.52394527843605e-17
Variância antes: 1617.3875441693656
Variância depois: 0.9999999999999999
array([[False, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False],
       ...,
       [False, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False]])
from sklearn.model_selection import train_test_split
previsores_treinamento, previsores_teste, classe_treinamento, classe_teste = train_test_split(previsores, classe_dummy, test_size=0.25, random_state=25)

Atribuição numérica aos dados:

Classe Normal = 0;

Falha Térmica = 1;

Falha elétrica = 2.

from keras import initializers
classificador = Sequential()
classificador.add(Dense(units = 12, activation = 'selu', kernel_initializer = 'normal', input_dim = 5))
classificador.add(Dense(units = 12, activation = 'selu', kernel_initializer = 'normal'))
classificador.add(Dense(units = 8, activation = 'selu', kernel_initializer = 'normal'))
classificador.add(Dense(units = 6, activation = 'selu', kernel_initializer = 'normal'))
classificador.add(Dense(units = 3, activation = 'softmax'))
otimizador = keras.optimizers.Adam(lr=0.01, decay=0.0001, clipvalue=0.5)
classificador.compile(optimizer = otimizador, loss = 'categorical_crossentropy',
                      metrics = ['categorical_accuracy'])
classificador.fit(previsores_treinamento, classe_treinamento, batch_size = 10,
                  epochs = 100)
/usr/local/lib/python3.10/dist-packages/keras/optimizers/legacy/adam.py:117: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  super().__init__(name, **kwargs)
Epoch 1/100
151/151 [==============================] - 1s 2ms/step - loss: 0.5196 - categorical_accuracy: 0.7951
Epoch 2/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2943 - categorical_accuracy: 0.8869
Epoch 3/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2745 - categorical_accuracy: 0.8989
Epoch 4/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2667 - categorical_accuracy: 0.9029
Epoch 5/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2631 - categorical_accuracy: 0.9035
Epoch 6/100
151/151 [==============================] - 0s 3ms/step - loss: 0.2437 - categorical_accuracy: 0.9175
Epoch 7/100
151/151 [==============================] - 0s 3ms/step - loss: 0.2425 - categorical_accuracy: 0.9022
Epoch 8/100
151/151 [==============================] - 0s 3ms/step - loss: 0.2333 - categorical_accuracy: 0.9155
Epoch 9/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2427 - categorical_accuracy: 0.9095
Epoch 10/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2336 - categorical_accuracy: 0.9088
Epoch 11/100
151/151 [==============================] - 0s 3ms/step - loss: 0.2186 - categorical_accuracy: 0.9222
Epoch 12/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2387 - categorical_accuracy: 0.9108
Epoch 13/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2293 - categorical_accuracy: 0.9122
Epoch 14/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2227 - categorical_accuracy: 0.9188
Epoch 15/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2269 - categorical_accuracy: 0.9122
Epoch 16/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2271 - categorical_accuracy: 0.9235
Epoch 17/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2152 - categorical_accuracy: 0.9122
Epoch 18/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2270 - categorical_accuracy: 0.9122
Epoch 19/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2170 - categorical_accuracy: 0.9088
Epoch 20/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2033 - categorical_accuracy: 0.9208
Epoch 21/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2080 - categorical_accuracy: 0.9202
Epoch 22/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1889 - categorical_accuracy: 0.9255
Epoch 23/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2071 - categorical_accuracy: 0.9242
Epoch 24/100
151/151 [==============================] - 0s 2ms/step - loss: 0.2002 - categorical_accuracy: 0.9228
Epoch 25/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1815 - categorical_accuracy: 0.9348
Epoch 26/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1838 - categorical_accuracy: 0.9341
Epoch 27/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1850 - categorical_accuracy: 0.9275
Epoch 28/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1788 - categorical_accuracy: 0.9341
Epoch 29/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1835 - categorical_accuracy: 0.9295
Epoch 30/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1763 - categorical_accuracy: 0.9355
Epoch 31/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1673 - categorical_accuracy: 0.9335
Epoch 32/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1649 - categorical_accuracy: 0.9428
Epoch 33/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1690 - categorical_accuracy: 0.9301
Epoch 34/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1702 - categorical_accuracy: 0.9361
Epoch 35/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1544 - categorical_accuracy: 0.9474
Epoch 36/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1595 - categorical_accuracy: 0.9421
Epoch 37/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1605 - categorical_accuracy: 0.9454
Epoch 38/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1578 - categorical_accuracy: 0.9381
Epoch 39/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1549 - categorical_accuracy: 0.9448
Epoch 40/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1466 - categorical_accuracy: 0.9468
Epoch 41/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1654 - categorical_accuracy: 0.9368
Epoch 42/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1573 - categorical_accuracy: 0.9434
Epoch 43/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1502 - categorical_accuracy: 0.9448
Epoch 44/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1575 - categorical_accuracy: 0.9434
Epoch 45/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1434 - categorical_accuracy: 0.9481
Epoch 46/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1517 - categorical_accuracy: 0.9395
Epoch 47/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1584 - categorical_accuracy: 0.9415
Epoch 48/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1397 - categorical_accuracy: 0.9514
Epoch 49/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1525 - categorical_accuracy: 0.9468
Epoch 50/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1619 - categorical_accuracy: 0.9428
Epoch 51/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1412 - categorical_accuracy: 0.9468
Epoch 52/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1418 - categorical_accuracy: 0.9454
Epoch 53/100
151/151 [==============================] - 0s 3ms/step - loss: 0.1398 - categorical_accuracy: 0.9494
Epoch 54/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1387 - categorical_accuracy: 0.9501
Epoch 55/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1420 - categorical_accuracy: 0.9468
Epoch 56/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1447 - categorical_accuracy: 0.9461
Epoch 57/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1382 - categorical_accuracy: 0.9521
Epoch 58/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1477 - categorical_accuracy: 0.9434
Epoch 59/100
151/151 [==============================] - 0s 3ms/step - loss: 0.1405 - categorical_accuracy: 0.9481
Epoch 60/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1402 - categorical_accuracy: 0.9454
Epoch 61/100
151/151 [==============================] - 0s 3ms/step - loss: 0.1324 - categorical_accuracy: 0.9521
Epoch 62/100
151/151 [==============================] - 0s 3ms/step - loss: 0.1347 - categorical_accuracy: 0.9521
Epoch 63/100
151/151 [==============================] - 0s 3ms/step - loss: 0.1296 - categorical_accuracy: 0.9534
Epoch 64/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1427 - categorical_accuracy: 0.9448
Epoch 65/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1337 - categorical_accuracy: 0.9474
Epoch 66/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1377 - categorical_accuracy: 0.9514
Epoch 67/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1303 - categorical_accuracy: 0.9541
Epoch 68/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1316 - categorical_accuracy: 0.9488
Epoch 69/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1257 - categorical_accuracy: 0.9521
Epoch 70/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1157 - categorical_accuracy: 0.9607
Epoch 71/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1280 - categorical_accuracy: 0.9528
Epoch 72/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1270 - categorical_accuracy: 0.9468
Epoch 73/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1247 - categorical_accuracy: 0.9554
Epoch 74/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1192 - categorical_accuracy: 0.9568
Epoch 75/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1242 - categorical_accuracy: 0.9541
Epoch 76/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1180 - categorical_accuracy: 0.9561
Epoch 77/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1357 - categorical_accuracy: 0.9494
Epoch 78/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1155 - categorical_accuracy: 0.9541
Epoch 79/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1261 - categorical_accuracy: 0.9514
Epoch 80/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1287 - categorical_accuracy: 0.9474
Epoch 81/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1142 - categorical_accuracy: 0.9607
Epoch 82/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1165 - categorical_accuracy: 0.9581
Epoch 83/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1171 - categorical_accuracy: 0.9574
Epoch 84/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1097 - categorical_accuracy: 0.9581
Epoch 85/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1117 - categorical_accuracy: 0.9607
Epoch 86/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1109 - categorical_accuracy: 0.9601
Epoch 87/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1196 - categorical_accuracy: 0.9574
Epoch 88/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1108 - categorical_accuracy: 0.9614
Epoch 89/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1143 - categorical_accuracy: 0.9627
Epoch 90/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1129 - categorical_accuracy: 0.9601
Epoch 91/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1069 - categorical_accuracy: 0.9607
Epoch 92/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1089 - categorical_accuracy: 0.9621
Epoch 93/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1058 - categorical_accuracy: 0.9587
Epoch 94/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1189 - categorical_accuracy: 0.9581
Epoch 95/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1089 - categorical_accuracy: 0.9594
Epoch 96/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1087 - categorical_accuracy: 0.9601
Epoch 97/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1170 - categorical_accuracy: 0.9568
Epoch 98/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1162 - categorical_accuracy: 0.9601
Epoch 99/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1027 - categorical_accuracy: 0.9647
Epoch 100/100
151/151 [==============================] - 0s 2ms/step - loss: 0.1148 - categorical_accuracy: 0.9548
<keras.callbacks.History at 0x7f7824ac7190>
resultado = classificador.evaluate(previsores_teste, classe_teste)
16/16 [==============================] - 0s 2ms/step - loss: 0.1944 - categorical_accuracy: 0.9481
previsoes = classificador.predict(previsores_teste)
previsoes = (previsoes > 0.5)
16/16 [==============================] - 0s 1ms/step
import numpy as np
classe_teste2 = [np.argmax(t) for t in classe_teste]
previsoes2 = [np.argmax(t) for t in previsoes]

from sklearn.metrics import confusion_matrix
matriz = confusion_matrix(previsoes2, classe_teste2)
matriz
array([[315,   6,   9],
       [  6,  98,   3],
       [  1,   1,  62]])

GridSearch com Validação Cruzada

def criarRede(optimizer, loos, kernel_initializer, activation, neurons):
  classificador = Sequential()
  classificador.add(Dense(units = neurons, activation = activation, kernel_initializer = kernel_initializer, input_dim = 5))
  classificador.add(Dropout(0.2))
  classificador.add(Dense(units = 12, activation = activation, kernel_initializer = kernel_initializer))
  classificador.add(Dropout(0.2))
  classificador.add(Dense(units = neurons, activation = activation, kernel_initializer = kernel_initializer))
  classificador.add(Dropout(0.2))
  classificador.add(Dense(units = 6, activation = activation, kernel_initializer = kernel_initializer))
  classificador.add(Dropout(0.2))
  classificador.add(Dense(units = 3, activation = 'softmax'))
  #otimizador = keras.optimizers.Adam(lr=0.01, decay=0.0001, clipvalue=0.5)
  classificador.compile(optimizer = optimizer, loss = loos,
                      metrics = ['categorical_accuracy'])
  return classificador
classificador = KerasClassifier(build_fn = criarRede)
parametros = {'batch_size': [10],
              'epochs': [50, 100],
              'optimizer': ['adam'],
              'loos': ['categorical_crossentropy'],
              'kernel_initializer': ['random_uniform', 'normal'],
              'activation': ['relu', 'tanh', 'selu'],
              'neurons': [12, 8]}
grid_search = GridSearchCV(estimator = classificador,
                           param_grid = parametros,
                           scoring = 'accuracy',
                           cv = 5)
DeprecationWarning: KerasClassifier is deprecated, use Sci-Keras (https://github.com/adriangb/scikeras) instead. See https://www.adriangb.com/scikeras/stable/migration.html for help migrating.
  classificador = KerasClassifier(build_fn = criarRede)
grid_search = grid_search.fit(previsores, classe)
melhores_parametros = grid_search.best_params_
melhores_parametros
{'activation': 'selu',
 'batch_size': 10,
 'epochs': 100,
 'kernel_initializer': 'normal',
 'loos': 'categorical_crossentropy',
 'neurons': 12,
 'optimizer': 'adam'}
melhor_precisao = grid_search.best_score_
melhor_precisao
0.7384999999999999
#classificador = KerasClassifier(build_fn = criarRede, epochs = 100, batch_size = 10)
#resultados = cross_val_score(estimator = classificador, X = previsores, y = classe, cv = 10, scoring = 'accuracy')
#media = resultados.mean()
#media
# quanto maior o desvio - maior será o overfintting
#desvio = resultados.std()
#desvio