Advertisement
max2201111

Petr2 DNN a CNN CM train

Aug 20th, 2024
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.06 KB | Science | 0 0
  1. import numpy as np
  2. from tensorflow.keras.models import Sequential
  3. from tensorflow.keras.layers import Dense, Flatten, Input
  4. from sklearn.preprocessing import StandardScaler
  5. from sklearn.metrics import confusion_matrix
  6. from sklearn.utils.class_weight import compute_class_weight
  7. import matplotlib.pyplot as plt
  8. import seaborn as sns
  9. import scipy.stats as st
  10.  
  11. # Training data
  12. train_data = np.array([
  13.     [332, 1], [289, 1], [250, 1], [91, 1], [-91, 1], [-206, 1], [-206, 1],
  14.     [-228, 1], [-239, 1], [-256, 1], [-266, 1], [-278, 1], [-279, 1],
  15.     [-289, 1], [-297, 1], [-297, 1], [-311, 1], [-312, 1], [-324, 1],
  16.     [-348, 1], [-396, 1], [-509, 1], [-521, 1], [-526, 1], [-550, 1],
  17.     [-606, 1], [-633, 1], [-728, 1], [550, 0], [385, 0], [341, 0], [289, 0],
  18.     [228, 0], [137, 0], [110, 0], [75, 0], [-33, 0], [-70, 0], [-226, 0],
  19.     [-251, 0], [-263, 0], [-273, 0], [-280, 0], [-390, 0], [-440, 0],
  20.     [792, 0], [757, 0], [718, 0], [591, 0], [585, 0], [578, 0], [524, 0],
  21.     [512, 0], [463, 0], [455, 0], [431, 0], [421, 0], [396, 0], [387, 0],
  22.     [386, 0], [379, 0], [370, 0], [361, 0], [341, 0], [339, 0], [338, 0],
  23.     [328, 0], [323, 0], [307, 0], [303, 0], [288, 0], [284, 0], [282, 0],
  24.     [277, 0], [232, 0], [164, 0], [131, 0], [108, 0], [35, 0], [8, 0],
  25.     [-87, 0], [-228, 0], [-230, 0], [-276, 0], [-347, 0], [-367, 0],
  26.     [-543, 0], [294, 1], [284, 1], [104, 1], [-186, 1], [-238, 1], [-262, 1],
  27.     [-280, 1], [-325, 1], [-326, 1], [-384, 1], [-422, 1], [-498, 1],
  28.     [390, 0], [266, 0], [-297, 0], [-331, 0], [585, 0], [531, 0], [520, 0],
  29.     [465, 0], [251, 0], [133, 0], [55, 0], [-228, 0], [-248, 0], [-306, 0]
  30. ])
  31.  
  32. # Test data
  33. test_data = np.array([
  34.     [559, 1], [359, 1], [191, 1], [-62, 1], [-177, 1], [-199, 1],
  35.     [-261, 1], [-265, 1], [-298, 1], [-300, 1], [-301, 1], [-318, 1],
  36.     [-321, 1], [-368, 1], [-393, 1], [-469, 1], [-513, 1], [-584, 1],
  37.     [-586, 1], [-745, 1], [-960, 1], [376, 0], [329, 0], [756, 0], [562, 0],
  38.     [511, 0], [445, 0], [402, 0], [341, 0], [340, 0], [312, 0], [305, 0],
  39.     [264, 0], [-216, 0], [231, 1], [208, 1], [155, 1], [-200, 1], [-258, 1],
  40.     [-364, 1], [-566, 1], [414, 0], [-240, 0], [599, 0], [521, 0], [428, 0],
  41.     [415, 0], [337, 0]
  42. ])
  43.  
  44. # Rozdělení na vstupy (X) a výstupy (y)
  45. X_train = train_data[:, 0].reshape(-1, 1)
  46. y_train = train_data[:, 1]
  47. X_test = test_data[:, 0].reshape(-1, 1)
  48. y_test = test_data[:, 1]
  49.  
  50. # Normalizace dat pomocí Z-score
  51. scaler = StandardScaler()
  52. X_train = scaler.fit_transform(X_train)
  53. X_test = scaler.transform(X_test)
  54.  
  55. # Výpočet váhy tříd
  56. class_weights = compute_class_weight(class_weight='balanced', classes=np.unique(y_train), y=y_train)
  57. class_weight_dict = dict(enumerate(class_weights))
  58.  
  59. # Definování DNN modelu
  60. dnn_model = Sequential([
  61.     Input(shape=(1,)),  # Vstupní vrstva
  62.     Dense(64, activation='relu'),  # První skrytá vrstva
  63.     Dense(32, activation='relu'),  # Druhá skrytá vrstva
  64.     Dense(16, activation='relu'),  # Třetí skrytá vrstva
  65.     Dense(8, activation='relu'),   # Čtvrtá skrytá vrstva
  66.     Dense(1, activation='sigmoid')  # Výstupní vrstva
  67. ])
  68.  
  69. # Kompilace DNN modelu s použitím class_weight
  70. dnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  71.  
  72. # Trénování DNN modelu s použitím class_weight
  73. dnn_model.fit(X_train, y_train, epochs=200, batch_size=10, verbose=0, class_weight=class_weight_dict)
  74.  
  75. # Predikce pravděpodobností pro testovací sadu pomocí DNN
  76. y_probs_dnn = dnn_model.predict(X_test)
  77.  
  78. # Změna prahové hodnoty pro rozhodnutí
  79. threshold = 0.5  # Experimentujte s různými hodnotami
  80. y_pred_dnn = (y_probs_dnn > threshold).astype("int32")
  81.  
  82. # Vyhodnocení modelu pomocí confusion matrix (testovací data)
  83. conf_matrix_dnn = confusion_matrix(y_test, y_pred_dnn)
  84. plt.figure(figsize=(10, 7))
  85. sns.heatmap(conf_matrix_dnn, annot=True, fmt='d', cmap='Blues')
  86. plt.title('Konfuzní Matice s Váhou Tříd a Úpravou Prahové Hodnoty (DNN) - Testovací data')
  87. plt.ylabel('Skutečný Štítek')
  88. plt.xlabel('Predikovaný Štítek')
  89. plt.show()
  90.  
  91. # Vyhodnocení modelu pomocí confusion matrix (trénovací data)
  92. y_probs_train_dnn = dnn_model.predict(X_train)
  93. y_pred_train_dnn = (y_probs_train_dnn > threshold).astype("int32")
  94. conf_matrix_train_dnn = confusion_matrix(y_train, y_pred_train_dnn)
  95. plt.figure(figsize=(10, 7))
  96. sns.heatmap(conf_matrix_train_dnn, annot=True, fmt='d', cmap='Greens')
  97. plt.title('Konfuzní Matice s Váhou Tříd a Úpravou Prahové Hodnoty (DNN) - Trénovací data')
  98. plt.ylabel('Skutečný Štítek')
  99. plt.xlabel('Predikovaný Štítek')
  100. plt.show()
  101.  
  102. # Výpočet konfidenčního intervalu pro predikované pravděpodobnosti (DNN)
  103. mean_prob_dnn = np.mean(y_probs_dnn)
  104. ci_lower_dnn, ci_upper_dnn = st.t.interval(0.85, len(y_probs_dnn)-1, loc=mean_prob_dnn, scale=st.sem(y_probs_dnn))
  105.  
  106. # Oprava chyby s formátováním
  107. ci_lower_dnn, ci_upper_dnn = ci_lower_dnn.item(), ci_upper_dnn.item()
  108.  
  109. # Vykreslení pravděpodobnosti výhry s konfidenčním intervalem (DNN)
  110. plt.figure(figsize=(8, 6))
  111. plt.hist(y_probs_dnn, bins=20, color='skyblue', edgecolor='black', alpha=0.7)
  112. plt.axvline(x=mean_prob_dnn, color='red', linestyle='--', label=f'Mean Probability: {mean_prob_dnn:.2f}')
  113. plt.axvspan(ci_lower_dnn, ci_upper_dnn, color='orange', alpha=0.3, label=f'85% CI: [{ci_lower_dnn:.2f}, {ci_upper_dnn:.2f}]')
  114. plt.title('Pravděpodobnost Výhry s 85% Konfidenčním Intervalem (DNN)')
  115. plt.xlabel('Predikovaná Pravděpodobnost')
  116. plt.ylabel('Frekvence')
  117. plt.legend()
  118. plt.show()
  119.  
  120. # Přidání rozměru pro CNN
  121. X_train_cnn = X_train.reshape(-1, 1, 1)
  122. X_test_cnn = X_test.reshape(-1, 1, 1)
  123.  
  124. # Definování CNN modelu
  125. cnn_model = Sequential([
  126.     Input(shape=(1, 1)),  # Vstupní vrstva
  127.     Flatten(),  # Plochý vstup
  128.     Dense(64, activation='relu'),  # První hustá vrstva
  129.     Dense(32, activation='relu'),  # Druhá hustá vrstva
  130.     Dense(16, activation='relu'),  # Třetí hustá vrstva
  131.     Dense(8, activation='relu'),   # Čtvrtá hustá vrstva
  132.     Dense(1, activation='sigmoid')  # Výstupní vrstva
  133. ])
  134.  
  135. # Kompilace CNN modelu
  136. cnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  137.  
  138. # Trénování CNN modelu
  139. cnn_model.fit(X_train_cnn, y_train, epochs=200, verbose=0, class_weight=class_weight_dict)
  140.  
  141. # Vyhodnocení modelu na testovacích datech
  142. _, accuracy_cnn = cnn_model.evaluate(X_test_cnn, y_test)
  143. print(f'CNN Test Accuracy: {accuracy_cnn:.2f}')
  144.  
  145. # Predikce pravděpodobností pro testovací sadu pomocí CNN
  146. y_pred_probs_cnn = cnn_model.predict(X_test_cnn).flatten()
  147. y_pred_cnn = (y_pred_probs_cnn > threshold).astype("int32")
  148.  
  149. # Vyhodnocení modelu pomocí confusion matrix (trénovací data)
  150. y_probs_train_cnn = cnn_model.predict(X_train_cnn).flatten()
  151. y_pred_train_cnn = (y_probs_train_cnn > threshold).astype("int32")
  152. conf_matrix_train_cnn = confusion_matrix(y_train, y_pred_train_cnn)
  153. plt.figure(figsize=(10, 7))
  154. sns.heatmap(conf_matrix_train_cnn, annot=True, fmt='d', cmap='Greens')
  155. plt.title('Konfuzní Matice s Váhou Tříd a Úpravou Prahové Hodnoty (CNN) - Trénovací data')
  156. plt.ylabel('Skutečný Štítek')
  157. plt.xlabel('Predikovaný Štítek')
  158. plt.show()
  159.  
  160. # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) s obarvením
  161. plt.figure(figsize=(10, 5))
  162. for i in range(len(y_test)):
  163.     if y_test[i] == 1 and y_pred_dnn[i] == 1:
  164.         plt.scatter(X_test[i], y_probs_dnn[i], color='yellow', s=100, marker='o', label='TP' if i == 0 else "")
  165.     elif y_test[i] == 0 and y_pred_dnn[i] == 0:
  166.         plt.scatter(X_test[i], y_probs_dnn[i], color='green', s=100, marker='o', label='TN' if i == 0 else "")
  167.     elif y_test[i] == 0 and y_pred_dnn[i] == 1:
  168.         plt.scatter(X_test[i], y_probs_dnn[i], color='red', s=100, marker='o', label='FP' if i == 0 else "")
  169.     elif y_test[i] == 1 and y_pred_dnn[i] == 0:
  170.         plt.scatter(X_test[i], y_probs_dnn[i], color='blue', s=100, marker='o', label='FN' if i == 0 else "")
  171.  
  172. plt.title('Rozdíl ELO vs. Pravděpodobnost Výhry (DNN)')
  173. plt.xlabel('Rozdíl ELO')
  174. plt.ylabel('Predikovaná Pravděpodobnost')
  175. plt.legend(loc='upper left')  # Přidání legendy
  176. plt.grid(True)
  177. plt.show()
  178.  
  179. # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) s obarvením
  180. plt.figure(figsize=(10, 5))
  181. for i in range(len(y_test)):
  182.     if y_test[i] == 1 and y_pred_cnn[i] == 1:
  183.         plt.scatter(X_test[i], y_pred_probs_cnn[i], color='yellow', s=100, marker='o', label='TP' if i == 0 else "")
  184.     elif y_test[i] == 0 and y_pred_cnn[i] == 0:
  185.         plt.scatter(X_test[i], y_pred_probs_cnn[i], color='green', s=100, marker='o', label='TN' if i == 0 else "")
  186.     elif y_test[i] == 0 and y_pred_cnn[i] == 1:
  187.         plt.scatter(X_test[i], y_pred_probs_cnn[i], color='red', s=100, marker='o', label='FP' if i == 0 else "")
  188.     elif y_test[i] == 1 and y_pred_cnn[i] == 0:
  189.         plt.scatter(X_test[i], y_pred_probs_cnn[i], color='blue', s=100, marker='o', label='FN' if i == 0 else "")
  190.  
  191. plt.title('Rozdíl ELO vs. Pravděpodobnost Výhry (CNN)')
  192. plt.xlabel('Rozdíl ELO')
  193. plt.ylabel('Predikovaná Pravděpodobnost')
  194. plt.legend(loc='upper left')  # Přidání legendy
  195. plt.grid(True)
  196. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement