Advertisement
max2201111

petr6 OK

Aug 23rd, 2024
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.75 KB | Science | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
  4. from tensorflow.keras.models import Sequential
  5. from tensorflow.keras.layers import Dense, Dropout, Input, BatchNormalization
  6. from tensorflow.keras.optimizers import Adam
  7. from tensorflow.keras.regularizers import l2
  8. from scipy.optimize import curve_fit
  9. from sklearn.utils.class_weight import compute_class_weight
  10. from sklearn.preprocessing import StandardScaler
  11.  
  12. # Definice dat
  13. data = np.array([
  14.     [1141, 1050, 1], [1499, 1050, 0], [1451, 1077, 1], [1519, 1077, 1], [1191, 1093, 0],
  15.     [1590, 1093, 1], [1777, 1093, 0], [1141, 1124, 1], [1499, 1124, 0], [1601, 1124, 0],
  16.     [1606, 1141, 0], [1608, 1141, 0], [1870, 1141, 0], [1794, 1191, 0], [1329, 1211, 1],
  17.     [1687, 1211, 0], [1918, 1211, 0], [1608, 1212, 0], [1050, 1228, 0], [2107, 1228, 0],
  18.     [2202, 1266, 0], [1551, 1327, 0], [1608, 1327, 1], [1660, 1327, 0], [1329, 1332, 1],
  19.     [1093, 1346, 0], [1546, 1419, 1], [1327, 1435, 0], [1774, 1435, 0], [1794, 1451, 0],
  20.     [1077, 1458, 1], [1093, 1458, 1], [1731, 1458, 0], [1777, 1491, 0], [1212, 1499, 1],
  21.     [1211, 1519, 1], [1608, 1519, 1], [1918, 1519, 0], [1458, 1538, 1], [1918, 1538, 0],
  22.     [1794, 1545, 0], [1903, 1545, 0], [1435, 1546, 1], [1758, 1546, 0], [2076, 1546, 0],
  23.     [1077, 1551, 1], [1690, 1551, 0], [1050, 1590, 1], [1093, 1601, 1], [1327, 1601, 0],
  24.     [1050, 1606, 1], [1491, 1606, 1], [1519, 1608, 0], [1266, 1660, 1], [1839, 1660, 0],
  25.     [1332, 1687, 0], [1519, 1687, 0], [1538, 1690, 1], [1870, 1690, 0], [1903, 1731, 1],
  26.     [1918, 1731, 0], [1419, 1758, 0], [1839, 1758, 0], [1077, 1774, 1], [1519, 1774, 1],
  27.     [2202, 1774, 0], [1538, 1777, 0], [1903, 1777, 1], [2107, 1777, 0], [1660, 1794, 0],
  28.     [2107, 1794, 0], [1124, 1839, 1], [1519, 1839, 1], [1546, 1839, 1], [1870, 1839, 1],
  29.     [2202, 1839, 0], [1419, 1870, 1], [2107, 1870, 0], [2202, 1870, 0], [1191, 1903, 1],
  30.     [1601, 1903, 1], [1606, 1903, 1], [1660, 1903, 1], [1491, 1918, 1], [1212, 2076, 1],
  31.     [1690, 2076, 1], [1546, 2107, 1], [1903, 2107, 1], [2183, 2107, 0], [1229, 2183, 1],
  32.     [1731, 2183, 1], [1758, 2183, 0], [1918, 2183, 1], [2076, 2183, 0], [1538, 2202, 1],
  33.     [1601, 2202, 1], [2076, 2202, 0], [1660, 2258, 1], [1777, 2258, 0], [2202, 2258, 0]
  34. ])
  35.  
  36. X_train = data[:, :2]
  37. y_train = data[:, 2]
  38.  
  39. X_test = np.array([
  40.     [1451, 1050], [1758, 1050], [1346, 1211], [1546, 1332], [1608, 1451],
  41.     [1839, 1458], [1435, 1538], [1077, 1546], [2183, 1551], [1458, 1590],
  42.     [1538, 1606], [1077, 1608], [2258, 1608], [1419, 1690], [1545, 1731],
  43.     [1774, 1758], [1545, 1774], [2183, 1777], [1228, 1794], [1774, 1794],
  44.     [2258, 1870], [1546, 1903], [1774, 1918], [2076, 1918], [1758, 2076],
  45.     [1839, 2076], [2107, 2076], [2258, 2107], [1731, 2202], [1327, 2258]
  46. ])
  47.  
  48. y_test = np.array([0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0,
  49.                    1, 1, 0, 0, 1, 0, 1, 1, 1, 1])
  50.  
  51. # Standardizace vstupních dat
  52. scaler = StandardScaler()
  53. X_train_scaled = scaler.fit_transform(X_train)
  54. X_test_scaled = scaler.transform(X_test)
  55.  
  56. # Výpočet vah tříd pro vyrovnání nevyváženosti dat
  57. class_weights = compute_class_weight('balanced', classes=np.unique(y_train), y=y_train)
  58. class_weight_dict = dict(enumerate(class_weights))
  59.  
  60. # Definice vylepšeného modelu DNN
  61. def build_improved_model():
  62.     model = Sequential([
  63.         Input(shape=(2,)),
  64.         Dense(128, activation='relu', kernel_regularizer=l2(0.01)),
  65.         BatchNormalization(),
  66.         Dropout(0.3),
  67.         Dense(64, activation='relu', kernel_regularizer=l2(0.01)),
  68.         BatchNormalization(),
  69.         Dropout(0.3),
  70.         Dense(32, activation='relu', kernel_regularizer=l2(0.01)),
  71.         BatchNormalization(),
  72.         Dense(1, activation='sigmoid')
  73.     ])
  74.     return model
  75.  
  76. # Sestavení modelu
  77. model = build_improved_model()
  78. model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'])
  79.  
  80. # Trénink modelu s použitím vah tříd a větším počtem epoch
  81. history = model.fit(X_train_scaled, y_train, epochs=500, batch_size=32, validation_split=0.2, verbose=0, class_weight=class_weight_dict)
  82.  
  83. # Predikce pomocí modelu
  84. y_pred_train = model.predict(X_train_scaled)
  85. y_pred_test = model.predict(X_test_scaled)
  86.  
  87. # Určení optimálního thresholdu
  88. best_threshold = 0.5  # Můžete optimalizovat pomocí metod jako Optuna
  89.  
  90. # Vypočtení binárních predikcí podle optimálního thresholdu
  91. y_pred_test_binary = (y_pred_test > best_threshold).astype(int)
  92. y_test_binary = y_test.astype(int)
  93.  
  94. # Vytvoření confusion matrix
  95. cm = confusion_matrix(y_test_binary, y_pred_test_binary)
  96. disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Výhra 2. hráče', 'Výhra 1. hráče'])
  97.  
  98. # Vizualizace confusion matrix
  99. plt.figure(figsize=(10, 8))
  100. disp.plot(cmap='Blues', values_format='d')
  101. plt.title('Confusion Matrix')
  102. plt.show()
  103.  
  104. # Seřazení trénovacích dat podle prvního indexu
  105. sorted_indices = np.argsort(X_train[:, 0])
  106. X_train_sorted = X_train[sorted_indices]
  107. y_pred_train_sorted = y_pred_train[sorted_indices]
  108.  
  109. # Definice správné sigmoid funkce
  110. def sigmoid(x, L, x0, k, b):
  111.     return L / (1 + np.exp(-k * (x - x0))) + b
  112.  
  113. # Fitování sigmoid funkce
  114. p0 = [1, np.median(X_train_sorted[:, 0]), 0.005, 0]  # Počáteční odhad parametrů
  115. popt, _ = curve_fit(sigmoid, X_train_sorted[:, 0], y_pred_train_sorted.flatten(), p0, method='trf', maxfev=10000)
  116.  
  117. # Definice správně otočené ELO funkce
  118. def elo_probability(rating_diff):
  119.     return 1 - 1 / (1 + 10**(-rating_diff/400))
  120.  
  121. # Vytvoření grafu
  122. plt.figure(figsize=(12, 8))
  123.  
  124. # Vykreslení TP, TN, FP, FN
  125. tp = np.logical_and(y_train == 1, y_pred_train.flatten() > best_threshold)
  126. tn = np.logical_and(y_train == 0, y_pred_train.flatten() <= best_threshold)
  127. fp = np.logical_and(y_train == 0, y_pred_train.flatten() > best_threshold)
  128. fn = np.logical_and(y_train == 1, y_pred_train.flatten() <= best_threshold)
  129.  
  130. plt.scatter(X_train[tp, 0], y_pred_train[tp], c='green', label='Správně pozitivní', alpha=0.5)
  131. plt.scatter(X_train[tn, 0], y_pred_train[tn], c='blue', label='Správně negativní', alpha=0.5)
  132. plt.scatter(X_train[fp, 0], y_pred_train[fp], c='red', label='Falešně pozitivní', alpha=0.5)
  133. plt.scatter(X_train[fn, 0], y_pred_train[fn], c='orange', label='Falešně negativní', alpha=0.5)
  134.  
  135. # Vykreslení vyhlazené sigmoid funkce
  136. x_sigmoid = np.linspace(900, 2300, 1000)  # Rozšířený rozsah pro lepší zobrazení
  137. y_sigmoid = sigmoid(x_sigmoid, *popt)
  138. plt.plot(x_sigmoid, y_sigmoid, 'k-', label='Sigmoid fit', linewidth=2)
  139.  
  140. # Vykreslení správně otočené ELO křivky
  141. elo_diff = x_sigmoid - np.mean(X_train[:, 1])  # Rozdíl ELO vzhledem k průměrnému ELO druhého hráče
  142. y_elo = elo_probability(elo_diff)
  143. plt.plot(x_sigmoid, y_elo, 'b--', label='ELO model (otočený)', linewidth=3)
  144.  
  145. plt.xlabel('ELO prvního hráče')
  146. plt.ylabel('Pravděpodobnost výhry')
  147. plt.title('Pravděpodobnost výhry prvního hráče (trénovací data)')
  148. plt.legend()
  149. plt.grid(True)
  150. plt.ylim(-0.1, 1.1)  # Rozšíření rozsahu osy y pro lepší zobrazení
  151. plt.show()
  152.  
  153. # Vyhodnocení modelu
  154. test_loss, test_accuracy = model.evaluate(X_test_scaled, y_test)
  155. print(f'Přesnost na testovacích datech: {test_accuracy:.4f}')
  156.  
  157. # Výpis parametrů sigmoid funkce
  158. print(f'Parametry sigmoid funkce: L={popt[0]:.4f}, x0={popt[1]:.4f}, k={popt[2]:.4f}, b={popt[3]:.4f}')
  159.  
  160. # Výpis hodnot sigmoid funkce pro x=1000 a x=2200
  161. print(f'Hodnota sigmoid funkce pro x=1000: {sigmoid(1000, *popt):.4f}')
  162. print(f'Hodnota sigmoid funkce pro x=2200: {sigmoid(2200, *popt):.4f}')
  163.  
  164. # Výpis hodnot správně otočeného ELO modelu pro rozdíl 400 bodů
  165. print(f'Pravděpodobnost výhry podle správně otočeného ELO modelu pro rozdíl 400 bodů: {elo_probability(400):.4f}')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement