Files
wehub-resource-sync 593b94c120
pytest / Unit Tests (push) Has been cancelled
pytest / Integration (integration_tests_a) (push) Has been cancelled
pytest / Integration (integration_tests_b) (push) Has been cancelled
pytest / Integration (integration_tests_c) (push) Has been cancelled
pytest / Integration (integration_tests_d) (push) Has been cancelled
pytest / Integration (integration_tests_e) (push) Has been cancelled
pytest / Integration (integration_tests_f) (push) Has been cancelled
pytest / Integration (integration_tests_g) (push) Has been cancelled
pytest / Integration (integration_tests_h) (push) Has been cancelled
pytest / Integration (integration_tests_i) (push) Has been cancelled
pytest / Integration (integration_tests_j) (push) Has been cancelled
pytest / Distributed (distributed_a) (push) Has been cancelled
pytest / Distributed (distributed_b) (push) Has been cancelled
pytest / Distributed (distributed_c) (push) Has been cancelled
pytest / Distributed (distributed_d) (push) Has been cancelled
pytest / Distributed (distributed_e) (push) Has been cancelled
pytest / Distributed (distributed_f) (push) Has been cancelled
pytest / Minimal Install (push) Has been cancelled
pytest / Event File (push) Has been cancelled
pytest (slow) / py-slow (push) Has been cancelled
Publish JSON Schema / publish-schema (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:49:20 +08:00

1640 lines
60 KiB
Python

# Copyright (c) 2023 Predibase, Inc., 2019 Uber Technologies, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Integration tests for the visualization commands.
#
# Author: Ivaylo Stefanov
# email: ivaylo.stefanov82@gmail.com
# github: https://github.com/istefano82
# ==============================================================================
import glob
import json
import os
import random
import subprocess
import sys
import numpy as np
import pytest
from ludwig.constants import BATCH_SIZE, ENCODER, TRAINER, TYPE
from ludwig.experiment import experiment_cli
from ludwig.globals import DESCRIPTION_FILE_NAME, PREDICTIONS_PARQUET_FILE_NAME, TEST_STATISTICS_FILE_NAME
from ludwig.utils.data_utils import get_split_path
from ludwig.visualize import _extract_ground_truth_values
from tests.integration_tests.test_visualization_api import obtain_df_splits
from tests.integration_tests.utils import (
bag_feature,
binary_feature,
category_feature,
generate_data,
number_feature,
sequence_feature,
set_feature,
text_feature,
)
pytestmark = pytest.mark.integration_tests_g
def run_experiment_with_visualization(input_features, output_features, dataset):
"""Helper method to run an experiment with visualization enabled.
Does not garbage collect.
"""
output_directory = os.path.dirname(dataset)
config = {
"input_features": input_features,
"output_features": output_features,
"combiner": {"type": "concat", "output_size": 14},
TRAINER: {"epochs": 2, BATCH_SIZE: 128},
}
args = {
"config": config,
"skip_save_processed_input": False,
"skip_save_progress": False,
"skip_save_unprocessed_output": False,
"skip_save_eval_stats": False,
"dataset": dataset,
"output_directory": output_directory,
}
_, _, _, _, experiment_dir = experiment_cli(**args)
return experiment_dir
def get_output_feature_name(experiment_dir, output_feature=0):
"""Helper function to extract specified output feature name.
:param experiment_dir: Path to the experiment directory
:param output_feature: position of the output feature the description.json
:return output_feature_name: name of the first output feature name from the experiment
"""
description_file = os.path.join(experiment_dir, DESCRIPTION_FILE_NAME)
with open(description_file, "rb") as f:
content = json.load(f)
output_feature_name = content["config"]["output_features"][output_feature]["name"]
return output_feature_name
def test_visualization_learning_curves_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [text_feature(encoder={"type": "parallel_cnn"})]
output_features = [category_feature(output_feature=True)]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
input_features[0][ENCODER][TYPE] = "parallel_cnn"
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
train_stats = os.path.join(exp_dir_name, "training_statistics.json")
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"learning_curves",
"--training_statistics",
train_stats,
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(
command,
)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 4
def test_visualization_confusion_matrix_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [text_feature(encoder={"type": "parallel_cnn"})]
output_features = [category_feature(output_feature=True)]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
input_features[0][ENCODER][TYPE] = "parallel_cnn"
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth_metadata = experiment_source_data_name + ".meta.json"
test_stats = os.path.join(exp_dir_name, TEST_STATISTICS_FILE_NAME)
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"confusion_matrix",
"--test_statistics",
test_stats,
"--ground_truth_metadata",
ground_truth_metadata,
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 2
def test_visualization_compare_performance_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
Compare performance between two models. To reduce test complexity one model is compared to it self.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [text_feature(encoder={"type": "parallel_cnn"})]
output_features = [category_feature(output_feature=True)]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
input_features[0][ENCODER][TYPE] = "parallel_cnn"
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
test_stats = os.path.join(exp_dir_name, TEST_STATISTICS_FILE_NAME)
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_performance",
"--test_statistics",
test_stats,
test_stats,
"-m",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command, capture_output=True)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_from_prob_csv_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
Probabilities are loaded from csv file.
:param csv_filename: csv fixture from tests.fixtures.filenames.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = get_split_path(csv_filename)
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_performance_from_prob",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_from_prob_npy_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
Probabilities are loaded from npy file.
:param csv_filename: csv fixture from tests.fixtures.filenames.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_performance_from_prob",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_from_pred_npy_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
Predictions are loaded from npy file.
:param csv_filename: csv fixture from tests.fixtures.filenames.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
prediction = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
ground_truth_metadata = experiment_source_data_name + ".meta.json"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_performance_from_pred",
"--ground_truth_metadata",
ground_truth_metadata,
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--predictions",
prediction,
prediction,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_from_pred_csv_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
Predictions are loaded from csv file.
:param csv_filename: csv fixture from tests.fixtures.filenames.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
prediction = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
ground_truth_metadata = experiment_source_data_name + ".meta.json"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_performance_from_pred",
"--ground_truth_metadata",
ground_truth_metadata,
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--predictions",
prediction,
prediction,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_subset_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_performance_subset",
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"--ground_truth",
ground_truth,
"--top_n_classes",
"6",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_changing_k_output_pdf(csv_filename):
"""It should be possible to save figures as pdf in the specified directory."""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
ground_truth_metadata = exp_dir_name + "/model/training_set_metadata.json"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_performance_changing_k",
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
ground_truth_metadata,
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"--ground_truth",
ground_truth,
"--top_n_classes",
"6",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_multiclass_multimetric_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
test_stats = os.path.join(exp_dir_name, TEST_STATISTICS_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth_metadata = experiment_source_data_name + ".meta.json"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_multiclass_multimetric",
"--output_feature_name",
output_feature_name,
"--test_statistics",
test_stats,
test_stats,
"--ground_truth_metadata",
ground_truth_metadata,
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 4
def test_visualization_compare_classifiers_predictions_npy_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
Predictions are loaded form npy file.
:param csv_filename: csv fixture from tests.fixtures.filenames.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
prediction = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_predictions",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--predictions",
prediction,
prediction,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_compare_classifiers_predictions_csv_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
Predictions are loaded form csv file.
:param csv_filename: csv fixture from tests.fixtures.filenames.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
prediction = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_predictions",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--predictions",
prediction,
prediction,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_cmp_classifiers_predictions_distribution_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
prediction = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"compare_classifiers_predictions_distribution",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--predictions",
prediction,
prediction,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_cconfidence_thresholding_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"confidence_thresholding",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_confidence_thresholding_data_vs_acc_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"confidence_thresholding_data_vs_acc",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_confidence_thresholding_data_vs_acc_subset_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"confidence_thresholding_data_vs_acc_subset",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"--top_n_classes",
"3",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_vis_confidence_thresholding_data_vs_acc_subset_per_class_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 5}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"confidence_thresholding_data_vs_acc_subset_per_class",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"--top_n_classes",
"3",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
# 3 figures should be saved because experiment setting top_n_classes = 3
# hence one figure per class
assert len(figure_cnt) == 3
def test_vis_confidence_thresholding_2thresholds_2d_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [
text_feature(encoder={"vocab_size": 10, "min_len": 1, "type": "stacked_cnn"}),
number_feature(),
category_feature(encoder={"vocab_size": 10, "embedding_size": 5}),
set_feature(),
sequence_feature(encoder={"vocab_size": 10, "max_len": 10, "type": "embed"}),
]
output_features = [
category_feature(decoder={"vocab_size": 2}, reduce_input="sum"),
category_feature(decoder={"vocab_size": 2}, reduce_input="sum"),
]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
input_features[0][ENCODER][TYPE] = "parallel_cnn"
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
threshold_output_feature_name1 = get_output_feature_name(exp_dir_name)
threshold_output_feature_name2 = get_output_feature_name(exp_dir_name, output_feature=1)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"confidence_thresholding_2thresholds_2d",
"--ground_truth",
ground_truth,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
"--threshold_output_feature_names",
threshold_output_feature_name1,
threshold_output_feature_name2,
"--model_names",
"Model1",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(
command,
)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 3
def test_vis_confidence_thresholding_2thresholds_3d_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [
text_feature(encoder={"vocab_size": 10, "min_len": 1, "type": "stacked_cnn"}),
number_feature(),
category_feature(encoder={"vocab_size": 10, "embedding_size": 5}),
set_feature(),
sequence_feature(encoder={"vocab_size": 10, "max_len": 10, "type": "embed"}),
]
output_features = [
category_feature(decoder={"vocab_size": 2}, reduce_input="sum"),
category_feature(decoder={"vocab_size": 2}, reduce_input="sum"),
]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
input_features[0][ENCODER][TYPE] = "parallel_cnn"
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
threshold_output_feature_name1 = get_output_feature_name(exp_dir_name)
threshold_output_feature_name2 = get_output_feature_name(exp_dir_name, output_feature=1)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"confidence_thresholding_2thresholds_3d",
"--ground_truth",
ground_truth,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
"--threshold_output_feature_names",
threshold_output_feature_name1,
threshold_output_feature_name2,
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(
command,
)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
@pytest.mark.parametrize("binary_output_type", [True, False])
def test_visualization_binary_threshold_vs_metric_output_saved(csv_filename, binary_output_type):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [
text_feature(encoder={"vocab_size": 10, "min_len": 1, "type": "stacked_cnn"}),
number_feature(),
category_feature(encoder={"vocab_size": 10, "embedding_size": 5}),
set_feature(),
sequence_feature(encoder={"vocab_size": 10, "max_len": 10, "type": "embed"}),
]
if binary_output_type:
output_features = [binary_feature()]
else:
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
random.seed(1919)
rel_path = generate_data(input_features, output_features, csv_filename)
input_features[0][ENCODER][TYPE] = "parallel_cnn"
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"binary_threshold_vs_metric",
"--positive_label",
"1",
"--metrics",
"accuracy",
"precision",
"recall",
"f1",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 4
@pytest.mark.parametrize("binary_output_type", [True, False])
def test_visualization_precision_recall_curves_output_saved(csv_filename, binary_output_type):
"""Ensure pdf and png figures for precision recall curves from the experiments can be saved."""
input_features = [category_feature(encoder={"vocab_size": 10})]
if binary_output_type:
output_features = [binary_feature()]
else:
output_features = [category_feature(decoder={"vocab_size": 3}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename, num_examples=20)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"precision_recall_curves",
"--positive_label",
"1",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_precision_recall_curves_from_test_statistics_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [binary_feature(), bag_feature()]
output_features = [binary_feature()]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename, num_examples=20)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
test_stats = os.path.join(exp_dir_name, TEST_STATISTICS_FILE_NAME)
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"precision_recall_curves_from_test_statistics",
"--output_feature_name",
output_feature_name,
"--test_statistics",
test_stats,
"--model_names",
"Model1",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
@pytest.mark.parametrize("binary_output_type", [True, False])
def test_visualization_roc_curves_output_saved(csv_filename, binary_output_type):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
if binary_output_type:
output_features = [binary_feature()]
else:
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"roc_curves",
"--positive_label",
"1",
"--metrics",
"accuracy",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_roc_curves_from_test_statistics_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [binary_feature(), bag_feature()]
output_features = [binary_feature()]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
test_stats = os.path.join(exp_dir_name, TEST_STATISTICS_FILE_NAME)
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"roc_curves_from_test_statistics",
"--output_feature_name",
output_feature_name,
"--test_statistics",
test_stats,
"--model_names",
"Model1",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 1
def test_visualization_calibration_1_vs_all_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"calibration_1_vs_all",
"--metrics",
"accuracy",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"--top_k",
"6",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 5
def test_visualization_calibration_multiclass_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
probability = os.path.join(exp_dir_name, PREDICTIONS_PARQUET_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"calibration_multiclass",
"--ground_truth",
ground_truth,
"--output_feature_name",
output_feature_name,
"--split_file",
split_file,
"--ground_truth_metadata",
exp_dir_name + "/model/training_set_metadata.json",
"--probabilities",
probability,
probability,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 2
def test_visualization_frequency_vs_f1_output_saved(csv_filename):
"""Ensure pdf and png figures from the experiments can be saved.
:param csv_filename: csv fixture from tests.conftest.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
vis_output_pattern_pdf = os.path.join(exp_dir_name, "*.pdf")
vis_output_pattern_png = os.path.join(exp_dir_name, "*.png")
output_feature_name = get_output_feature_name(exp_dir_name)
test_stats = os.path.join(exp_dir_name, TEST_STATISTICS_FILE_NAME)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth_metadata = experiment_source_data_name + ".meta.json"
test_cmd_pdf = [
sys.executable,
"-m",
"ludwig.visualize",
"--visualization",
"frequency_vs_f1",
"--ground_truth_metadata",
ground_truth_metadata,
"--output_feature_name",
output_feature_name,
"--test_statistics",
test_stats,
test_stats,
"--model_names",
"Model1",
"Model2",
"-od",
exp_dir_name,
]
test_cmd_png = test_cmd_pdf.copy() + ["-ff", "png"]
commands = [test_cmd_pdf, test_cmd_png]
vis_patterns = [vis_output_pattern_pdf, vis_output_pattern_png]
for command, viz_pattern in zip(commands, vis_patterns):
result = subprocess.run(command)
figure_cnt = glob.glob(viz_pattern)
assert result.returncode == 0
assert len(figure_cnt) == 2
def test_load_ground_truth_split_from_df(csv_filename):
import pandas as pd
ground_truth = pd.DataFrame(
{
"PassengerId": [1],
"Survived": [0],
"Pclass": [3],
"Name": ["Braund, Mr. Owen Harris"],
"Sex": ["male"],
"Age": [22.0],
"SibSp": [1],
"Parch": [0],
"Ticket": ["A/5 21171"],
"Fare": ["7.25"],
"Cabin": [None],
"Embarked": ["S"],
"split": [0],
}
)
output_feature = "Survived"
ground_truth_train_split = _extract_ground_truth_values(ground_truth, output_feature, 0)
ground_truth_val_split = _extract_ground_truth_values(ground_truth, output_feature, 1)
ground_truth_test_split = _extract_ground_truth_values(ground_truth, output_feature, 2)
assert ground_truth_train_split.equals(pd.Series([0]))
assert ground_truth_val_split.empty
assert ground_truth_test_split.empty
def test_load_ground_truth_split_from_file(csv_filename):
"""Ensure correct ground truth split is loaded when ground_truth_split is given.
:param csv_filename: csv fixture from tests.fixtures.filenames.csv_filename
:return: None
"""
input_features = [category_feature(encoder={"vocab_size": 10})]
output_features = [category_feature(decoder={"vocab_size": 2}, reduce_input="sum")]
# Generate test data
rel_path = generate_data(input_features, output_features, csv_filename)
exp_dir_name = run_experiment_with_visualization(input_features, output_features, dataset=rel_path)
output_feature_name = get_output_feature_name(exp_dir_name)
experiment_source_data_name = csv_filename.split(".")[0]
ground_truth = experiment_source_data_name + ".csv"
split_file = experiment_source_data_name + ".split.parquet"
# retrieve ground truth from source data set
ground_truth_train_split = _extract_ground_truth_values(ground_truth, output_feature_name, 0, split_file)
ground_truth_val_split = _extract_ground_truth_values(ground_truth, output_feature_name, 1, split_file)
ground_truth_test_split = _extract_ground_truth_values(ground_truth, output_feature_name, 2, split_file)
test_df, train_df, val_df = obtain_df_splits(csv_filename)
target_predictions_from_train = train_df[output_feature_name]
target_predictions_from_val = val_df[output_feature_name]
target_predictions_from_test = test_df[output_feature_name]
assert np.all(ground_truth_train_split.eq(target_predictions_from_train))
assert np.all(ground_truth_val_split.eq(target_predictions_from_val))
assert np.all(ground_truth_test_split.eq(target_predictions_from_test))