bortolinho

pistachio.py

Jun 13th, 2022
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. # first neural network with keras tutorial
  2. from numpy import loadtxt
  3. from keras.models import Sequential
  4. from keras.layers import Dense, Dropout
  5. from sklearn.model_selection import learning_curve, train_test_split
  6. import matplotlib.pyplot as plt
  7. from sklearn.metrics import confusion_matrix, label_ranking_average_precision_score
  8. from sklearn.preprocessing import Normalizer
  9. from sklearn import metrics
  10.  
  11. # Carrega o banco de dados com 28 atributos
  12. dataset = loadtxt('Pistachio_28_Dataset.csv', delimiter=',')
  13. # 0 == Kirmizi_Pistachio
  14. # 1 == Siirt_Pistachio
  15.  
  16. # Separa os resultados de cada linha da base de dados
  17. X = dataset[:,0:28]
  18. y = dataset[:,28]
  19.  
  20. # Normalizacao dos dados, converte para valores entre 0 e 1
  21. X = Normalizer().fit(X).transform(X)
  22.  
  23. # Divisao dos dados para treinamento (66,6%) e teste (33,3%)
  24. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, shuffle=True)
  25.  
  26. # Definicao do modelo keras (rede neural) com 4 camadas
  27. model = Sequential()
  28. model.add(Dense(100, input_dim=X.shape[1], activation='relu'))
  29. model.add(Dense(33, activation='relu'))
  30. model.add(Dropout(0.3)) # Desativa 30% dos neuronios aleatoriamente da camada anterior
  31. model.add(Dense(11, activation='relu'))
  32. model.add(Dropout(0.3)) # Desativa 30% dos neuronios aleatoriamente da camada anterior
  33. model.add(Dense(1, activation='sigmoid'))
  34.  
  35. # dropout: Técnica que desativa alguns neurônios aleatórios da camada em cada época,
  36. # dificultando a rede neural de ajustar os pesos de cada neurônio perfeitamente para
  37. # aquele conjunto de treinamento. Se trata de uma técnica de generalização, ou seja,
  38. # a capacidade da rede neural de classificar corretamente os dados que ela nunca viu.
  39. # Na prática ele ajuda a evitar o overfitting e evita que forme um caminho unico de
  40. # sucesso na rede, pois alguns neuronios serão desativados.
  41.  
  42. # Resultados do dropout: O conjunto de teste teve uma acurácia igual ao conjunto de
  43. # treinamento pois o modelo foi generalizado, ou seja, ele não se acostumou a ajustar
  44. # os pesos dos neuronios pra trabalhar somente com os dados de treinamento.
  45. # O Loss (erro) nos dados de teste foi menor que no conjunto de treinamento pelo mesmo motivo.
  46.  
  47. # Compilacao do modelo
  48. # Desempenho (AUC) de cada otimizador para 2000 epocas
  49. # 1° - nadam - 0.88
  50. # 2° - adam - 0.87
  51. # 3° - adamax - 0.84
  52. model.compile(loss='binary_crossentropy', optimizer="adam", metrics=['accuracy'])
  53.  
  54. # Treinamento do modelo com os dados de TREINAMENTO, validando o modelo com dados de TESTE
  55. fit = model.fit(
  56. x = X_train, # Atributos de treinamento
  57. y = y_train, # Resultados de treinamento
  58. epochs = 500, # Numero de "geracoes"
  59. validation_data=(X_test, y_test), # validacao do modelo com dados de teste
  60. batch_size = 100 # Numero de amostras que vai passar pela rede neural (0-100, 101-200, 201-300...)
  61. )
  62.  
  63. # Retorna todas as classificacoes da amostra de teste (array de 0-1)
  64. pred = (model.predict(X_test) > 0.5).astype("int32")
  65.  
  66. # Grafico de acuracia
  67. plt.plot(fit.history['accuracy'])
  68. plt.plot(fit.history['val_accuracy'])
  69. plt.title('model accuracy')
  70. plt.ylabel('accuracy')
  71. plt.xlabel('epoch')
  72. plt.legend(['train', 'test'], loc='upper left')
  73. plt.show()
  74.  
  75. # Grafico de loss
  76. plt.plot(fit.history['loss'])
  77. plt.plot(fit.history['val_loss'])
  78. plt.title('model loss')
  79. plt.ylabel('loss')
  80. plt.xlabel('epoch')
  81. plt.legend(['train', 'test'], loc='upper left')
  82. plt.show()
  83.  
  84. # Matriz de confusao, passando as classificacoes do dataset e do modelo
  85. cm = confusion_matrix(y_test, pred)
  86. print(f"\nMatriz de confusão ({sum(sum(cm))} dados de teste):")
  87. print("0) ", cm[0][0], " acertos, ", cm[0][1], " erros;")
  88. print("1) ", cm[1][1], " acertos, ", cm[1][0], " erros;\n")
  89.  
  90. tn, fp, fn, tp = confusion_matrix(y_test, pred).ravel()
  91.  
  92. # Taxa de verdadeiro positivo, o quanto ele realmente acertou do que era positivo (classe 1)
  93. tpr = tp / (tp + fn)
  94.  
  95. # Taxa de verdadeiro negativo, o quanto ele realmente acertou do que era negativo (classe 0)
  96. tnr = tn / (tn + fp)
  97.  
  98. # Taxa de acuracia (acuracia simplesmente conta quantas classificacoes batem com os resultados do dataset)
  99. acc = (tp + tn) / (tp + tn + fp + fn)
  100.  
  101. print("TPR (verdadeiro positivo): ", round(tpr,2))
  102. print("TNR (verdadeiro negativo): ", round(tnr,2))
  103. print("ACC (acuracia): %.2f\n" % (acc * 100))
  104.  
  105. # Grafico que mostra o quao bom eh o classificador. Quanto mais longe da linha tracejada, melhor eh o desempenho do classificador
  106. fpr, tpr, thresholds = metrics.roc_curve(y_test, pred, pos_label=1)
  107. auc = metrics.auc(fpr, tpr)
  108.  
  109. plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', label='Chance', alpha=.8)
  110. plt.plot(fpr, tpr, color='b', label=r'ROC (AUC = %0.2f)' % (auc), lw=2, alpha=.8)
  111. plt.suptitle('ROC Curve')
  112. plt.xlabel('FPR')
  113. plt.ylabel('TPR')
  114. plt.legend(loc='lower right')
  115. plt.show()
  116.  
Add Comment
Please, Sign In to add comment