def train_test(features_vector: FeatureVector, classifier: Classifier,
               data: ClassifierData):
    # Build train features vector
    with Timer('building train features', VERBOSE):
        x_train_features = features_vector.convert_to_features(
            data.x_train, VERBOSE)

    # Train
    with Timer('training', VERBOSE):
        classifier.train(x_train_features, data.y_train)

    # Build test features vector
    with Timer('building test features', VERBOSE):
        x_test_features = features_vector.convert_to_features(
            data.x_test, VERBOSE)

    # Test
    if VERBOSE:
        print(features_vector.name)
        print(classifier.report(x_test_features, data.y_test))

    return classifier.f1_micro(x_test_features, data.y_test)
    # anlz = Analyzer(tr_path,
    #                 te_path,
    #                 cfg['data']['classes_list'],
    #                 cfg['analysis']['figures_path'])
    # anlz.run()

    ##############################################################
    #                        CNN MODEL                           #
    ##############################################################
    train_path = os.path.join(cfg['data']['sorted_path'], 'training')
    test_path = os.path.join(cfg['data']['sorted_path'], 'test')
    fig_full_path = os.path.abspath(cfg['model']['figures_path'])
    model_full_path = os.path.abspath(cfg['model']['models_path'])
    weights_full_path = os.path.abspath(cfg['model']['weights_path'])
    training_size = 18966
    test_size = 4742

    cnn = Classifier(train_path,
                     test_path,
                     training_size,
                     test_size,
                     cfg['data']['classes_list'],
                     cfg['model'],
                     fig_path=fig_full_path)
    cnn.compile()
    cnn.plot_model()
    cnn.train()
    cnn.show_training_history()
    cnn.plot_confusion_matrix((4742 // 32 + 1))
    cnn.save_model(model_full_path)