|
a |
|
b/python/basic_fusion.py |
|
|
1 |
#!/usr/bin/env python |
|
|
2 |
|
|
|
3 |
""" |
|
|
4 |
basic_fusion.py |
|
|
5 |
|
|
|
6 |
VARPA, University of Coruna |
|
|
7 |
Mondejar Guerra, Victor M. |
|
|
8 |
30 Oct 2017 |
|
|
9 |
""" |
|
|
10 |
|
|
|
11 |
from train_SVM import * |
|
|
12 |
|
|
|
13 |
# Compute the basic rule from the list of probs |
|
|
14 |
# selected by rule index: |
|
|
15 |
# 0 = product |
|
|
16 |
# 1 = sum |
|
|
17 |
# 2 = minimum |
|
|
18 |
# 3 = minimum |
|
|
19 |
# 4 = majority |
|
|
20 |
# and return the predictions |
|
|
21 |
|
|
|
22 |
def basic_rules(probs_ensemble, rule_index): |
|
|
23 |
|
|
|
24 |
n_ensembles, n_instances, n_classes = probs_ensemble.shape |
|
|
25 |
predictions_rule = np.zeros(n_instances) |
|
|
26 |
|
|
|
27 |
# Product rule |
|
|
28 |
if rule_index == 0: |
|
|
29 |
probs_rule = np.ones([n_instances, n_classes]) |
|
|
30 |
|
|
|
31 |
for p in range(n_instances): |
|
|
32 |
for e in range(n_ensembles): |
|
|
33 |
probs_rule[p] = probs_rule[p] * probs_ensemble[e,p] |
|
|
34 |
predictions_rule[p] = np.argmax(probs_rule[p]) |
|
|
35 |
|
|
|
36 |
# Sum rule |
|
|
37 |
elif rule_index == 1: |
|
|
38 |
probs_rule = np.zeros([n_instances, n_classes]) |
|
|
39 |
|
|
|
40 |
for p in range(n_instances): |
|
|
41 |
for e in range(n_ensembles): |
|
|
42 |
probs_rule[p] = probs_rule[p] + probs_ensemble[e,p] |
|
|
43 |
predictions_rule[p] = np.argmax(probs_rule[p]) |
|
|
44 |
|
|
|
45 |
# Minimum rule |
|
|
46 |
elif rule_index == 2: |
|
|
47 |
probs_rule = np.ones([n_instances, n_classes]) |
|
|
48 |
|
|
|
49 |
for p in range(n_instances): |
|
|
50 |
for e in range(n_ensembles): |
|
|
51 |
probs_rule[p] = np.minimum(probs_rule[p], probs_ensemble[e,p]) |
|
|
52 |
predictions_rule[p] = np.argmax(probs_rule[p]) |
|
|
53 |
|
|
|
54 |
# Maximum rule |
|
|
55 |
elif rule_index == 3: |
|
|
56 |
probs_rule = np.zeros([n_instances, n_classes]) |
|
|
57 |
|
|
|
58 |
for p in range(n_instances): |
|
|
59 |
for e in range(n_ensembles): |
|
|
60 |
probs_rule[p] = np.maximum(probs_rule[p], probs_ensemble[e,p]) |
|
|
61 |
predictions_rule[p] = np.argmax(probs_rule[p]) |
|
|
62 |
|
|
|
63 |
# Majority rule |
|
|
64 |
elif rule_index == 4: |
|
|
65 |
rank_rule = np.zeros([n_instances, n_classes]) |
|
|
66 |
# Just simply adds the position of the ranking |
|
|
67 |
for p in range(n_instances): |
|
|
68 |
|
|
|
69 |
for e in range(n_ensembles): |
|
|
70 |
rank = np.argsort(probs_ensemble[e,p]) |
|
|
71 |
for j in range(n_classes): |
|
|
72 |
rank_rule[p,rank[j]] = rank_rule[p,rank[j]] + j |
|
|
73 |
predictions_rule[p] = np.argmax(rank_rule[p]) |
|
|
74 |
|
|
|
75 |
return predictions_rule |
|
|
76 |
|
|
|
77 |
|
|
|
78 |
def main(): |
|
|
79 |
DS = 'DS2' |
|
|
80 |
print("Runing basic_fusion.py!" + DS) |
|
|
81 |
|
|
|
82 |
oversamp = '' #'', 'SMOTEENN/', 'SMOTE/', 'SMOTETomek/', 'ADASYN/' |
|
|
83 |
# Load gt labelso |
|
|
84 |
eval_labels = np.loadtxt('/home/mondejar/Dropbox/ECG/code/ecg_classification/python/mit_db/' + DS + '_labels.csv') |
|
|
85 |
|
|
|
86 |
# Configuration |
|
|
87 |
results_path = '/home/mondejar/Dropbox/ECG/code/ecg_classification/python/results/ovo/MLII/' |
|
|
88 |
|
|
|
89 |
if DS == 'DS2': |
|
|
90 |
model_RR = results_path + oversamp + 'rm_bsln/' + 'maxRR/' + 'RR/' + 'norm_RR/' + 'weighted/' + 'C_0.001' + '_decision_ovo.csv' |
|
|
91 |
model_wvl = results_path + oversamp + 'rm_bsln/' + 'maxRR/' + 'wvlt/' + 'weighted/' + 'C_0.001' + '_decision_ovo.csv' |
|
|
92 |
model_LBP = results_path + oversamp + 'rm_bsln/' + 'maxRR/' + 'lbp/' + 'weighted/' + 'C_0.001' + '_decision_ovo.csv' |
|
|
93 |
model_HOS = results_path + oversamp + 'rm_bsln/' + 'maxRR/' + 'HOS/' + 'weighted/' + 'C_0.001' + '_decision_ovo.csv' |
|
|
94 |
model_myDesc = results_path + oversamp + 'rm_bsln/' + 'maxRR/' + 'myMorph/' + 'weighted/' + 'C_0.001' + '_decision_ovo.csv' |
|
|
95 |
|
|
|
96 |
# Load Predictions! |
|
|
97 |
|
|
|
98 |
prob_ovo_RR = np.loadtxt(model_RR) |
|
|
99 |
prob_ovo_wvl = np.loadtxt(model_wvl) |
|
|
100 |
prob_ovo_LBP = np.loadtxt(model_LBP) |
|
|
101 |
prob_ovo_HOS = np.loadtxt(model_HOS) |
|
|
102 |
prob_ovo_MyDescp = np.loadtxt(model_myDesc) |
|
|
103 |
|
|
|
104 |
|
|
|
105 |
prob_ovo_HBF = np.loadtxt(model_HBF) |
|
|
106 |
|
|
|
107 |
predict, prob_ovo_RR_sig = ovo_voting_exp(prob_ovo_RR, 4) #voting_ovo_w(prob_ovo_RR) #voting_ovo_raw(prob_ovo_RR) |
|
|
108 |
predict, prob_ovo_wvl_sig = ovo_voting_exp(prob_ovo_wvl, 4) #voting_ovo_w(prob_ovo_wvl) #voting_ovo_raw(prob_ovo_wvl) |
|
|
109 |
predict, prob_ovo_LBP_sig = ovo_voting_exp(prob_ovo_LBP, 4) #voting_ovo_w(prob_ovo_HOS_myDesc) #voting_ovo_raw(prob_ovo_HOS_myDesc) |
|
|
110 |
predict, prob_ovo_HOS_sig = ovo_voting_exp(prob_ovo_HOS, 4) #voting_ovo_w(prob_ovo_HOS_myDesc) #voting_ovo_raw(prob_ovo_HOS_myDesc) |
|
|
111 |
predict, prob_ovo_MyDescp_sig = ovo_voting_exp(prob_ovo_MyDescp, 4) #voting_ovo_w(prob_ovo_HOS_myDesc) #voting_ovo_raw(prob_ovo_HOS_myDesc) |
|
|
112 |
|
|
|
113 |
predict, prob_ovo_HBF_sig = ovo_voting_exp(prob_ovo_HBF, 4) |
|
|
114 |
|
|
|
115 |
########################################################## |
|
|
116 |
# Combine the predictions! |
|
|
117 |
########################################################## |
|
|
118 |
# 2 |
|
|
119 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig)) |
|
|
120 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_HOS_sig)) |
|
|
121 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_LBP_sig)) |
|
|
122 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_MyDescp_sig)) |
|
|
123 |
|
|
|
124 |
#probs_ensemble = np.stack((prob_ovo_wvl_sig, prob_ovo_HOS_sig)) |
|
|
125 |
#probs_ensemble = np.stack((prob_ovo_wvl_sig, prob_ovo_LBP_sig)) |
|
|
126 |
#probs_ensemble = np.stack((prob_ovo_wvl_sig, prob_ovo_MyDescp_sig)) |
|
|
127 |
|
|
|
128 |
#probs_ensemble = np.stack((prob_ovo_HOS_sig, prob_ovo_LBP_sig)) |
|
|
129 |
#probs_ensemble = np.stack((prob_ovo_HOS_sig, prob_ovo_MyDescp_sig)) |
|
|
130 |
|
|
|
131 |
#probs_ensemble = np.stack((prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
132 |
|
|
|
133 |
# 3 |
|
|
134 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig, prob_ovo_HOS_sig)) |
|
|
135 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig, prob_ovo_LBP_sig)) |
|
|
136 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig, prob_ovo_MyDescp_sig)) |
|
|
137 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_HOS_sig, prob_ovo_LBP_sig)) |
|
|
138 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_HOS_sig, prob_ovo_MyDescp_sig)) |
|
|
139 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
140 |
|
|
|
141 |
#probs_ensemble = np.stack((prob_ovo_wvl_sig, prob_ovo_HOS_sig, prob_ovo_LBP_sig)) |
|
|
142 |
#probs_ensemble = np.stack((prob_ovo_wvl_sig, prob_ovo_HOS_sig, prob_ovo_MyDescp_sig)) |
|
|
143 |
#probs_ensemble = np.stack((prob_ovo_wvl_sig, prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
144 |
#probs_ensemble = np.stack((prob_ovo_HOS_sig, prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
145 |
|
|
|
146 |
# 4 |
|
|
147 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig, prob_ovo_HOS_sig, prob_ovo_LBP_sig)) |
|
|
148 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig, prob_ovo_HOS_sig, prob_ovo_MyDescp_sig)) |
|
|
149 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig, prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
150 |
#probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_HOS_sig, prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
151 |
#probs_ensemble = np.stack((prob_ovo_wvl_sig, prob_ovo_HOS_sig, prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
152 |
|
|
|
153 |
# 5 |
|
|
154 |
probs_ensemble = np.stack((prob_ovo_RR_sig, prob_ovo_wvl_sig, prob_ovo_HOS_sig, prob_ovo_LBP_sig, prob_ovo_MyDescp_sig)) |
|
|
155 |
|
|
|
156 |
n_ensembles, n_instances, n_classes = probs_ensemble.shape |
|
|
157 |
|
|
|
158 |
########################################### |
|
|
159 |
# product rule! |
|
|
160 |
predictions_prob_rule = basic_rules(probs_ensemble, 0) |
|
|
161 |
perf_measures = compute_AAMI_performance_measures(predictions_prob_rule.astype(int), eval_labels) |
|
|
162 |
write_AAMI_results( perf_measures, results_path + 'fusion/prod_rule_score_Ijk_' + str(format(perf_measures.Ijk, '.2f')) + '_' + DS + '.txt') |
|
|
163 |
|
|
|
164 |
########################################### |
|
|
165 |
# Sum rule! |
|
|
166 |
""" |
|
|
167 |
predictions_sum_rule = basic_rules(probs_ensemble, 1) |
|
|
168 |
perf_measures = compute_AAMI_performance_measures(predictions_sum_rule.astype(int), eval_labels) |
|
|
169 |
write_AAMI_results( perf_measures, results_path + 'fusion/sum_rule_score_Ijk_' + str(format(perf_measures.Ijk, '.2f')) + '_' + DS + '.txt') |
|
|
170 |
""" |
|
|
171 |
# min rule! |
|
|
172 |
""" |
|
|
173 |
predictions_min_rule = basic_rules(probs_ensemble, 2) |
|
|
174 |
perf_measures = compute_AAMI_performance_measures(predictions_min_rule.astype(int), eval_labels) |
|
|
175 |
write_AAMI_results( perf_measures, results_path + 'fusion/min_rule_score_Ijk_' + str(format(perf_measures.Ijk, '.2f')) + '_' + DS + '.txt') |
|
|
176 |
""" |
|
|
177 |
|
|
|
178 |
# max rule! |
|
|
179 |
""" |
|
|
180 |
predictions_max_rule = basic_rules(probs_ensemble, 3) |
|
|
181 |
perf_measures = compute_AAMI_performance_measures(predictions_max_rule.astype(int), eval_labels) |
|
|
182 |
write_AAMI_results( perf_measures, results_path + 'fusion/max_rule_score_Ijk_' + str(format(perf_measures.Ijk, '.2f')) + '_' + DS + '.txt') |
|
|
183 |
""" |
|
|
184 |
|
|
|
185 |
# Mayority rule / Ranking |
|
|
186 |
""" |
|
|
187 |
predictions_rank_rule = basic_rules(probs_ensemble, 4) |
|
|
188 |
perf_measures = compute_AAMI_performance_measures(predictions_rank_rule.astype(int), eval_labels) |
|
|
189 |
write_AAMI_results( perf_measures, results_path + 'fusion/rank_rule_score_Ijk_' + str(format(perf_measures.Ijk, '.2f')) + '_' + DS + '.txt') |
|
|
190 |
""" |
|
|
191 |
|
|
|
192 |
if __name__ == '__main__': |
|
|
193 |
|
|
|
194 |
import sys |
|
|
195 |
|
|
|
196 |
main() |