def per_combination_model_training_testing(train_subject_ids: list, validation_subject_ids: list, test_subject_ids: list, n_actions: int, n_takes: int, current_combination_modalities: list, skeleton_pose_model: str, model_names: list):
    'Combines skeleton point information based on modality combination, and subject id group. Trains, validates, and\n    tests the list of classifier models. Calculates metrics for each data split, model and parameter combination.\n\n        Args:\n            train_subject_ids: List of subject ids in the training set.\n            validation_subject_ids: List of subject ids in the validation set.\n            test_subject_ids: List of subject ids in the testing set.\n            n_actions: Total number of actions in the original dataset.\n            n_takes: Total number of takes in the original dataset.\n            current_combination_modalities: Current combination of modalities which will be used to import and combine\n                                            the dataset.\n            skeleton_pose_model: Name of the model currently used for extracting skeleton model.\n            model_names: List of ML classifier model names which will used creating the objects.\n\n        Returns:\n            None.\n    '
    train_skeleton_information = data_combiner(n_actions, train_subject_ids, n_takes, current_combination_modalities, skeleton_pose_model)
    validation_skeleton_information = data_combiner(n_actions, validation_subject_ids, n_takes, current_combination_modalities, skeleton_pose_model)
    test_skeleton_information = data_combiner(n_actions, test_subject_ids, n_takes, current_combination_modalities, skeleton_pose_model)
    metrics_features = ['accuracy_score', 'balanced_accuracy_score', 'precision_score', 'recall_score', 'f1_score']
    train_models_parameters_metrics = pd.DataFrame(columns=(['model_names', 'parameters'] + metrics_features))
    validation_models_parameters_metrics = pd.DataFrame(columns=(['model_names', 'parameters'] + metrics_features))
    test_models_parameters_metrics = pd.DataFrame(columns=(['model_names', 'parameters'] + metrics_features))
    combination_name = '_'.join((current_combination_modalities + [skeleton_pose_model]))
    for i in range(len(model_names)):
        parameters = retrieve_hyperparameters(model_names[i])
        parameters_grid = ParameterGrid(parameters)
        for j in range(len(parameters_grid)):
            current_parameters_grid_name = ', '.join(['{}={}'.format(k, parameters_grid[j][k]) for k in parameters_grid[j].keys()])
            (training_metrics, validation_metrics, test_metrics) = model_training_testing(train_skeleton_information, validation_skeleton_information, test_skeleton_information, model_names[i], parameters_grid[j])
            train_models_parameters_metrics = appends_parameter_metrics_combination(model_names[i], current_parameters_grid_name, training_metrics, train_models_parameters_metrics)
            validation_models_parameters_metrics = appends_parameter_metrics_combination(model_names[i], current_parameters_grid_name, validation_metrics, validation_models_parameters_metrics)
            test_models_parameters_metrics = appends_parameter_metrics_combination(model_names[i], current_parameters_grid_name, test_metrics, test_models_parameters_metrics)
            if (model_names[i] != 'gaussian_naive_bayes'):
                print('modality_combination={}, model={}, {} completed successfully.'.format(combination_name, model_names[i], current_parameters_grid_name))
            else:
                print('modality_combination={}, model={} completed successfully.'.format(combination_name, model_names[i]))
    per_combination_results_export('_'.join((current_combination_modalities + [skeleton_pose_model])), 'train_metrics', train_models_parameters_metrics)
    per_combination_results_export('_'.join((current_combination_modalities + [skeleton_pose_model])), 'validation_metrics', validation_models_parameters_metrics)
    per_combination_results_export('_'.join((current_combination_modalities + [skeleton_pose_model])), 'test_metrics', test_models_parameters_metrics)
