def run_model(args, X, y, ensembler = False):
    model = None
    if args['model'] == 'logistic':
        logistic = Logistic(X,y, model)
        model = logistic.train_model()
    elif args['model'] == 'knn':
        knn = KNN(X,y, model)
        model = knn.train_model()
    elif args['model'] == 'svm':
        svm = SVM(X,y, model)
        model = svm.train_model()
    elif args['model'] == 'rfa':
        rfa = RandomForest(X, y, model)
        model = rfa.train_model(ensembler)
    elif args['model'] == 'xgb':
        xgb = XGB(X, y, model)
        model = xgb.train_model(ensembler)
    elif args['model'] == 'lgbm':
        lgbm = LightGBM(X, y, model)
        model = lgbm.train_model(ensembler)
    elif args['model'] == 'catboost':
        catboost = CatBoost(X, y, model)
        model = catboost.train_model(ensembler)
    elif len(args['models']) > 1:
        models = [('', None)]* len(args['models'])
        for i in range(len(args['models'])):
            model_name = args['models'][i]
            temp_args = copy.deepcopy(args)
            temp_args['model'] = model_name 
            models[i] = (model_name, run_model(temp_args, X, y, True))

        ensembler = Ensembler(X, y, model, args['ensembler_type'])
        model = ensembler.train_model(models)
        return model
    else:
        print('\nInvalid model name :-|\n')
        exit()
    return model