def test_arr_validacao(self): #testa a criação do fold fold = Fold(Dados.df_treino, Dados.df_teste, "realClass", num_folds_validacao=3, num_repeticoes_validacao=2) #verifica se foi criado 6 folds de validação self.assertEqual( len(fold.arr_folds_validacao), 6, "Foi solicitado 2 execuções de 3 folds, ou seja, no final 6 folds") #os folds de validação nao possuem validação for fold_validacao in fold.arr_folds_validacao: self.assertEqual(len(fold_validacao.arr_folds_validacao), 0, "O fold de validação não possuirá validação") #verifica cada execução arr_folds_execucao_1 = fold.arr_folds_validacao[:3] TestFold.folds_test(self, Dados.df_treino, arr_folds_execucao_1, 3, True, 1) arr_folds_execucao_2 = fold.arr_folds_validacao[3:] TestFold.folds_test(self, Dados.df_treino, arr_folds_execucao_2, 3, True, 1)
def test_gerar_k_folds(self): k = 7 num_repeticoes = 3 #print("DADOS: "+str(len(TestFold.df_dados))) tam_fold = len(Dados.df_dados)//k folds = Fold.gerar_k_folds(Dados.df_dados,col_classe="realClass",val_k=k,num_repeticoes=num_repeticoes,seed=1) #verifica se foram 4 folds e 3 repetições self.assertEqual(k*num_repeticoes,len(folds),"O número de folds criado não é quantidade solicitada") #verifica se os dados estao embaralhados arr_lista_fold0 = list(folds[0].df_data_to_predict.index.values) self.assertTrue(arr_lista_fold0!=[0,1,2], "A lista não foi embaralhada!") self.assertListEqual(arr_lista_fold0,[14, 13, 17], "A lista não foi embaralhada corretamente! Não esqueça de usar a seed=seed+num_repeticoes") #verifica se os dados foram divididos corretamente #testa cada repetição separadamente for repeticao_i in range(num_repeticoes): folds_por_repeticao = folds[repeticao_i*k:repeticao_i*k+k] TestFold.folds_test(self,Dados.df_dados,folds_por_repeticao,k,True,repeticao_i) for i,f in enumerate(folds_por_repeticao): ids_teste = set(f.df_data_to_predict.index.values.tolist()) ids_treino = set(f.df_treino.index.values.tolist()) #verifica se o temanho do teste esta correto do dataset if(i<k-1): self.assertEqual(tam_fold,len(ids_teste),"O tamanho do partição deveria ser floor(numero_de_itens/val_k) - exceto o ultimo que deve possuir mais.") else: self.assertTrue(len(ids_teste)>=tam_fold, "No ultimo fold, o tamanho da particao deve ser maior ou igual a floor(numero_de_itens/val_k)")
def get_experimento(self,ml_method=DecisionTreeClassifier(min_samples_split=1,random_state=1),ClasseObjetivoOtimizacao=OtimizacaoObjetivoArvoreDecisao): folds = Fold.gerar_k_folds(Dados.df_dados,val_k=5,col_classe="realClass", num_repeticoes=1,seed=1, num_folds_validacao=3,num_repeticoes_validacao=2) exp = Experimento(folds,ml_method, ClasseObjetivoOtimizacao, num_trials=10, sampler=optuna.samplers.TPESampler(seed=1, n_startup_trials=3)) return exp
def test_otimizacao(self): fold = Fold(Dados.df_treino, Dados.df_teste, "realClass", num_folds_validacao=3, num_repeticoes_validacao=2) otimiza_fold = OtimizacaoObjetivoRandomForest(fold) tpe_sampler = TPESampler(n_startup_trials=10, seed=1) study_TP = optuna.create_study(sampler=tpe_sampler, direction="maximize") study_TP.optimize(otimiza_fold, n_trials=30) for trial in study_TP.trials: print(trial.params) arr_params_to_test = [ "min_samples_split", "max_features", "num_arvores" ] for param_name in arr_params_to_test: self.assertTrue( param_name in study_TP.best_trial.params, f"Não foi encontrado o parametro '{param_name}' certifique-se se você nomeou o parametro devidamente" ) self.assertAlmostEqual(study_TP.best_trial.params["min_samples_split"], 0.19829036364801306, places=5, msg="Otimização não deu resultado esperado") self.assertAlmostEqual(study_TP.best_trial.params["max_features"], 0.1939553705810037, places=5, msg="Otimização não deu resultado esperado") self.assertAlmostEqual(study_TP.best_trial.params["num_arvores"], 5, msg="Otimização não deu resultado esperado") print(f"Melhor execução: {study_TP.best_trial.params}") result = Resultado(np.array([1, 1, 1, 1, 0, 0, 0, 0]), np.array([1, 1, 0, 0, 1, 1, 1, 0])) result_metrica = otimiza_fold.resultado_metrica_otimizacao(result) print(f"Resultado: {result_metrica}") self.assertAlmostEqual( result_metrica, 0.3650793650793651, places=5, msg="Resultado da metrica de otimização não deu resultado esperado" )