""" Example of graph classification on given datasets. This version use random split to only show the usage of AutoGraphClassifier. Refer to `graph_cv.py` for cross validation evaluation of the whole system following paper `A Fair Comparison of Graph Neural Networks for Graph Classification` """ import random import torch import numpy as np from autogl.datasets import build_dataset_from_name, utils from autogl.solver import AutoGraphClassifier from autogl.module import Acc from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter from autogl.backend import DependentBackend if DependentBackend.is_pyg(): from autogl.datasets.utils.conversion import to_pyg_dataset as convert_dataset else: from autogl.datasets.utils.conversion import to_dgl_dataset as convert_dataset backend = DependentBackend.get_backend_name() if __name__ == "__main__": parser = ArgumentParser( "auto graph classification", formatter_class=ArgumentDefaultsHelpFormatter ) parser.add_argument( "--dataset", default="mutag", type=str, help="graph classification dataset", choices=["mutag", "imdb-b", "imdb-m", "proteins", "collab"], ) parser.add_argument( "--configs", default="../configs/graphclf_gin_benchmark.yml", help="config files" ) parser.add_argument("--device", type=int, default=-1, help="device to run on, -1 means cpu") parser.add_argument("--seed", type=int, default=0, help="random seed") args = parser.parse_args() if args.device == -1: args.device = "cpu" if torch.cuda.is_available() and args.device != "cpu": torch.cuda.set_device(args.device) seed = args.seed # set random seed random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False dataset = build_dataset_from_name(args.dataset) _converted_dataset = convert_dataset(dataset) if args.dataset.startswith("imdb"): from autogl.module.feature import OneHotDegreeGenerator if DependentBackend.is_pyg(): from torch_geometric.utils import degree max_degree = 0 for data in _converted_dataset: deg_max = int(degree(data.edge_index[0], data.num_nodes).max().item()) max_degree = max(max_degree, deg_max) else: max_degree = 0 for data, _ in _converted_dataset: deg_max = data.in_degrees().max().item() max_degree = max(max_degree, deg_max) dataset = OneHotDegreeGenerator(max_degree).fit_transform(dataset, inplace=False) elif args.dataset == "collab": from autogl.module.feature._auto_feature import OnlyConstFeature dataset = OnlyConstFeature().fit_transform(dataset, inplace=False) utils.graph_random_splits(dataset, train_ratio=0.8, val_ratio=0.1, seed=args.seed) autoClassifier = AutoGraphClassifier.from_config(args.configs) # train autoClassifier.fit(dataset, evaluation_method=[Acc], seed=args.seed) autoClassifier.get_leaderboard().show() print("best single model:\n", autoClassifier.get_leaderboard().get_best_model(0)) # test acc = autoClassifier.evaluate(metric="acc") print("test acc {:.4f}".format(acc))