-
Notifications
You must be signed in to change notification settings - Fork 0
/
trainingProcess.py
98 lines (79 loc) · 3.24 KB
/
trainingProcess.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
from imputation import Imputation
from featureSelection import FeatureSelection
from missingPatterns import MissingPatterns
from weka.classifiers import Classifier, Evaluation
from weka.core.classes import Random
from weka.core.dataset import Instances
from myClassifier import MyClassifier
class Training():
"""
Núcleo da abordagem, classe responsavel por realizar o treinamento dos classificadores
por meio da imputação de dados para a seleção das caracteristicas, definindo os padrões ausentes
para que não seja necessário realizar a imputação dos dados no processo de aplicação
Parametros:
data -> weka.core.dataset.Instances
learn_class = algoritmo de treinamento dos classificadores (String)
options = configurações do algortimo de treinamento (List)
"""
def __init__(self, data, learn_class="weka.classifiers.trees.J48", options=["-C", "0.3"]):
# Instatinciação das variaveis
self.data = data # -> weka.core.dataset.Instances
self.learn_class = learn_class # String
self.options = options # List
self.imp = None # Imputation()
self.selected_features = None # ndarry
self.missing_patterns = None # ndarry
self.classifiers = set()
self.weights = []
'''
Realiza o treinamento do conjunto de dados
'''
def training(self):
# Preparação dos dados
self.imp = Imputation(self.data)
# Seleciona as caracteristicas
self.features = FeatureSelection(self.imp.imputed_data)
data_selected = self.features.data_selected
self.selected_features = self.features.selected_features
# Encontra os padrões ausentes
self.missing_patterns = MissingPatterns(self.data, self.selected_features).missing_patterns
# Realiza o treinamento dos classificadores
#print('test train')
for mpi in self.missing_patterns:
# Seleciona as caracteristicas
cpi = set(self.selected_features) - set(mpi)
data_temp = Instances.copy_instances(data_selected, from_row=0, num_rows=data_selected.num_instances)
data_temp.class_is_last()
# Separa os dados de treinamento
data_temp = self.reduceData(data_temp, cpi, self.data)
# Treina os classificadores com os dados imputados
classifier = Classifier(classname=self.learn_class, options=self.options)
classifier.build_classifier(data_temp)
#print(classifier.distribution_for_instance(data_selected.get_instance(30)))
#!!!!!! Verica o peso de cada classificador (sua acuracia de classificação)
evl = Evaluation(data_temp)
evl.crossvalidate_model(classifier, data_temp, 15, Random(1))
# Adiciona os classificadores treinados ao conjunto de classificadores
my_classifier = MyClassifier(classifier, cpi, 1 - evl.mean_absolute_error)
self.classifiers.add(my_classifier)
#print(data_temp.class_attribute)
#print("\n---------------------------------------\n")
'''
Realiza a redução de um conjunto de instancias, segunda as caracteristicas informadas
data -> weka.core.dataset.Instances
features -> set()
original_data -> weka.core.dataset.Instances
'''
def reduceData(self, data, features, original_data):
i = 0;
while i < data.num_attributes:
flag = True
for j in features:
if str(original_data.attribute(j)) == str(data.attribute(i)):
flag = False
pass
if flag:
data.delete_attribute(i)
else:
i += 1
return data