| import pandas as pd |
| import numpy as np |
| import importlib |
| import sys |
| import time |
| import os |
|
|
| |
| sys.path.append('../model') |
| sys.path.append('../functions/matrix_generator') |
| sys.path.append('../functions/data_extractor') |
|
|
| import tdce_model as tdce |
| import material_fc_layer as mfl |
| import employee_fc_layer as efl |
| import capital_fc_layer as cfl |
| import loss |
| import cost_matrix_class as cmc |
| import display_input_variation as diva |
| import viyacrab_augmentation as viya |
| import adjust_data as ajd |
| import result_display as rd |
|
|
| importlib.reload(tdce) |
| importlib.reload(mfl) |
| importlib.reload(efl) |
| importlib.reload(cfl) |
| importlib.reload(loss) |
| importlib.reload(tdce) |
| importlib.reload(cmc) |
| importlib.reload(diva) |
| importlib.reload(viya) |
| importlib.reload(ajd) |
| importlib.reload(rd) |
| |
|
|
|
|
| def inital_layer( |
| material_cost_matrix, |
| employee_cost_matrix, |
| capital_cost_matrix, |
| ): |
| total_col = 0 |
| |
| row, high, col = material_cost_matrix.shape |
| material_layer_1 = mfl.MaterialFCLayer(col, 1) |
| |
| total_col += col |
|
|
| |
| row, high, col = employee_cost_matrix.shape |
| employee_layer_1 = efl.EmployeeFCLayer(col, 1, 8) |
| total_col += col |
| |
|
|
| |
| row, high, col = capital_cost_matrix.shape |
| capital_cost_layer1 = cfl.CapitalCostFCLayer(col, 1, 21) |
| total_col += col |
| |
| |
|
|
| return ( |
| material_layer_1, |
| employee_layer_1, |
| capital_cost_layer1, |
| ) |
|
|
|
|
| def create_learning( |
| epoch, |
| learning_rate, |
| inside_learning_rate, |
| material_cost_matrix, |
| material_amount_matrix, |
| employee_cost_matrix, |
| employee_duration_matrix, |
| employee_day_amount_matrix, |
| capital_cost_matrix, |
| day_amount_matrix, |
| capital_duration_matrix, |
| result_matrix, |
| folder_name, |
| validation_payload, |
| breakpoint, |
| early_stopping=False, |
| patience_round=10, |
| use_model_weight=False, |
| ): |
| |
| tdce_model = tdce.TDCEModel() |
| |
| ( |
| material_layer_1, |
| employee_layer_1, |
| capital_cost_layer1, |
| ) = inital_layer( |
| capital_cost_matrix=capital_cost_matrix, |
| employee_cost_matrix=employee_cost_matrix, |
| material_cost_matrix=material_cost_matrix, |
| ) |
|
|
| tdce_model.inital_inside_element( |
| material_layer=material_layer_1, |
| capital_cost_layer=capital_cost_layer1, |
| employee_layer=employee_layer_1, |
| ) |
|
|
| tdce_model.use(loss=loss.mse, loss_prime=loss.mse_prime, |
| loss_percent=loss.rmspe) |
|
|
| tdce_model.set_learning_rate( |
| inside_learning_rate[0], |
| inside_learning_rate[1], |
| inside_learning_rate[2], |
| ) |
|
|
| start_time = time.time() |
|
|
| if early_stopping: |
| tdce_model.activate_early_stopping() |
| tdce_model.edit_patience_round(patience_round) |
|
|
| if use_model_weight: |
| tdce_model.activete_model_weight() |
|
|
| tdce_model.fit_with_validation( |
| epoch=epoch, |
| learning_rate=learning_rate, |
| material_amount_matrix=material_amount_matrix, |
| material_cost_matrix=material_cost_matrix, |
| employee_cost_matrix=employee_cost_matrix, |
| employee_duration_matrix=employee_duration_matrix, |
| employee_day_amount_matrix=employee_day_amount_matrix, |
| result_matrix=result_matrix, |
| capital_cost_matrix=capital_cost_matrix, |
| day_amount_matrix=day_amount_matrix, |
| validation_payload=validation_payload, |
| capital_cost_duration_matrix=capital_duration_matrix, |
| ) |
|
|
| end_time = time.time() |
| time_usage = end_time - start_time |
| print(f"Learning Rate: {learning_rate} & {inside_learning_rate}") |
| print(f"Time Using {time_usage} Second") |
|
|
| error_list = tdce_model.get_epoch_error() |
| sample_error_list = tdce_model.get_sample_error() |
|
|
| error_df = pd.DataFrame(error_list) |
| sample_error_df = pd.DataFrame(sample_error_list) |
|
|
| before_breakpoint_error = error_df[error_df["epoch"] < breakpoint] |
| bb_minimum_error = before_breakpoint_error["error"].min() |
| bb_minimum_percent_error = before_breakpoint_error["error_percent"].min() |
| bb_minimum_validate_error = before_breakpoint_error["validate_error"].min() |
| bb_minimum_validate_percent_error = before_breakpoint_error[ |
| "validate_error_percent" |
| ].min() |
|
|
| minimum_error = error_df["error"].min() |
| minimum_percent_error = error_df["error_percent"].min() |
| minimum_validate_error = error_df["validate_error"].min() |
| minimum_validate_percent_error = error_df["validate_error_percent"].min() |
|
|
| try: |
| os.mkdir(f"{folder_name}") |
| except FileExistsError: |
| print("Folder is Exist") |
| pass |
|
|
| error_df.to_csv(f"{folder_name}/{epoch}-{inside_learning_rate[0]}.csv") |
| sample_error_df.to_csv( |
| f"{folder_name}/error-list-{epoch}-{inside_learning_rate[0]}.csv" |
| ) |
|
|
| sample_payload = tdce_model.get_sample_payload() |
| sample_payload_df = pd.DataFrame(sample_payload) |
| sample_payload_df.to_csv( |
| f"{folder_name}/sample-payload-list-{epoch}-{inside_learning_rate[0]}.csv", |
| index=False, |
| ) |
|
|
| return ( |
| minimum_error, |
| time_usage, |
| minimum_percent_error, |
| minimum_validate_error, |
| minimum_validate_percent_error, |
| bb_minimum_error, |
| bb_minimum_percent_error, |
| bb_minimum_validate_error, |
| bb_minimum_validate_percent_error, |
| ) |
|
|
|
|
| def run_experiment( |
| data_directory, |
| epoch, |
| folder_name, |
| round_number, |
| learning_rate_list, |
| model_learning_rate, |
| breakpoint, |
| early_stopping=False, |
| patience_round=10, |
| augmentation=False, |
| remove_outlier_qtr=False, |
| outlier_index=1.5, |
| use_model_weight=False, |
| ): |
| print("Run Experiment Script is initial !") |
| try: |
| os.mkdir(folder_name) |
| except FileExistsError: |
| print("Folder is Exist") |
| pass |
| cost_generator = cmc.CostMatrixGenerator() |
| cost_generator.change_data_directory(data_directory) |
| cost_generator.load_data() |
| if remove_outlier_qtr: |
| cost_generator.remove_outlier_iqr(outlier_index) |
| ( |
| new_process_df, |
| new_employee_usage, |
| new_material_usage, |
| new_capital_cost_usage, |
| ) = cost_generator.get_data() |
|
|
| (new_capital_cost_usage, new_employee_usage, new_material_usage) = ( |
| ajd.adjust_to_match_process( |
| capital_cost_usage=new_capital_cost_usage, |
| employee_usage=new_employee_usage, |
| material_usage=new_material_usage, |
| new_process_df=new_process_df, |
| ) |
| ) |
|
|
| new_variation = diva.display_input_variation( |
| new_process_df, |
| new_material_usage, |
| new_employee_usage, |
| new_capital_cost_usage, |
| ) |
| new_variation.to_csv(f"{folder_name}/data_variation_after_outlier.csv") |
| new_process_df.to_csv(f"{folder_name}/process_df_after_outlier.csv") |
|
|
| try: |
| print("Data Variation After Outlier Removed") |
| display(new_variation) |
| except Exception as e: |
| print("This is not Jupyter Notebook", e) |
|
|
| |
| input_variation = diva.display_input_variation_by_directory(data_directory) |
| input_variation.to_csv(f"{folder_name}/data_variation.csv") |
|
|
| overall_result = [] |
|
|
| |
| for learn_r in learning_rate_list: |
| round_err_list = [] |
| round_time_list = [] |
| round_percent_list = [] |
| round_validate_err_list = [] |
| round_validate_err_percent_list = [] |
| round_brakpoint_err_list = [] |
| round_brakpoint_err_percent_list = [] |
| round_brakpoint_val_err_list = [] |
| round_brakpoint_val_err_percent_list = [] |
| round_err_dict = {"learning_rate": str(learn_r)} |
| for round in range(round_number): |
| |
| ( |
| train_process_df, |
| train_employee_usage, |
| train_material_usage, |
| train_capital_cost, |
| validate_process_df, |
| validate_employee_usage, |
| validate_material_usage, |
| validate_capital_cost, |
| ) = cost_generator.train_test_split_without_matrix(0.7) |
| |
| validation_payload = cost_generator.get_validation_payload( |
| validate_process_df |
| ) |
|
|
| |
| train_variation = diva.display_input_variation( |
| train_process_df, |
| train_material_usage, |
| train_employee_usage, |
| train_capital_cost, |
| ) |
| train_variation.to_csv( |
| f"{folder_name}/train_data_variation_{round}.csv") |
| train_process_df.to_csv( |
| f"{folder_name}/train_process_df_{round}.csv") |
|
|
| |
| validate_variation = diva.display_input_variation( |
| validate_process_df, |
| validate_material_usage, |
| validate_employee_usage, |
| validate_capital_cost, |
| ) |
|
|
| validate_variation.to_csv( |
| f"{folder_name}/validate_data_variation_{round}.csv" |
| ) |
| if augmentation: |
| |
| |
| train_process_df.to_csv( |
| f"{folder_name}/train_process_df_before_augmented_{round}.csv" |
| ) |
| train_process_df = viya.vy_training_augmentation( |
| train_process_df) |
| |
| train_variation = diva.display_input_variation( |
| train_process_df, |
| train_material_usage, |
| train_employee_usage, |
| train_capital_cost, |
| ) |
| train_variation.to_csv( |
| f"{folder_name}/train_data_variation_after_augmented_{round}.csv" |
| ) |
| train_process_df.to_csv( |
| f"{folder_name}/train_process_df_after_augmented_{round}.csv" |
| ) |
|
|
| |
| ( |
| material_cost_matrix, |
| material_amount_matrix, |
| employee_cost_matrix, |
| employee_duration_matrix, |
| employee_day_amount_matrix, |
| capital_cost_matrix, |
| day_amount_matrix, |
| capital_cost_duration_matrix, |
| result_matrix, |
| ) = cost_generator.generate_data_from_input( |
| train_process_df, |
| train_material_usage, |
| train_employee_usage, |
| train_capital_cost, |
| ) |
| |
| ( |
| round_err, |
| round_time, |
| round_err_percent, |
| val_err, |
| val_err_percent, |
| brakpoint_err, |
| breakpoint_err_percent, |
| breakpoint_val_err, |
| breakpoint_val_err_percent, |
| ) = create_learning( |
| epoch=epoch, |
| learning_rate=model_learning_rate, |
| folder_name=f"{folder_name}/round{round + 1}", |
| |
| material_amount_matrix=material_amount_matrix, |
| material_cost_matrix=material_cost_matrix, |
| |
| employee_cost_matrix=employee_cost_matrix, |
| employee_duration_matrix=employee_duration_matrix, |
| employee_day_amount_matrix=employee_day_amount_matrix, |
| |
| capital_cost_matrix=capital_cost_matrix, |
| day_amount_matrix=day_amount_matrix, |
| capital_duration_matrix=capital_cost_duration_matrix, |
| |
| result_matrix=result_matrix, |
| |
| validation_payload=validation_payload, |
| inside_learning_rate=[learn_r, learn_r, learn_r], |
| |
| breakpoint=breakpoint, |
| early_stopping=early_stopping, |
| patience_round=patience_round, |
| use_model_weight=use_model_weight, |
| ) |
| print( |
| f"Learning Rate {learn_r} Round {round} / {round_number} Finish with Error {round_err} ({round_err_percent} %), time comsume {round_time} " |
| ) |
| round_err_list.append(round_err) |
| round_time_list.append(round_time) |
| round_percent_list.append(round_err_percent) |
| round_validate_err_list.append(val_err) |
| round_validate_err_percent_list.append(val_err_percent) |
| round_brakpoint_err_list.append(brakpoint_err) |
| round_brakpoint_err_percent_list.append(breakpoint_err_percent) |
| round_brakpoint_val_err_list.append(breakpoint_val_err) |
| round_brakpoint_val_err_percent_list.append( |
| breakpoint_val_err_percent) |
| round_err_dict[f"round_{round}_err"] = round_err |
| round_err_dict[f"round_{round}_duration"] = round_time |
| round_err_dict[f"round_{round}_err_percent"] = round_err_percent |
| round_err_dict[f"round_{round}_val_err"] = val_err |
| round_err_dict[f"round_{round}_val_err_percent"] = val_err_percent |
| round_err_dict[f"round_{round}_brakpoint_err"] = brakpoint_err |
| round_err_dict[f"round_{round}_brakpoint_err_percent"] = ( |
| breakpoint_err_percent |
| ) |
| round_err_dict[f"round_{round}_brakpoint_val_err"] = breakpoint_val_err |
| round_err_dict[f"round_{round}_brakpoint_val_err_percent"] = ( |
| breakpoint_val_err_percent |
| ) |
|
|
| average_error = np.average(round_err_list) |
| average_time = np.average(round_time_list) |
| average_error_percent = np.average(round_percent_list) |
| average_val_err = np.average(round_validate_err_list) |
| average_val_err_percent = np.average(round_validate_err_percent_list) |
| breakpoint_average_error = np.average(round_brakpoint_err_list) |
| breakpoint_average_error_percent = np.average( |
| round_brakpoint_err_percent_list) |
| breakpoint_average_val_error = np.average(round_brakpoint_val_err_list) |
| breakpoint_average_val_error_percent = np.average( |
| round_brakpoint_val_err_percent_list |
| ) |
| print( |
| f"Success for learning rate {learn_r} : Average error {average_error} ({average_error_percent}%) Average Time {average_time}" |
| ) |
| round_err_dict["average_error"] = average_error |
| round_err_dict["average_err_percent"] = average_error_percent |
| round_err_dict["average_time"] = average_time |
| round_err_dict["average_validate_error"] = average_val_err |
| round_err_dict["average_validate_error_percent"] = average_val_err_percent |
| round_err_dict["average_brakpoint_error"] = breakpoint_average_error |
| round_err_dict["average_brakpoint_error_percent"] = ( |
| breakpoint_average_error_percent |
| ) |
| round_err_dict["average_brakpoint_val_error"] = breakpoint_average_val_error |
| round_err_dict["average_brakpoint_val_error_percent"] = ( |
| breakpoint_average_val_error_percent |
| ) |
| overall_result.append(round_err_dict) |
|
|
| overall_result_df = pd.DataFrame(overall_result) |
| overall_result_df.to_csv(f"{folder_name}/overall_result.csv") |
|
|
| rd.creating_error_csv( |
| primary_directory_name=folder_name, |
| learning_rate=learning_rate_list, |
| iteration_number=epoch, |
| round_number=round_number, |
| breakpoint_number=breakpoint, |
| ) |
|
|
| return overall_result_df |
|
|