Advertisement
max2201111

Petr3 DNN a CNN CM train

Aug 20th, 2024 (edited)
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.62 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. from sklearn.preprocessing import PolynomialFeatures
  11. from sklearn.linear_model import LinearRegression
  12.  
  13. # Training data
  14. train_data = np.array([
  15.     [332, 1], [289, 1], [250, 1], [91, 1], [-91, 1], [-206, 1], [-206, 1],
  16.     [-228, 1], [-239, 1], [-256, 1], [-266, 1], [-278, 1], [-279, 1],
  17.     [-289, 1], [-297, 1], [-297, 1], [-311, 1], [-312, 1], [-324, 1],
  18.     [-348, 1], [-396, 1], [-509, 1], [-521, 1], [-526, 1], [-550, 1],
  19.     [-606, 1], [-633, 1], [-728, 1], [550, 0], [385, 0], [341, 0], [289, 0],
  20.     [228, 0], [137, 0], [110, 0], [75, 0], [-33, 0], [-70, 0], [-226, 0],
  21.     [-251, 0], [-263, 0], [-273, 0], [-280, 0], [-390, 0], [-440, 0],
  22.     [792, 0], [757, 0], [718, 0], [591, 0], [585, 0], [578, 0], [524, 0],
  23.     [512, 0], [463, 0], [455, 0], [431, 0], [421, 0], [396, 0], [387, 0],
  24.     [386, 0], [379, 0], [370, 0], [361, 0], [341, 0], [339, 0], [338, 0],
  25.     [328, 0], [323, 0], [307, 0], [303, 0], [288, 0], [284, 0], [282, 0],
  26.     [277, 0], [232, 0], [164, 0], [131, 0], [108, 0], [35, 0], [8, 0],
  27.     [-87, 0], [-228, 0], [-230, 0], [-276, 0], [-347, 0], [-367, 0],
  28.     [-543, 0], [294, 1], [284, 1], [104, 1], [-186, 1], [-238, 1], [-262, 1],
  29.     [-280, 1], [-325, 1], [-326, 1], [-384, 1], [-422, 1], [-498, 1],
  30.     [390, 0], [266, 0], [-297, 0], [-331, 0], [585, 0], [531, 0], [520, 0],
  31.     [465, 0], [251, 0], [133, 0], [55, 0], [-228, 0], [-248, 0], [-306, 0]
  32. ])
  33.  
  34. # Test data
  35. test_data = np.array([
  36.     [559, 1], [359, 1], [191, 1], [-62, 1], [-177, 1], [-199, 1],
  37.     [-261, 1], [-265, 1], [-298, 1], [-300, 1], [-301, 1], [-318, 1],
  38.     [-321, 1], [-368, 1], [-393, 1], [-469, 1], [-513, 1], [-584, 1],
  39.     [-586, 1], [-745, 1], [-960, 1], [376, 0], [329, 0], [756, 0], [562, 0],
  40.     [511, 0], [445, 0], [402, 0], [341, 0], [340, 0], [312, 0], [305, 0],
  41.     [264, 0], [-216, 0], [231, 1], [208, 1], [155, 1], [-200, 1], [-258, 1],
  42.     [-364, 1], [-566, 1], [414, 0], [-240, 0], [599, 0], [521, 0], [428, 0],
  43.     [415, 0], [337, 0]
  44. ])
  45.  
  46. # Rozdělení na vstupy (X) a výstupy (y)
  47. X_train = train_data[:, 0].reshape(-1, 1)
  48. y_train = train_data[:, 1]
  49. X_test = test_data[:, 0].reshape(-1, 1)
  50. y_test = test_data[:, 1]
  51.  
  52. # Normalizace dat pomocí Z-score
  53. scaler = StandardScaler()
  54. X_train = scaler.fit_transform(X_train)
  55. X_test = scaler.transform(X_test)
  56.  
  57. # Výpočet váhy tříd
  58. class_weights = compute_class_weight(class_weight='balanced', classes=np.unique(y_train), y=y_train)
  59. class_weight_dict = dict(enumerate(class_weights))
  60.  
  61. # Zvýšení složitosti DNN modelu
  62. dnn_model = Sequential([
  63.     Input(shape=(1,)),  # Vstupní vrstva
  64.     Dense(128, activation='relu'),  # První skrytá vrstva se zvýšeným počtem neuronů
  65.     Dense(64, activation='relu'),  # Druhá skrytá vrstva
  66.     Dense(32, activation='relu'),  # Třetí skrytá vrstva
  67.     Dense(16, activation='relu'),  # Čtvrtá skrytá vrstva
  68.     Dense(8, activation='relu'),   # Pátá skrytá vrstva
  69.     Dense(1, activation='sigmoid')  # Výstupní vrstva
  70. ])
  71.  
  72. # Kompilace DNN modelu s použitím class_weight
  73. dnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  74.  
  75. # Trénování DNN modelu s použitím class_weight
  76. dnn_model.fit(X_train, y_train, epochs=200, batch_size=10, verbose=0, class_weight=class_weight_dict)
  77.  
  78. # Predikce pravděpodobností pro testovací sadu pomocí DNN
  79. y_probs_dnn = dnn_model.predict(X_test)
  80.  
  81. # Predikce pravděpodobností pro trénovací sadu pomocí DNN
  82. y_probs_train_dnn = dnn_model.predict(X_train)
  83.  
  84. # Experimentování s různými prahovými hodnotami
  85. threshold = 0.5  # Použití threshold 0.5
  86.  
  87. # Predikce na základě prahu
  88. y_pred_dnn = (y_probs_dnn > threshold).astype("int32")
  89. y_pred_train_dnn = (y_probs_train_dnn > threshold).astype("int32")
  90.  
  91. # Vyhodnocení modelu pomocí confusion matrix (testovací data)
  92. conf_matrix_dnn = confusion_matrix(y_test, y_pred_dnn)
  93. plt.figure(figsize=(10, 7))
  94. sns.heatmap(conf_matrix_dnn, annot=True, fmt='d', cmap='Blues')
  95. plt.title(f'Konfuzní Matice (DNN) - Testovací data, Threshold: {threshold}')
  96. plt.ylabel('Skutečný Štítek')
  97. plt.xlabel('Predikovaný Štítek')
  98. plt.show()
  99.  
  100. # Vyhodnocení modelu pomocí confusion matrix (trénovací data)
  101. conf_matrix_train_dnn = confusion_matrix(y_train, y_pred_train_dnn)
  102. plt.figure(figsize=(10, 7))
  103. sns.heatmap(conf_matrix_train_dnn, annot=True, fmt='d', cmap='Greens')
  104. plt.title(f'Konfuzní Matice (DNN) - Trénovací data, Threshold: {threshold}')
  105. plt.ylabel('Skutečný Štítek')
  106. plt.xlabel('Predikovaný Štítek')
  107. plt.show()
  108.  
  109. # Výpočet konfidenčního intervalu pro predikované pravděpodobnosti (DNN)
  110. mean_prob_dnn = np.mean(y_probs_dnn)
  111. 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))
  112.  
  113. # Oprava chyby s formátováním
  114. ci_lower_dnn, ci_upper_dnn = ci_lower_dnn.item(), ci_upper_dnn.item()
  115.  
  116. # Vykreslení pravděpodobnosti výhry s konfidenčním intervalem (DNN)
  117. plt.figure(figsize=(8, 6))
  118. plt.hist(y_probs_dnn, bins=20, color='skyblue', edgecolor='black', alpha=0.7)
  119. plt.axvline(x=mean_prob_dnn, color='red', linestyle='--', label=f'Mean Probability: {mean_prob_dnn:.2f}')
  120. 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}]')
  121. plt.title('Pravděpodobnost Výhry s 85% Konfidenčním Intervalem (DNN)')
  122. plt.xlabel('Predikovaná Pravděpodobnost')
  123. plt.ylabel('Frekvence')
  124. plt.legend()
  125. plt.show()
  126.  
  127. # Denormalizace rozdílu ELO pro grafy
  128. X_train_denorm = scaler.inverse_transform(X_train)
  129. X_test_denorm = scaler.inverse_transform(X_test)
  130.  
  131. # Přidání rozměru pro CNN
  132. X_train_cnn = X_train.reshape(-1, 1, 1)
  133. X_test_cnn = X_test.reshape(-1, 1, 1)
  134.  
  135. # Definování CNN modelu
  136. cnn_model = Sequential([
  137.     Input(shape=(1, 1)),  # Vstupní vrstva
  138.     Flatten(),  # Plochý vstup
  139.     Dense(128, activation='relu'),  # První hustá vrstva
  140.     Dense(64, activation='relu'),  # Druhá hustá vrstva
  141.     Dense(32, activation='relu'),  # Třetí hustá vrstva
  142.     Dense(16, activation='relu'),  # Čtvrtá hustá vrstva
  143.     Dense(8, activation='relu'),   # Pátá hustá vrstva
  144.     Dense(1, activation='sigmoid')  # Výstupní vrstva
  145. ])
  146.  
  147. # Kompilace CNN modelu
  148. cnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  149.  
  150. # Trénování CNN modelu
  151. cnn_model.fit(X_train_cnn, y_train, epochs=200, verbose=0, class_weight=class_weight_dict)
  152.  
  153. # Predikce pravděpodobností pro testovací sadu pomocí CNN
  154. y_pred_probs_cnn = cnn_model.predict(X_test_cnn).flatten()
  155. y_pred_cnn = (y_pred_probs_cnn > 0.5).astype("int32")
  156.  
  157. # Predikce pravděpodobností pro trénovací sadu pomocí CNN
  158. y_pred_probs_train_cnn = cnn_model.predict(X_train_cnn).flatten()
  159. y_pred_train_cnn = (y_pred_probs_train_cnn > 0.5).astype("int32")
  160.  
  161. # Vyhodnocení modelu pomocí confusion matrix (trénovací data)
  162. conf_matrix_train_cnn = confusion_matrix(y_train, y_pred_train_cnn)
  163. plt.figure(figsize=(10, 7))
  164. sns.heatmap(conf_matrix_train_cnn, annot=True, fmt='d', cmap='Greens')
  165. plt.title('Konfuzní Matice (CNN) - Trénovací data, Threshold: 0.5')
  166. plt.ylabel('Skutečný Štítek')
  167. plt.xlabel('Predikovaný Štítek')
  168. plt.show()
  169.  
  170. # Funkce pro proložení hladké polynomiální křivky
  171. def plot_polynomial_curve(x, y, ax, degree=3):
  172.     # Seřadit podle hodnoty x
  173.     sorted_indices = np.argsort(x.flatten())
  174.     x_sorted = x.flatten()[sorted_indices]
  175.     y_sorted = y.flatten()[sorted_indices]
  176.    
  177.     # Polynomiální fit
  178.     poly = PolynomialFeatures(degree=degree)
  179.     x_poly = poly.fit_transform(x_sorted.reshape(-1, 1))
  180.    
  181.     model = LinearRegression()
  182.     model.fit(x_poly, y_sorted)
  183.    
  184.     # Predikce pomocí polynomiálního modelu
  185.     y_poly_pred = model.predict(x_poly)
  186.    
  187.     # Vykreslení křivky
  188.     ax.plot(x_sorted, y_poly_pred, '-.', color='green', linewidth=1)
  189.  
  190. # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) s obarvením a legendou pro testovací data
  191. fig, ax = plt.subplots(figsize=(10, 5))
  192. ax.scatter([], [], color='yellow', s=100, label='TP')  # Přidání TP do legendy
  193. ax.scatter([], [], color='green', s=100, label='TN')   # Přidání TN do legendy
  194. ax.scatter([], [], color='red', s=100, label='FP')     # Přidání FP do legendy
  195. ax.scatter([], [], color='blue', s=100, label='FN')    # Přidání FN do legendy
  196.  
  197. for i in range(len(y_test)):
  198.     if y_test[i] == 1 and y_pred_dnn[i] == 1:
  199.         ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='yellow', s=100, marker='o')
  200.     elif y_test[i] == 0 and y_pred_dnn[i] == 0:
  201.         ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='green', s=100, marker='o')
  202.     elif y_test[i] == 0 and y_pred_dnn[i] == 1:
  203.         ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='red', s=100, marker='o')
  204.     elif y_test[i] == 1 and y_pred_dnn[i] == 0:
  205.         ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='blue', s=100, marker='o')
  206.  
  207. plot_polynomial_curve(X_test_denorm, y_probs_dnn, ax)
  208.  
  209. ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) - Testovací data')
  210. ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
  211. ax.set_ylabel('Predikovaná Pravděpodobnost')
  212. ax.legend(loc='upper left')
  213. ax.grid(True)
  214. plt.show()
  215.  
  216. # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) s obarvením a legendou pro testovací data
  217. fig, ax = plt.subplots(figsize=(10, 5))
  218. ax.scatter([], [], color='yellow', s=100, label='TP')  # Přidání TP do legendy
  219. ax.scatter([], [], color='green', s=100, label='TN')   # Přidání TN do legendy
  220. ax.scatter([], [], color='red', s=100, label='FP')     # Přidání FP do legendy
  221. ax.scatter([], [], color='blue', s=100, label='FN')    # Přidání FN do legendy
  222.  
  223. for i in range(len(y_test)):
  224.     if y_test[i] == 1 and y_pred_cnn[i] == 1:
  225.         ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='yellow', s=100, marker='o')
  226.     elif y_test[i] == 0 and y_pred_cnn[i] == 0:
  227.         ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='green', s=100, marker='o')
  228.     elif y_test[i] == 0 and y_pred_cnn[i] == 1:
  229.         ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='red', s=100, marker='o')
  230.     elif y_test[i] == 1 and y_pred_cnn[i] == 0:
  231.         ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='blue', s=100, marker='o')
  232.  
  233. plot_polynomial_curve(X_test_denorm, y_pred_probs_cnn, ax)
  234.  
  235. ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) - Testovací data')
  236. ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
  237. ax.set_ylabel('Predikovaná Pravděpodobnost')
  238. ax.legend(loc='upper left')
  239. ax.grid(True)
  240. plt.show()
  241.  
  242. # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) s obarvením a legendou pro trénovací data (podle labelů)
  243. fig, ax = plt.subplots(figsize=(10, 5))
  244. ax.scatter([], [], color='yellow', s=100, label='Label 1')  # Přidání labelu 1 do legendy
  245. ax.scatter([], [], color='green', s=100, label='Label 0')   # Přidání labelu 0 do legendy
  246.  
  247. for i in range(len(y_train)):
  248.     if y_train[i] == 1:
  249.         ax.scatter(X_train_denorm[i], y_probs_train_dnn[i], color='yellow', s=100, marker='o')
  250.     elif y_train[i] == 0:
  251.         ax.scatter(X_train_denorm[i], y_probs_train_dnn[i], color='green', s=100, marker='o')
  252.  
  253. plot_polynomial_curve(X_train_denorm, y_probs_train_dnn, ax)
  254.  
  255. ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) - Trénovací data')
  256. ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
  257. ax.set_ylabel('Predikovaná Pravděpodobnost')
  258. ax.legend(loc='upper left')
  259. ax.grid(True)
  260. plt.show()
  261.  
  262. # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) s obarvením a legendou pro trénovací data (podle labelů)
  263. fig, ax = plt.subplots(figsize=(10, 5))
  264. ax.scatter([], [], color='yellow', s=100, label='Label 1')  # Přidání labelu 1 do legendy
  265. ax.scatter([], [], color='green', s=100, label='Label 0')   # Přidání labelu 0 do legendy
  266.  
  267. for i in range(len(y_train)):
  268.     if y_train[i] == 1:
  269.         ax.scatter(X_train_denorm[i], y_pred_probs_train_cnn[i], color='yellow', s=100, marker='o')
  270.     elif y_train[i] == 0:
  271.         ax.scatter(X_train_denorm[i], y_pred_probs_train_cnn[i], color='green', s=100, marker='o')
  272.  
  273. plot_polynomial_curve(X_train_denorm, y_pred_probs_train_cnn, ax)
  274.  
  275. ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) - Trénovací data')
  276. ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
  277. ax.set_ylabel('Predikovaná Pravděpodobnost')
  278. ax.legend(loc='upper left')
  279. ax.grid(True)
  280. plt.show()
  281.  
  282.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement