def check(in_file='.dat'): res = load_data(in_file) print(res) best_res, mid_res = res best1, outs1 = mid_res best_avg_auc = -1 for out in outs1[0]: if np.mean(out['auc']) > best_avg_auc: best_avg_auc = np.mean(out['auc']) best_results = copy.deepcopy(out) print('\n', best_avg_auc, best_results) return out
def check(in_file='.dat'): res = load_data(in_file) # print(res) best_res, mid_res = res # best1: (file_name), # outs1: [n_repeats][all_middle_res(tuning res)] best1, outs1 = mid_res best_avg_auc = -1 for out in outs1[0]: if np.mean(out['auc']) > best_avg_auc: best_avg_auc = np.mean(out['auc']) best_results = copy.deepcopy(out) print('\n', best_avg_auc, best_results) return outs1
def dat2xlxs(in_file, out_file): results = load_data(in_file) new_results = {} # methods_mapping = { # 'detector_name_OCSVM-gs_True-kjl_False-quickshift_False-meanshift_False-nystrom_False': 'OCSVM', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_False':'GMM-full', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_False':'GMM-diag', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_False-quickshift_False-nystrom_False':'GMM-full-kjl', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_False-quickshift_False-nystrom_False':'GMM-diag-kjl', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_True': 'GMM-full-nystrom', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_True': 'GMM-diag-nystrom', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-full-kjl-quickshift', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-diag-kjl-quickshift', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-full-kjl-meanshift', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-diag-kjl-meanshift', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-nystrom_False-quickshift_False-meanshift_False': 'GMM-full', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-nystrom_False-quickshift_False-meanshift_False': 'GMM-diag', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False': 'GMM-full-kjl', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False': 'GMM-diag-kjl', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-nystrom_True-quickshift_False-meanshift_False': 'GMM-full-nystrom', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-nystrom_True-quickshift_False-meanshift_False': 'GMM-diag-nystrom', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-full-kjl-quickshift', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-diag-kjl-quickshift', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-full-kjl-meanshift', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-diag-kjl-meanshift', # # } GMM_covariance_type = 'diag' methods_mapping = { 'case1': 'OCSVM', 'case2': f'GMM-{GMM_covariance_type}', 'case3': f'GMM-{GMM_covariance_type}-kjl', 'case4': f'GMM-{GMM_covariance_type}-nystrom', 'case5': f'GMM-{GMM_covariance_type}-kjl-quickshift', 'case6': f'GMM-{GMM_covariance_type}-kjl-meanshift', } with ExcelWriter(out_file) as writer: for sheet_name in ['OCSVM']: values = [] for i, ((data_key, method_key), (best_values, mid_values)) in enumerate(results.items()): if methods_mapping[method_key] != sheet_name: continue print(f'\n\n----{i}, {sheet_name}') try: header = 5 X_train_shape = best_values['X_train_shape'] X_test_shape = best_values['X_test_shape'] aucs = best_values['aucs'] train_times = best_values['train_times'] test_times = best_values['test_times'] aucs_str = "-".join([str(v) for v in aucs]) train_times_str = "-".join([str(v) for v in train_times]) test_times_str = "-".join([str(v) for v in test_times]) params = best_values['params'] _suffex = '' line = f'{data_key}, {X_train_shape}, {X_test_shape}, => aucs:{aucs_str}, train_times:{train_times_str}, test_times:{test_times_str}, with params: {params}: {_suffex}' values.append(line) pd.DataFrame(values).to_excel(writer, sheet_name, index=False, header=False) startrow = len(values) + 5 _each_total_rows = len(values) + 5 except Exception as e: traceback.print_exc() values = [sheet_name] values.extend([] * _each_total_rows) writer.save() return out_file
def dat2xlxs_new(in_file, out_file, models=None): results = load_data(in_file) try: for model_name, vs in results.items(): if 'GMM' in model_name: if 'full' in model_name: GMM_covariance_type = 'full' elif 'diag' in model_name: GMM_covariance_type = 'diag' else: msg = model_name raise NotImplementedError(msg) except Exception as e: print(f'e: {e}') GMM_covariance_type = 'diag' with ExcelWriter(out_file) as writer: for i, sheet_name in enumerate(models): values = [] _each_total_rows = 0 is_file_header = True if sheet_name not in results.keys(): continue res_ = results[sheet_name] for j, vs in enumerate(res_): print( f'----i={i}, j={j}, sheet_name:{sheet_name}, model_name: {sheet_name}, {vs}' ) try: if is_file_header: header = 5 # the first 5 rows are empty for writing configurations values.extend([[] for i in range(header)]) values.append([sheet_name]) is_file_header = False data_key = vs[0] try: X_train_shape = vs[2].split( 'X_train_shape:')[-1].split('|')[0] X_train_shape = f'{X_train_shape}'.replace(',', '-') X_val_shape = vs[2].split('X_val_shape:')[-1] X_val_shape = f'{X_val_shape}'.replace(',', '-') X_test_shape = vs[3].split('X_test_shape:')[-1] X_test_shape = f'{X_test_shape}'.replace(',', '-') aucs = vs[7].split(":")[-1] train_times = vs[8].split(":")[-1] test_times = vs[9].split(":")[-1] space_sizes = vs[12].split(":")[-1] # aucs_str = "-".join([str(v) for v in aucs]) # train_times_str = "-".join([str(v) for v in train_times]) # test_times_str = "-".join([str(v) for v in test_times]) # space_sizes_str = "-".join([str(v) for v in space_sizes]) params = vs[13:] # n_comps = [int(v['GMM_n_components']) for v in best_values['params']] # mu_n_comp = np.mean(n_comps) # std_n_comp = np.std(n_comps) # n_comp_str = '-'.join([str(v) for v in n_comps]) # n_comp_str = f'{n_comp_str}|(u_std) {mu_n_comp:.2f}+/-{std_n_comp:.2f}' n_comp_str = vs[10].split(":")[-1] _suffex = f', n_comps_arr: {n_comp_str}' line = f'{data_key}, {sheet_name}, {X_train_shape}|{X_val_shape}, {X_test_shape}, ' \ f'auc: u+/-std, , , ' \ f'=> aucs:{aucs}, train_times:{train_times}, test_times:{test_times}, ' \ f'space_sizes: {space_sizes}, with params: {params}: {_suffex}' except Exception as e: # n_comp_str = f'error-{e}' # _suffex = f', n_comps_arr: {n_comp_str}' line = f'{data_key}, {sheet_name}, X_train_shape|X_val_shape, X_test_shape, ' \ f'auc: u+/-std, , , ' \ f'=> aucs:, train_times:, test_times:, ' \ f'space_sizes: , with params: : ' values.append(line.split(',')) pd.DataFrame(values).to_excel(writer, sheet_name, index=False, header=False) startrow = len(values) + 5 _each_total_rows = len(values) + 5 except Exception as e: traceback.print_exc() values = [sheet_name] values.extend([] * _each_total_rows) # once call write.save(), it will close the file writer.save() return out_file
def dat2xlxs( in_file, out_file, ): results = load_data(in_file) new_results = {} # methods_mapping = { # 'detector_name_OCSVM-gs_True-kjl_False-quickshift_False-meanshift_False-nystrom_False': 'OCSVM', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_False':'GMM-full', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_False':'GMM-diag', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_False-quickshift_False-nystrom_False':'GMM-full-kjl', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_False-quickshift_False-nystrom_False':'GMM-diag-kjl', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_True': 'GMM-full-nystrom', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-meanshift_False-quickshift_False-nystrom_True': 'GMM-diag-nystrom', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-full-kjl-quickshift', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-diag-kjl-quickshift', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-full-kjl-meanshift', # # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-diag-kjl-meanshift', # # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-nystrom_False-quickshift_False-meanshift_False': 'GMM-full', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-nystrom_False-quickshift_False-meanshift_False': 'GMM-diag', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False': 'GMM-full-kjl', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False': 'GMM-diag-kjl', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_False-nystrom_True-quickshift_False-meanshift_False': 'GMM-full-nystrom', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_False-nystrom_True-quickshift_False-meanshift_False': 'GMM-diag-nystrom', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-full-kjl-quickshift', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_False-quickshift_True-nystrom_False': 'GMM-diag-kjl-quickshift', # 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-full-kjl-meanshift', # 'detector_name_GMM-covariance_type_diag-gs_True-kjl_True-meanshift_True-quickshift_False-nystrom_False': 'GMM-diag-kjl-meanshift', # # } try: GMM_covariance_type = \ [_best_res['params'][-1]['GMM_covariance_type'] for (data_name_file, case), (_best_res, _mid_res) in results.items() if 'GMM_covariance_type' in _best_res['params'][-1].keys()][0] except Exception as e: print(f'e: {e}') GMM_covariance_type = 'diag' methods_mapping = { 'case1': 'OCSVM(rbf)', 'case1_2': 'KJL-OCSVM(linear)', 'case1_3': 'Nystrom-OCSVM(linear)', 'case2': f'GMM({GMM_covariance_type})', 'case3': f'KJL-GMM({GMM_covariance_type})', 'case4': f'Nystrom-GMM({GMM_covariance_type})', 'case5': f'KJL-QS-GMM({GMM_covariance_type})', 'case6': f'KJL-MS-GMM({GMM_covariance_type})', 'case7': f'Nystrom-QS-GMM({GMM_covariance_type})', 'case8': f'Nystrom-MS-GMM({GMM_covariance_type})', } methods_mapping = OrderedDict(methods_mapping) with ExcelWriter(out_file) as writer: for i, sheet_name in enumerate(methods_mapping.values()): values = [] _each_total_rows = 0 is_header = True for j, ((data_key, method_key), (best_values, mid_values)) in enumerate(results.items()): if methods_mapping[method_key] != sheet_name: continue print( f'----i={i}, j={j}, sheet_name:{sheet_name}, data_key: {data_key}' ) try: if is_header: header = 5 # the first 5 rows are empty for writing configurations values.extend([[] for i in range(header)]) values.append([method_key]) is_header = False X_train_shape = best_values['X_train_shape'] X_train_shape = f'{X_train_shape}'.replace(',', '-') try: X_val_shape = best_values['X_val_shape'] X_val_shape = f'{X_val_shape}'.replace(',', '-') except Exception as e: X_val_shape = f'(-)' X_test_shape = best_values['X_test_shape'] X_test_shape = f'{X_test_shape}'.replace(',', '-') aucs = best_values['aucs'] train_times = best_values['train_times'] test_times = best_values['test_times'] space_sizes = best_values['space_sizes'] aucs_str = "-".join([str(v) for v in aucs]) train_times_str = "-".join([str(v) for v in train_times]) test_times_str = "-".join([str(v) for v in test_times]) space_sizes_str = "-".join([str(v) for v in space_sizes]) params = best_values['params'][-1] try: n_comps = [ int(v['GMM_n_components']) for v in best_values['params'] ] mu_n_comp = np.mean(n_comps) std_n_comp = np.std(n_comps) n_comp_str = '-'.join([str(v) for v in n_comps]) n_comp_str = f'{n_comp_str}|(u_std) {mu_n_comp:.2f}+/-{std_n_comp:.2f}' except Exception as e: n_comp_str = f'error-{e}' _suffex = f', n_comps_arr: {n_comp_str}' line = f'{data_key}, {method_key}, {X_train_shape}|{X_val_shape}, {X_test_shape}, ' \ f'auc: u+/-std, , , ' \ f'=> aucs:{aucs_str}, train_times:{train_times_str}, test_times:{test_times_str}, ' \ f'space_sizes: {space_sizes_str}, with params: {params}: {_suffex}' values.append(line.split(',')) pd.DataFrame(values).to_excel(writer, sheet_name, index=False, header=False) startrow = len(values) + 5 _each_total_rows = len(values) + 5 except Exception as e: traceback.print_exc() values = [sheet_name] values.extend([] * _each_total_rows) # once call write.save(), it will close the file writer.save() return out_file
def main(): data_mapping = { # 'DS10_UNB_IDS/DS11-srcIP_192.168.10.5':'UNB_PC1', 'DS10_UNB_IDS/DS12-srcIP_192.168.10.8': 'UNB_PC2', 'DS10_UNB_IDS/DS13-srcIP_192.168.10.9': 'UNB_PC3', 'DS10_UNB_IDS/DS14-srcIP_192.168.10.14': 'UNB_PC4', 'DS10_UNB_IDS/DS15-srcIP_192.168.10.15': 'UNB_PC5', # 'DS20_PU_SMTV/DS21-srcIP_10.42.0.1':'SMTV', # # # 'DS40_CTU_IoT/DS41-srcIP_10.0.2.15': 'CTU', 'DS40_CTU_IoT/DS42-srcIP_192.168.1.196': 'CTU', # # 'DS50_MAWI_WIDE/DS51-srcIP_202.171.168.50':'MAWI', # 'DS50_MAWI_WIDE/DS51-srcIP_202.171.168.50', 'DS50_MAWI_WIDE/DS52-srcIP_203.78.7.165': 'MAWI_PC2', # 'DS50_MAWI_WIDE/DS53-srcIP_203.78.4.32':'MAWI_PC3', # 'DS50_MAWI_WIDE/DS54-srcIP_222.117.214.171':'MAWI_PC4', # 'DS50_MAWI_WIDE/DS55-srcIP_101.27.14.204':'MAWI_PC5', # 'DS50_MAWI_WIDE/DS56-srcIP_18.178.219.109':'MAWI_PC6', 'ISTS/2015': 'ISTS', 'MACCDC/2012': 'MACCDC', # 'DS60_UChi_IoT/DS61-srcIP_192.168.143.20':'GHom', 'DS60_UChi_IoT/DS62-srcIP_192.168.143.42': 'SCam', # 'DS60_UChi_IoT/DS63-srcIP_192.168.143.43':'SFrig', # 'DS60_UChi_IoT/DS64-srcIP_192.168.143.48':'BSTCH', } datasets = [ # # # # 'DS10_UNB_IDS/DS11-srcIP_192.168.10.5', 'DS10_UNB_IDS/DS12-srcIP_192.168.10.8', # # 'DS10_UNB_IDS/DS13-srcIP_192.168.10.9', # # 'DS10_UNB_IDS/DS14-srcIP_192.168.10.14', # # 'DS10_UNB_IDS/DS15-srcIP_192.168.10.15', # # # # # # # # # # # 'DS20_PU_SMTV/DS21-srcIP_10.42.0.1', # # # # # # # # 'DS40_CTU_IoT/DS41-srcIP_10.0.2.15', 'DS40_CTU_IoT/DS42-srcIP_192.168.1.196', # # # # # # # # # 'DS50_MAWI_WIDE/DS51-srcIP_202.171.168.50', # # 'DS50_MAWI_WIDE/DS51-srcIP_202.171.168.50', 'DS50_MAWI_WIDE/DS52-srcIP_203.78.7.165', # # 'DS50_MAWI_WIDE/DS53-srcIP_203.78.4.32', # # 'DS50_MAWI_WIDE/DS54-srcIP_222.117.214.171', # # 'DS50_MAWI_WIDE/DS55-srcIP_101.27.14.204', # # 'DS50_MAWI_WIDE/DS56-srcIP_18.178.219.109', # # # # # # # # # 'WRCCDC/2020-03-20', # # 'DEFCON/ctf26', 'ISTS/2015', 'MACCDC/2012', # # # # # 'DS60_UChi_IoT/DS61-srcIP_192.168.143.20', 'DS60_UChi_IoT/DS62-srcIP_192.168.143.42', # # # # 'DS60_UChi_IoT/DS63-srcIP_192.168.143.43', # # # # 'DS60_UChi_IoT/DS64-srcIP_192.168.143.48' # ] # dataset_name = datasets[0] for dataset_name in datasets: print(f'\n\n***dataset_name: {dataset_name}') # data_type = 'all_results' data_type = 'middle_results' if data_type == 'all_results': in_file = 'out/data_kjl/all_results.dat' results = load_data(in_file) print(results) elif data_type == 'middle_results': if 'DS10_UNB_IDS/DS12-srcIP_192.168.10.8' in dataset_name: in_file = f'out/data_kjl/{dataset_name}/iat_size/header:False/' \ 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False.csv-middle_results.dat' params = {'file_name': dataset_name, 'detector': 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False', 'n_components': 5, 'q': 0.4, 'd': 10, 'n': 100 } elif 'DS40_CTU_IoT/DS42-srcIP_192.168.1.196' in dataset_name: in_file = f'out/data_kjl/{dataset_name}/iat_size/header:False/' \ 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False.csv-middle_results.dat' params = {'file_name': dataset_name, 'detector': 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False', 'n_components': 5, 'q': 0.2, 'd': 10, 'n': 100 } elif 'DS50_MAWI_WIDE/DS52-srcIP_203.78.7.165' in dataset_name: in_file = f'out/data_kjl/{dataset_name}/iat_size/header:False/' \ 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False.csv-middle_results.dat' params = {'file_name': dataset_name, 'detector': 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False', 'n_components': 45, 'q': 0.9, 'd': 10, 'n': 100 } elif 'ISTS/2015' == dataset_name: in_file = f'out/data_kjl/{dataset_name}/iat_size/header:False/' \ 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False.csv-middle_results.dat' params = {'file_name': dataset_name, 'detector': 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False', 'n_components': 45, 'q': 0.2, 'd': 10, 'n': 100 } elif 'MACCDC/2012' == dataset_name: in_file = f'out/data_kjl/{dataset_name}/iat_size/header:False/' \ 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False.csv-middle_results.dat' params = {'file_name': dataset_name, 'detector': 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False', 'n_components': 35, 'q': 0.4, 'd': 10, 'n': 100 } elif 'DS60_UChi_IoT/DS62-srcIP_192.168.143.42' == dataset_name: in_file = f'out/data_kjl/{dataset_name}/iat_size/header:False/' \ 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False.csv-middle_results.dat' params = {'file_name': dataset_name, 'detector': 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False', 'n_components': 40, 'q': 0.7, 'd': 10, 'n': 100 } in_file = 'out/data_kjl/all_results-kjl.dat' results = load_data(in_file) # get middle results results = results[(f'data/data_kjl/{dataset_name}/iat_size/header:False', 'detector_name_GMM-covariance_type_full-gs_True-kjl_True-quickshift_False-meanshift_False-nystrom_False')][ 1] # pprint(results) kjl_n_aucs, kjl_d_aucs, kjl_q_aucs, n_components_aucs = get_each(results, params) title = data_mapping[params['file_name']] y = [np.mean(v) for v in list(kjl_n_aucs.values())] y_err = [np.std(v) for v in list(kjl_n_aucs.values())] print(f'{dataset_name}, n (varies): {y_err}') plot_err_bar(x=list(kjl_n_aucs.keys()), y=y, y_err=y_err, xlabel='n', ylabel='auc', title=title + '\n(d={}, q={} (of kjl) and n_components={} (of GMM))'.format(params['d'], params['q'], params[ 'n_components'])) y = [np.mean(v) for v in list(kjl_d_aucs.values())] y_err = [np.std(v) for v in list(kjl_d_aucs.values())] print(f'{dataset_name}, d (varies): {y_err}') plot_err_bar(x=list(kjl_d_aucs.keys()), y=y, y_err=y_err, xlabel='d', ylabel='auc', title=title + '\n(n={}, q={} (of kjl) and n_components={} (of GMM))'.format(params['n'], params['q'], params[ 'n_components']))