Spaces:
Runtime error
Runtime error
| """ | |
| @author: Caglar Aytekin | |
| contact: caglar@deepcause.ai | |
| """ | |
| # %% IMPORT | |
| from LEURN import LEURN | |
| import torch | |
| from DATA import split_and_processing | |
| from TRAINER import Trainer | |
| import numpy as np | |
| import openml | |
| #DEMO FOR CREDIT SCORING DATASET: OPENML ID : 31 | |
| #MORE INFO: https://www.openml.org/search?type=data&sort=runs&id=31&status=active | |
| #%% Set Neural Network Hyperparameters | |
| depth=2 | |
| batch_size=1024 | |
| lr=5e-3 | |
| epochs=300 | |
| droprate=0. | |
| output_type=1 #0: regression, 1: binary classification, 2: multi-class classification | |
| #%% Check if CUDA is available and set the device accordingly | |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
| print("Using device:", device) | |
| #%% Load the dataset | |
| #Read dataset from openml | |
| open_ml_dataset_id=1590 | |
| dataset = openml.datasets.get_dataset(open_ml_dataset_id) | |
| X, y, categoricals, attribute_names = dataset.get_data(target=dataset.default_target_attribute) | |
| #Alternatively load your own dataset from another source (excel,csv etc) | |
| #Be mindful that X and y should be dataframes, categoricals is a boolean list indicating categorical features, attribute_names is a list of feature names | |
| # %% Process data, save useful statistics | |
| X_train,X_val,X_test,y_train,y_val,y_test,preprocessor=split_and_processing(X,y,categoricals,output_type,attribute_names) | |
| #%% Initialize model, loss function, optimizer, and learning rate scheduler | |
| model = LEURN(preprocessor, depth=depth,droprate=droprate).to(device) | |
| #%%Train model | |
| model_trainer=Trainer(model, X_train, X_val, y_train, y_val,lr=lr,batch_size=batch_size,epochs=epochs,problem_type=output_type) | |
| model_trainer.train() | |
| #Load best weights | |
| model.load_state_dict(torch.load('best_model_weights.pth')) | |
| #%%Evaluate performance | |
| perf=model_trainer.evaluate(X_train, y_train) | |
| perf=model_trainer.evaluate(X_test, y_test) | |
| perf=model_trainer.evaluate(X_val, y_val) | |
| #%%TESTS | |
| model.eval() | |
| #%%Check sample in original format: | |
| print(preprocessor.inverse_transform_X(X_test[0:1])) | |
| #%% Explain single example | |
| Exp_df_test_sample,result,result_original_format=model.explain(X_test[0:1]) | |
| #%% Check results | |
| print(result,result_original_format) | |
| #%% Check explanation | |
| print(Exp_df_test_sample) | |
| #%% Influences | |
| effects=model.influence_matrix() | |
| new_list = [a for c, a in zip(categoricals, attribute_names) if c]+[a for c, a in zip(categoricals, attribute_names) if not(c)] | |
| torch.argmax(effects,dim=1) | |
| global_importances=model.global_importance() | |
| #%% tests | |
| #model output and sum of contributions should be the same | |
| print(result,model.output,model(X_test[0:1]),Exp_df_test_sample['Contribution'].values.sum()) | |
| #%% GENERATION FROM SAME CATEGORY | |
| generated_sample_nn_friendly, generated_sample_original_input_format,output=model.generate_from_same_category(X_test[0:1]) | |
| #%%Check sample in original format: | |
| print(preprocessor.inverse_transform_X(X_test[0:1])) | |
| print(generated_sample_original_input_format) | |
| #%% Explain single example | |
| Exp_df_generated_sample,result,result_original_format=model.explain(generated_sample_nn_friendly) | |
| print(Exp_df_generated_sample) | |
| print(Exp_df_test_sample.equals(Exp_df_generated_sample)) #this should be true | |
| #%% GENERATE FROM SCRATCH | |
| generated_sample_nn_friendly, generated_sample_original_input_format,output=model.generate() | |
| Exp_df_generated_sample,result,result_original_format=model.explain(generated_sample_nn_friendly) | |
| print(Exp_df_generated_sample) | |
| print(result,result_original_format) | |