Combines skeleton point information based on modality combination, and subject id group. Trains, validates, and
tests the list of classifier models. Calculates metrics for each data split, model and parameter combination.

    Args:
        train_subject_ids: List of subject ids in the training set.
        validation_subject_ids: List of subject ids in the validation set.
        test_subject_ids: List of subject ids in the testing set.
        n_actions: Total number of actions in the original dataset.
        n_takes: Total number of takes in the original dataset.
        current_combination_modalities: Current combination of modalities which will be used to import and combine
                                        the dataset.
        skeleton_pose_model: Name of the model currently used for extracting skeleton model.
        model_names: List of ML classifier model names which will used creating the objects.

    Returns:
        None.
def per_combination_model_training_testing(train_subject_ids: list, validation_subject_ids: list, test_subject_ids: list, n_actions: int, n_takes: int, current_combination_modalities: list, skeleton_pose_model: str, model_names: list):
    'Combines skeleton point information based on modality combination, and subject id group. Trains, validates, and\n    tests the list of classifier models. Calculates metrics for each data split, model and parameter combination.\n\n        Args:\n            train_subject_ids: List of subject ids in the training set.\n            validation_subject_ids: List of subject ids in the validation set.\n            test_subject_ids: List of subject ids in the testing set.\n            n_actions: Total number of actions in the original dataset.\n            n_takes: Total number of takes in the original dataset.\n            current_combination_modalities: Current combination of modalities which will be used to import and combine\n                                            the dataset.\n            skeleton_pose_model: Name of the model currently used for extracting skeleton model.\n            model_names: List of ML classifier model names which will used creating the objects.\n\n        Returns:\n            None.\n    '
    train_skeleton_information = data_combiner(n_actions, train_subject_ids, n_takes, current_combination_modalities, skeleton_pose_model)
    validation_skeleton_information = data_combiner(n_actions, validation_subject_ids, n_takes, current_combination_modalities, skeleton_pose_model)
    test_skeleton_information = data_combiner(n_actions, test_subject_ids, n_takes, current_combination_modalities, skeleton_pose_model)
    metrics_features = ['accuracy_score', 'balanced_accuracy_score', 'precision_score', 'recall_score', 'f1_score']
    train_models_parameters_metrics = pd.DataFrame(columns=(['model_names', 'parameters'] + metrics_features))
    validation_models_parameters_metrics = pd.DataFrame(columns=(['model_names', 'parameters'] + metrics_features))
    test_models_parameters_metrics = pd.DataFrame(columns=(['model_names', 'parameters'] + metrics_features))
    combination_name = '_'.join((current_combination_modalities + [skeleton_pose_model]))
    for i in range(len(model_names)):
        parameters = retrieve_hyperparameters(model_names[i])
        parameters_grid = ParameterGrid(parameters)
        for j in range(len(parameters_grid)):
            current_parameters_grid_name = ', '.join(['{}={}'.format(k, parameters_grid[j][k]) for k in parameters_grid[j].keys()])
            (training_metrics, validation_metrics, test_metrics) = model_training_testing(train_skeleton_information, validation_skeleton_information, test_skeleton_information, model_names[i], parameters_grid[j])
            train_models_parameters_metrics = appends_parameter_metrics_combination(model_names[i], current_parameters_grid_name, training_metrics, train_models_parameters_metrics)
            validation_models_parameters_metrics = appends_parameter_metrics_combination(model_names[i], current_parameters_grid_name, validation_metrics, validation_models_parameters_metrics)
            test_models_parameters_metrics = appends_parameter_metrics_combination(model_names[i], current_parameters_grid_name, test_metrics, test_models_parameters_metrics)
            if (model_names[i] != 'gaussian_naive_bayes'):
                print('modality_combination={}, model={}, {} completed successfully.'.format(combination_name, model_names[i], current_parameters_grid_name))
            else:
                print('modality_combination={}, model={} completed successfully.'.format(combination_name, model_names[i]))
    per_combination_results_export('_'.join((current_combination_modalities + [skeleton_pose_model])), 'train_metrics', train_models_parameters_metrics)
    per_combination_results_export('_'.join((current_combination_modalities + [skeleton_pose_model])), 'validation_metrics', validation_models_parameters_metrics)
    per_combination_results_export('_'.join((current_combination_modalities + [skeleton_pose_model])), 'test_metrics', test_models_parameters_metrics)