import logging
import pathlib
import time
import csv_space
import datatable
import numpy
from sklearn.metrics import accuracy_score
from utils import paths
from abd_clam import metric
from abd_clam.classification import classifier
from abd_clam.tests import synthetic_datasets
logging.basicConfig(
format="%(asctime)s - %(levelname)s - %(name)s - %(funcName)s - %(message)s",
datefmt="%d-%b-%y %H:%M:%S",
)
SYNTHETIC_DATA_DIR = paths.DATA_ROOT.joinpath("synthetic_data")
SYNTHETIC_DATA_DIR.mkdir(exist_ok=True)
BULLSEYE_TRAIN_PATH = SYNTHETIC_DATA_DIR.joinpath("bullseye_train.csv")
BULLSEYE_TEST_PATH = SYNTHETIC_DATA_DIR.joinpath("bullseye_test.csv")
FEATURE_COLUMNS = ["x", "y"]
LABEL_COLUMN = "label"
def make_bullseye(path: pathlib.Path, n: int, force: bool = False):
if not force and path.exists():
return
data, labels = synthetic_datasets.bullseye(n=n, num_rings=3, noise=0.10)
x = data[:, 0].astype(numpy.float32)
y = data[:, 1].astype(numpy.float32)
labels = numpy.asarray(labels, dtype=numpy.int8)
full = datatable.Frame({"x": x, "y": y, "label": labels})
full.to_csv(str(path))
return
def main():
bullseye_train = csv_space.CsvDataset(
BULLSEYE_TRAIN_PATH,
"bullseye_train",
labels=LABEL_COLUMN,
)
bullseye_spaces = [
csv_space.CsvSpace(bullseye_train, metric.ScipyMetric("euclidean"), False),
csv_space.CsvSpace(bullseye_train, metric.ScipyMetric("cityblock"), False),
]
start = time.perf_counter()
bullseye_classifier = classifier.Classifier(
bullseye_train.labels,
bullseye_spaces,
).build()
end = time.perf_counter()
build_time = end - start
bullseye_test = csv_space.CsvDataset(
BULLSEYE_TEST_PATH,
"bullseye_test",
labels=LABEL_COLUMN,
)
start = time.perf_counter()
predicted_labels, _ = bullseye_classifier.predict(bullseye_test)
end = time.perf_counter()
prediction_time = end - start
score = accuracy_score(bullseye_test.labels, predicted_labels)
print("Building the classifier for:")
print(f"\t{bullseye_train.cardinality} instances and")
print(f"\t{bullseye_classifier.unique_labels} unique labels")
print(f"\ttook {build_time:.2e} seconds.")
print("Predicting from the classifier for:")
print(f"\t{bullseye_test.cardinality} instances took")
print(f"\ttook {prediction_time:.2e} seconds.")
print(f"The accuracy score was {score:.3f}")
if __name__ == "__main__":
make_bullseye(BULLSEYE_TRAIN_PATH, n=1000, force=True)
make_bullseye(BULLSEYE_TEST_PATH, n=200, force=True)
main()