|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- """
- 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 sys
-
- sys.path.append("../")
- 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
-
- 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_full.yml", help="config files"
- )
- parser.add_argument("--device", type=int, default=0, help="device to run on")
- parser.add_argument("--seed", type=int, default=0, help="random seed")
-
- args = parser.parse_args()
- if torch.cuda.is_available():
- 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)
- if args.dataset.startswith("imdb"):
- from autogl.module.feature.generators import PYGOneHotDegree
-
- # get max degree
- from torch_geometric.utils import degree
-
- max_degree = 0
- for data in dataset:
- deg_max = int(degree(data.edge_index[0], data.num_nodes).max().item())
- max_degree = max(max_degree, deg_max)
- dataset = PYGOneHotDegree(max_degree).fit_transform(dataset, inplace=False)
- elif args.dataset == "collab":
- from autogl.module.feature.auto_feature import Onlyconst
-
- dataset = Onlyconst().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
- predict_result = autoClassifier.predict_proba()
- print(
- "test acc %.4f"
- % (
- Acc.evaluate(
- predict_result,
- dataset.data.y[dataset.test_index].cpu().detach().numpy(),
- )
- )
- )
|