Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- from tensorflow.keras.models import Sequential
- from tensorflow.keras.layers import Dense, Flatten, Input
- from sklearn.preprocessing import StandardScaler
- from sklearn.metrics import confusion_matrix
- from sklearn.utils.class_weight import compute_class_weight
- import matplotlib.pyplot as plt
- import seaborn as sns
- import scipy.stats as st
- from sklearn.preprocessing import PolynomialFeatures
- from sklearn.linear_model import LinearRegression
- # Training data
- train_data = np.array([
- [332, 1], [289, 1], [250, 1], [91, 1], [-91, 1], [-206, 1], [-206, 1],
- [-228, 1], [-239, 1], [-256, 1], [-266, 1], [-278, 1], [-279, 1],
- [-289, 1], [-297, 1], [-297, 1], [-311, 1], [-312, 1], [-324, 1],
- [-348, 1], [-396, 1], [-509, 1], [-521, 1], [-526, 1], [-550, 1],
- [-606, 1], [-633, 1], [-728, 1], [550, 0], [385, 0], [341, 0], [289, 0],
- [228, 0], [137, 0], [110, 0], [75, 0], [-33, 0], [-70, 0], [-226, 0],
- [-251, 0], [-263, 0], [-273, 0], [-280, 0], [-390, 0], [-440, 0],
- [792, 0], [757, 0], [718, 0], [591, 0], [585, 0], [578, 0], [524, 0],
- [512, 0], [463, 0], [455, 0], [431, 0], [421, 0], [396, 0], [387, 0],
- [386, 0], [379, 0], [370, 0], [361, 0], [341, 0], [339, 0], [338, 0],
- [328, 0], [323, 0], [307, 0], [303, 0], [288, 0], [284, 0], [282, 0],
- [277, 0], [232, 0], [164, 0], [131, 0], [108, 0], [35, 0], [8, 0],
- [-87, 0], [-228, 0], [-230, 0], [-276, 0], [-347, 0], [-367, 0],
- [-543, 0], [294, 1], [284, 1], [104, 1], [-186, 1], [-238, 1], [-262, 1],
- [-280, 1], [-325, 1], [-326, 1], [-384, 1], [-422, 1], [-498, 1],
- [390, 0], [266, 0], [-297, 0], [-331, 0], [585, 0], [531, 0], [520, 0],
- [465, 0], [251, 0], [133, 0], [55, 0], [-228, 0], [-248, 0], [-306, 0]
- ])
- # Test data
- test_data = np.array([
- [559, 1], [359, 1], [191, 1], [-62, 1], [-177, 1], [-199, 1],
- [-261, 1], [-265, 1], [-298, 1], [-300, 1], [-301, 1], [-318, 1],
- [-321, 1], [-368, 1], [-393, 1], [-469, 1], [-513, 1], [-584, 1],
- [-586, 1], [-745, 1], [-960, 1], [376, 0], [329, 0], [756, 0], [562, 0],
- [511, 0], [445, 0], [402, 0], [341, 0], [340, 0], [312, 0], [305, 0],
- [264, 0], [-216, 0], [231, 1], [208, 1], [155, 1], [-200, 1], [-258, 1],
- [-364, 1], [-566, 1], [414, 0], [-240, 0], [599, 0], [521, 0], [428, 0],
- [415, 0], [337, 0]
- ])
- # Rozdělení na vstupy (X) a výstupy (y)
- X_train = train_data[:, 0].reshape(-1, 1)
- y_train = train_data[:, 1]
- X_test = test_data[:, 0].reshape(-1, 1)
- y_test = test_data[:, 1]
- # Normalizace dat pomocí Z-score
- scaler = StandardScaler()
- X_train = scaler.fit_transform(X_train)
- X_test = scaler.transform(X_test)
- # Výpočet váhy tříd
- class_weights = compute_class_weight(class_weight='balanced', classes=np.unique(y_train), y=y_train)
- class_weight_dict = dict(enumerate(class_weights))
- # Zvýšení složitosti DNN modelu
- dnn_model = Sequential([
- Input(shape=(1,)), # Vstupní vrstva
- Dense(128, activation='relu'), # První skrytá vrstva se zvýšeným počtem neuronů
- Dense(64, activation='relu'), # Druhá skrytá vrstva
- Dense(32, activation='relu'), # Třetí skrytá vrstva
- Dense(16, activation='relu'), # Čtvrtá skrytá vrstva
- Dense(8, activation='relu'), # Pátá skrytá vrstva
- Dense(1, activation='sigmoid') # Výstupní vrstva
- ])
- # Kompilace DNN modelu s použitím class_weight
- dnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
- # Trénování DNN modelu s použitím class_weight
- dnn_model.fit(X_train, y_train, epochs=200, batch_size=10, verbose=0, class_weight=class_weight_dict)
- # Predikce pravděpodobností pro testovací sadu pomocí DNN
- y_probs_dnn = dnn_model.predict(X_test)
- # Predikce pravděpodobností pro trénovací sadu pomocí DNN
- y_probs_train_dnn = dnn_model.predict(X_train)
- # Experimentování s různými prahovými hodnotami
- threshold = 0.5 # Použití threshold 0.5
- # Predikce na základě prahu
- y_pred_dnn = (y_probs_dnn > threshold).astype("int32")
- y_pred_train_dnn = (y_probs_train_dnn > threshold).astype("int32")
- # Vyhodnocení modelu pomocí confusion matrix (testovací data)
- conf_matrix_dnn = confusion_matrix(y_test, y_pred_dnn)
- plt.figure(figsize=(10, 7))
- sns.heatmap(conf_matrix_dnn, annot=True, fmt='d', cmap='Blues')
- plt.title(f'Konfuzní Matice (DNN) - Testovací data, Threshold: {threshold}')
- plt.ylabel('Skutečný Štítek')
- plt.xlabel('Predikovaný Štítek')
- plt.show()
- # Vyhodnocení modelu pomocí confusion matrix (trénovací data)
- conf_matrix_train_dnn = confusion_matrix(y_train, y_pred_train_dnn)
- plt.figure(figsize=(10, 7))
- sns.heatmap(conf_matrix_train_dnn, annot=True, fmt='d', cmap='Greens')
- plt.title(f'Konfuzní Matice (DNN) - Trénovací data, Threshold: {threshold}')
- plt.ylabel('Skutečný Štítek')
- plt.xlabel('Predikovaný Štítek')
- plt.show()
- # Výpočet konfidenčního intervalu pro predikované pravděpodobnosti (DNN)
- mean_prob_dnn = np.mean(y_probs_dnn)
- 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))
- # Oprava chyby s formátováním
- ci_lower_dnn, ci_upper_dnn = ci_lower_dnn.item(), ci_upper_dnn.item()
- # Vykreslení pravděpodobnosti výhry s konfidenčním intervalem (DNN)
- plt.figure(figsize=(8, 6))
- plt.hist(y_probs_dnn, bins=20, color='skyblue', edgecolor='black', alpha=0.7)
- plt.axvline(x=mean_prob_dnn, color='red', linestyle='--', label=f'Mean Probability: {mean_prob_dnn:.2f}')
- 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}]')
- plt.title('Pravděpodobnost Výhry s 85% Konfidenčním Intervalem (DNN)')
- plt.xlabel('Predikovaná Pravděpodobnost')
- plt.ylabel('Frekvence')
- plt.legend()
- plt.show()
- # Denormalizace rozdílu ELO pro grafy
- X_train_denorm = scaler.inverse_transform(X_train)
- X_test_denorm = scaler.inverse_transform(X_test)
- # Přidání rozměru pro CNN
- X_train_cnn = X_train.reshape(-1, 1, 1)
- X_test_cnn = X_test.reshape(-1, 1, 1)
- # Definování CNN modelu
- cnn_model = Sequential([
- Input(shape=(1, 1)), # Vstupní vrstva
- Flatten(), # Plochý vstup
- Dense(128, activation='relu'), # První hustá vrstva
- Dense(64, activation='relu'), # Druhá hustá vrstva
- Dense(32, activation='relu'), # Třetí hustá vrstva
- Dense(16, activation='relu'), # Čtvrtá hustá vrstva
- Dense(8, activation='relu'), # Pátá hustá vrstva
- Dense(1, activation='sigmoid') # Výstupní vrstva
- ])
- # Kompilace CNN modelu
- cnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
- # Trénování CNN modelu
- cnn_model.fit(X_train_cnn, y_train, epochs=200, verbose=0, class_weight=class_weight_dict)
- # Predikce pravděpodobností pro testovací sadu pomocí CNN
- y_pred_probs_cnn = cnn_model.predict(X_test_cnn).flatten()
- y_pred_cnn = (y_pred_probs_cnn > 0.5).astype("int32")
- # Predikce pravděpodobností pro trénovací sadu pomocí CNN
- y_pred_probs_train_cnn = cnn_model.predict(X_train_cnn).flatten()
- y_pred_train_cnn = (y_pred_probs_train_cnn > 0.5).astype("int32")
- # Vyhodnocení modelu pomocí confusion matrix (trénovací data)
- conf_matrix_train_cnn = confusion_matrix(y_train, y_pred_train_cnn)
- plt.figure(figsize=(10, 7))
- sns.heatmap(conf_matrix_train_cnn, annot=True, fmt='d', cmap='Greens')
- plt.title('Konfuzní Matice (CNN) - Trénovací data, Threshold: 0.5')
- plt.ylabel('Skutečný Štítek')
- plt.xlabel('Predikovaný Štítek')
- plt.show()
- # Funkce pro proložení hladké polynomiální křivky
- def plot_polynomial_curve(x, y, ax, degree=3):
- # Seřadit podle hodnoty x
- sorted_indices = np.argsort(x.flatten())
- x_sorted = x.flatten()[sorted_indices]
- y_sorted = y.flatten()[sorted_indices]
- # Polynomiální fit
- poly = PolynomialFeatures(degree=degree)
- x_poly = poly.fit_transform(x_sorted.reshape(-1, 1))
- model = LinearRegression()
- model.fit(x_poly, y_sorted)
- # Predikce pomocí polynomiálního modelu
- y_poly_pred = model.predict(x_poly)
- # Vykreslení křivky
- ax.plot(x_sorted, y_poly_pred, '-.', color='green', linewidth=1)
- # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) s obarvením a legendou pro testovací data
- fig, ax = plt.subplots(figsize=(10, 5))
- ax.scatter([], [], color='yellow', s=100, label='TP') # Přidání TP do legendy
- ax.scatter([], [], color='green', s=100, label='TN') # Přidání TN do legendy
- ax.scatter([], [], color='red', s=100, label='FP') # Přidání FP do legendy
- ax.scatter([], [], color='blue', s=100, label='FN') # Přidání FN do legendy
- for i in range(len(y_test)):
- if y_test[i] == 1 and y_pred_dnn[i] == 1:
- ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='yellow', s=100, marker='o')
- elif y_test[i] == 0 and y_pred_dnn[i] == 0:
- ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='green', s=100, marker='o')
- elif y_test[i] == 0 and y_pred_dnn[i] == 1:
- ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='red', s=100, marker='o')
- elif y_test[i] == 1 and y_pred_dnn[i] == 0:
- ax.scatter(X_test_denorm[i], y_probs_dnn[i], color='blue', s=100, marker='o')
- plot_polynomial_curve(X_test_denorm, y_probs_dnn, ax)
- ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) - Testovací data')
- ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
- ax.set_ylabel('Predikovaná Pravděpodobnost')
- ax.legend(loc='upper left')
- ax.grid(True)
- plt.show()
- # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) s obarvením a legendou pro testovací data
- fig, ax = plt.subplots(figsize=(10, 5))
- ax.scatter([], [], color='yellow', s=100, label='TP') # Přidání TP do legendy
- ax.scatter([], [], color='green', s=100, label='TN') # Přidání TN do legendy
- ax.scatter([], [], color='red', s=100, label='FP') # Přidání FP do legendy
- ax.scatter([], [], color='blue', s=100, label='FN') # Přidání FN do legendy
- for i in range(len(y_test)):
- if y_test[i] == 1 and y_pred_cnn[i] == 1:
- ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='yellow', s=100, marker='o')
- elif y_test[i] == 0 and y_pred_cnn[i] == 0:
- ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='green', s=100, marker='o')
- elif y_test[i] == 0 and y_pred_cnn[i] == 1:
- ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='red', s=100, marker='o')
- elif y_test[i] == 1 and y_pred_cnn[i] == 0:
- ax.scatter(X_test_denorm[i], y_pred_probs_cnn[i], color='blue', s=100, marker='o')
- plot_polynomial_curve(X_test_denorm, y_pred_probs_cnn, ax)
- ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) - Testovací data')
- ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
- ax.set_ylabel('Predikovaná Pravděpodobnost')
- ax.legend(loc='upper left')
- ax.grid(True)
- plt.show()
- # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) s obarvením a legendou pro trénovací data (podle labelů)
- fig, ax = plt.subplots(figsize=(10, 5))
- ax.scatter([], [], color='yellow', s=100, label='Label 1') # Přidání labelu 1 do legendy
- ax.scatter([], [], color='green', s=100, label='Label 0') # Přidání labelu 0 do legendy
- for i in range(len(y_train)):
- if y_train[i] == 1:
- ax.scatter(X_train_denorm[i], y_probs_train_dnn[i], color='yellow', s=100, marker='o')
- elif y_train[i] == 0:
- ax.scatter(X_train_denorm[i], y_probs_train_dnn[i], color='green', s=100, marker='o')
- plot_polynomial_curve(X_train_denorm, y_probs_train_dnn, ax)
- ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (DNN) - Trénovací data')
- ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
- ax.set_ylabel('Predikovaná Pravděpodobnost')
- ax.legend(loc='upper left')
- ax.grid(True)
- plt.show()
- # Vykreslení grafu Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) s obarvením a legendou pro trénovací data (podle labelů)
- fig, ax = plt.subplots(figsize=(10, 5))
- ax.scatter([], [], color='yellow', s=100, label='Label 1') # Přidání labelu 1 do legendy
- ax.scatter([], [], color='green', s=100, label='Label 0') # Přidání labelu 0 do legendy
- for i in range(len(y_train)):
- if y_train[i] == 1:
- ax.scatter(X_train_denorm[i], y_pred_probs_train_cnn[i], color='yellow', s=100, marker='o')
- elif y_train[i] == 0:
- ax.scatter(X_train_denorm[i], y_pred_probs_train_cnn[i], color='green', s=100, marker='o')
- plot_polynomial_curve(X_train_denorm, y_pred_probs_train_cnn, ax)
- ax.set_title('Rozdíl ELO vs. Pravděpodobnost Výhry (CNN) - Trénovací data')
- ax.set_xlabel('Rozdíl ELO (Denormalizováno)')
- ax.set_ylabel('Predikovaná Pravděpodobnost')
- ax.legend(loc='upper left')
- ax.grid(True)
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement